环境:
三台CentOS7.6 最小安装,禁用SeLinux。
MongoDB 4.X:各版本下载列表:https://www.mongodb.org/dl/linux/x86_64
数据分片访问示意图:
分片中的角色,有三种:
① 配置服务器。是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,指定configsvr选项。
不需要太多的空间和资源,配置服务器的1KB空间相当于真实数据的200MB,保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。
② 路由服务器。即mongos,起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。
③ 分片服务器。是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器。
分片是以什么来分的?
1)以数据库来分,把数据库里的多个集合分到不同的分片上,同一个集合的数据只能在同一分片上。
2)以某个集合中的某个键来分,这个键称为片键,根据设置的片键把一个集合的数据分到不同的片上,这个分片键可以是多个键的组合键。
实际的生产环境
在一个实际的生产环境中会同时存在多个配置服务器,多个mongos路由进程,多个分片,每一个分片会是一个副本集。如下图所示:
因为config服务器、mongos路由进程和仲裁进程占用的资源非常少,所以可以通过不同的端口,把它们配置到同一台服务器上,一般是一台服务器上配置一个config服务器、一个路由进程、一个仲裁进程就够,如果是多个在同一台服务器,就成了单点故障。
最常见的做法是将mongos 实例和应用服务器部署在同一环境下,当然也可以将mongos 实例和分片节点放在一起,或者用专门的资源来运行它。
环境准备
受限于条件,本文用3台虚拟机实现2个分片集的搭建:
关闭SeLinux与防火墙:
$ systemctl disable firewalld && systemctl stop firewalld
$ sed -i ‘s/^SELINUX=.*/SELINUX=disabled/’ /etc/selinux/config
$ setenforce 0
配置时区与时间同步:
$ timedatectl set-timezone Asia/Shanghai
CentOS7默认已安装chrony服务,将之启用即可:
$ systemctl enable chronyd && systemctl start chronyd
系统参数设置:
MongoDB推荐关闭大内存页面,即设置transparent_hugepage=never:
$ grep GRUB_CMDLINE_LINUX /etc/default/grub
GRUB_CMDLINE_LINUX=“crashkernel=auto rhgb quiet transparent_hugepage=never”
$ grub2-mkconfig -o /boot/grub2/grub.cfg
$ shutdown -r now
安装mongodb:
$ wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-v4.0-latest.tgz
下载后解压,将二进制文件复制到/usr/local/mongodb,然后创建mongod用户,并设置/usr/local/mongodb的所有者为mongod。
或YUM安装:
$ cat > /etc/yum.repos.d/mongodb-org-4.0.repo <<EOF
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7Server/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF
这里可以修改 gpgcheck=0, 省去gpg验证。
$ yum makecache
$ yum install -y mongodb-org
以上在每台服务器上都要做,接下来分别部署config服务器和db分片集。
部署config服务器
以下除非特别说明,都是在第一台服务器(10.3.8.235)上执行部署操作。
配置到其余两台的ssh免密登录:
$ cd ~
$ ssh-keyen
$ ssh-copy-id 10.3.8.236
$ ssh-copy-id 10.3.8.237
生成server之间的认证key文件