MongoDB 4.2 分片集群搭建

1  部署结构

1.1   集群结构

典型的三分片Mongo集群如下图所示,包含三类组件:查询路由、配置服务器、分片。其中查询路由为mongos进程,配置服务器和分片都是mongod进程。配置服务器和分片都采取副本集(replica set)来确保可用性和健壮性,每个副本集最少包含三个节点。查询路由都是单实例运行,没有副本集机制,可根据需要增加实例数量,也可以在外部添加负载均衡。

《MongoDB 4.2 分片集群搭建》

上图中每个方框仅代表功能集合,不代表物理位置。实际部署时,为了避免单点故障,同一个副本集中的成员,应该部署在不同主机上。比如分片1的三个mongod进程应该运行在三台不同的主机上。

1.2   部署方案

《MongoDB 4.2 分片集群搭建》

副本集方案1(一主二从)

 

《MongoDB 4.2 分片集群搭建》

副本集方案2(一主一从一仲裁)

如上图所示,三成员的副本集方案有两种:一主二从、一主一从一仲裁。

对于方案1来说,每个成员都是数据节点,应该各自独占一台主机,这样三分片集群至少需要9台服务器(配置服务器和查询路由可以复用主机),之后每追加一个分片需要增加3台主机。具体部署情况如下图所示(同颜色的为一组,查询路由为MS,配置服务器为CS*):

《MongoDB 4.2 分片集群搭建》

 

对于方案2来说,有两个成员是数据节点,两外一个是投票节点(仲裁者),这样三分片集群只需要6台服务器(配置服务器和查询路由依旧复用主机,仲裁者与另一分片的数据节点部署在一台主机),之后每追加一个分片需要增加2台主机。具体部署情况如下图所示(同颜色的为一组,*a表示仲裁者,如Aa、Ba):

《MongoDB 4.2 分片集群搭建》

 

可以看出,分片副本集采取一主一从一仲裁方案,更加节省机器资源。结合Mongo分片集群一期部署所能使用的服务器数量为6台,选择第二种部署方案。

2  部署步骤

  1. 安装MongoDB:在所有主机上安装MongoDB
  2. 搭建分片集群:确定各组件节点分布,搭建分片集群
  3. 数据库初始化:创建需要的分片数据库和分片集合,并添加索引
  4. 数据迁移:将生产环境中的Mongo副本集的数据迁移到分片集群中
  5. 应用迁移:将相关应用从副本集迁移到分片集群

3  安装MongoDB

操作系统为: 64位CentOS 7

Mongo版本:linux-x86_64-rhel70-3.4.5

注意:所有主机安装的MongoDB版本应当一致。

3.1   检查安装环境

  • 确定NUMA已关闭

执行grep -i numa /var/log/dmesg,如果输出结果为:No NUMA configuration found,说明NUMA已禁用,否则通过BIOS将其关闭,或者使用numactl来启动mongod进程(安装方法见3.3)。

  • 确定kernel版本不低于2.6.36

执行uname -r,查看返回的版本号

  • 确定glibc版本不低于2.13

执行ldd –version(version前面两个减号),查看返回的版本号

  • 确定ulimit配置

执行ulimit -a,查看当前设置,官方推荐配置如下:

-f (file size): unlimited

 

-t (cpu time): unlimited

-v (virtual memory): unlimited

-n (open files): 64000

-m (memory size): unlimited

-u (processes/threads): 64000

主要需要确认的是最大文件数(-n),最大进程数(-u),调整方法如下:

  • 将最大文件数(-n)修改为64000

编辑/etc/security/limits.conf,写入以下两行

* soft nofile 64000

 

* hard nofile 64000

  • 将最大进程数(-u)修改为64000

编辑/etc/security/limits.d/20-nproc.conf,写入以下两行

*          soft    nproc     64000

 

*          hard    nproc     64000

配置完成后,重新打开终端确认是否生效。

 

  • 文件系统采取XFS

执行df -iT,确认主要分区为xfs。

《MongoDB 4.2 分片集群搭建》

 

  • 禁用Transparent Huge Pages

执行以下命令查看状态:

cat /sys/kernel/mm/transparent_hugepage/enabled

 

cat /sys/kernel/mm/transparent_hugepage/defrag

输出信息中方括号选中的为当前状态,如果为never表示禁用

《MongoDB 4.2 分片集群搭建》

如果不是never,通过执行以下命令禁用:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

 

echo never > /sys/kernel/mm/transparent_hugepage/defrag

上面的操作在系统重启后失效,可以通过设置开机禁用,执行crontab -e添加以下内容:

@reboot echo never > /sys/kernel/mm/transparent_hugepage/enabled

 

@reboot echo never > /sys/kernel/mm/transparent_hugepage/defrag

 

  • 数据库文件目录所在存储卷关闭atime

执行cat /etc/fstab,查看内容,通常如下所示:

《MongoDB 4.2 分片集群搭建》

注意每行的第三个配置,默认为defaults,修改准备存放库文件目录的卷,在defaults后面添加“,noatime,nodiratime”,例如放在/home目录下:

《MongoDB 4.2 分片集群搭建》

  • 禁用SELinux

执行sestatus查看状态,如果为disabled,或者permissive模式说明已禁用:

《MongoDB 4.2 分片集群搭建》

如果未禁用,可以执行setenforce 0来临时禁用。

想要永久禁用,需要修改/etc/selinux/config,将SELINUX修改为disabled或者permissive,需要重启系统生效。

如果不想关闭SELinux,可以用以下命令放行Mongo(运行在默认端口27017上):

semanage port -a -t mongod_port_t -p tcp 27017
  • 关闭防火墙

执行service firewall status查看防火墙状态,如果为inactive说明已关闭:

《MongoDB 4.2 分片集群搭建》

如果未关闭,执行service firewalld stop。

3.2   安装Mongo

  1. 下载安装包

访问官网https://www.mongodb.com/download-center,下载对应版本安装包(.tgz)

《MongoDB 4.2 分片集群搭建》

  1. 将安装包拷贝服务器上,例如/tmp目录下
  2. 打开终端进入安装包所在目录(/tmp),将其解压,会在目录下生成mongodb-***的目录
tar zxf mongodb-linux-x86_64-rhel70-3.4.5.tgz
  • 将解压后的目录拷贝到安装路径(例如/opt/mongodb),执行命令:
mv mongodb-linux-x86_64-rhel70-3.4.5 /opt/mongodb
  • 在环境变量PATH中添加二进制文件路径

MongoDB的二进制文件在Mongo安装路径的bin/目录下。可以通过修改PATH变量。

编辑shell的rc文件:

vi ~/.bashrc

在最后添加下面这行:

export PATH=/opt/mongodb/bin:$PATH

注意:此环境变量与仅对当前用户有效。

 

  • 验证安装成功

重新打开中断,输入命令:

mongo –version

如果显示以下信息,说明安装成功。

《MongoDB 4.2 分片集群搭建》

 

3.3   安装numactl

对于启用了NUMA的主机,如果无法通过BIOS关闭,可以安装numactl工具。

  • 下载rpm安装包

https://centos.pkgs.org/7/centos-x86_64/numactl-2.0.9-6.el7_2.x86_64.rpm.html

  • 将安装包拷贝到需要运行Mongo的主机上,然后执行命令
rpm -ivh numactl-2.0.9-6.el7_2.x86_64.rpm

显示以下信息说明安装成功。

《MongoDB 4.2 分片集群搭建》

 

3.4   安装bwm-ng

bwm-ng是监控网络带宽和磁盘IO的工具。它的官网是:http://www.gropp.org/,当前最新下载地址为:https://www.gropp.org/bwm-ng/bwm-ng-0.6.1.tar.gz,安装步骤如下:

  1. 下载安装包
  2. 将安装包拷贝到主机上(例如拷贝到/tmp/目录下)
  3. 将安装包解压:
tar zxvf bwm-ng-0.6.tar.gz
  • 进入解压后的目录并编译安装:
cd bwm-ng-0.6.1

 

./configure && make && make install

  • 检查是否安装成功,执行:
bwm-ng

正常会显示类似如下信息:

《MongoDB 4.2 分片集群搭建》

 

常用监控命令:

  • 监控网络带宽
bwm-ng -u bits -d

 

bwm-ng -u bytes -d

  • 监控磁盘IO
bwm-ng -u bytes -i disk

 

4   搭建分片集群

注意:分片集群中所有实例的Mongo版本应当一致。

4.1   分片集群规划

4.1.1  节点分配

以三分片集群为例,它包含15个进程节点,3个路由(mongos)、1个配置服务器副本集(3个mongod组成)、3个分片副本集(每个由3个mongod组成)。因为实际环境有6台主机(140-145),所以每个主机上需要运行不止一个进程。

对资源消耗比较大的是分片中的数据节点(主节点或从节点),每台主机上最好只运行一个数据节点,这样就只能有6个数据节点,平摊到每个分片有2个数据节点,所以每个分片采取1主(primary)1从(secondary)1仲裁(arbiter)的结构。

142、143、144服务器依次部署分片1、分片2、分片3的主节点;145、140、141服务器依次部署分片1、分片2、分片3的从节点。除了这六个节点,剩余3个路由节点、3个配置服务器节点和分片1-3的仲裁节点。

考虑到路由需要和配置服务器通信,所以路由和配置服务器两两部署在一起;另外路由与分片主节点通信也较多,所以就在每个分片主节点所在服务器上部署1个路由节点和1个配置服务器节点。这样142服务器上有分片1的主节点、1个路由节点、1个配置服务器节点;143服务器上有分片2的主节点、1个路由节点、1个配置服务器节点;144服务器上有分片3、1个路由节点、1个配置服务器节点。

至此还剩分片1-3的仲裁节点没有分配。考虑主机资源的均衡,将它们部署到从节点服务器上。同时为了避免单点故障(一个分片里同时挂掉两个节点),每个仲裁节点不放在相同分片的从节点主机上。这样145服务器上有分片1的从节点、分片3的仲裁节点;140服务器上有分片2的从节点、分片1个仲裁节点;142服务器上有分片3的从节点、分片2的仲裁节点。

这样三分片集群节点在6台服务器上的分配情况如下:

<

点赞
序号主机组件