1部署结构
1.1集群结构
典型的三分片Mongo集群如下图所示,包含三类组件:查询路由、配置服务器、分片。其中查询路由为mongos进程,配置服务器和分片都是mongod进程。配置服务器和分片都采取副本集(replica set)来确保可用性和健壮性,每个副本集最少包含三个节点。查询路由都是单实例运行,没有副本集机制,可根据需要增加实例数量,也可以在外部添加负载均衡。
文章图片
上图中每个方框仅代表功能集合,不代表物理位置。实际部署时,为了避免单点故障,同一个副本集中的成员,应该部署在不同主机上。比如分片1的三个mongod进程应该运行在三台不同的主机上。
1.2部署方案
文章图片
副本集方案1(一主二从)
文章图片
副本集方案2(一主一从一仲裁)
如上图所示,三成员的副本集方案有两种:一主二从、一主一从一仲裁。
对于方案1来说,每个成员都是数据节点,应该各自独占一台主机,这样三分片集群至少需要9台服务器(配置服务器和查询路由可以复用主机),之后每追加一个分片需要增加3台主机。具体部署情况如下图所示(同颜色的为一组,查询路由为MS,配置服务器为CS*):
文章图片
对于方案2来说,有两个成员是数据节点,两外一个是投票节点(仲裁者),这样三分片集群只需要6台服务器(配置服务器和查询路由依旧复用主机,仲裁者与另一分片的数据节点部署在一台主机),之后每追加一个分片需要增加2台主机。具体部署情况如下图所示(同颜色的为一组,*a表示仲裁者,如Aa、Ba):
文章图片
可以看出,分片副本集采取一主一从一仲裁方案,更加节省机器资源。结合Mongo分片集群一期部署所能使用的服务器数量为6台,选择第二种部署方案。
2部署步骤
- 安装MongoDB:在所有主机上安装MongoDB
- 搭建分片集群:确定各组件节点分布,搭建分片集群
- 数据库初始化:创建需要的分片数据库和分片集合,并添加索引
- 数据迁移:将生产环境中的Mongo副本集的数据迁移到分片集群中
- 应用迁移:将相关应用从副本集迁移到分片集群
操作系统为: 64位CentOS 7
Mongo版本:linux-x86_64-rhel70-3.4.5
注意:所有主机安装的MongoDB版本应当一致。
3.1检查安装环境
- 确定NUMA已关闭
- 确定kernel版本不低于2.6.36
- 确定glibc版本不低于2.13
- 确定ulimit配置
-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)修改为64000
* soft nofile 64000 * hard nofile 64000 |
- 将最大进程数(-u)修改为64000
*softnproc64000 *hardnproc64000 |
- 文件系统采取XFS
文章图片
- 禁用Transparent Huge Pages
cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag |
文章图片
如果不是never,通过执行以下命令禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag |
@reboot echo never > /sys/kernel/mm/transparent_hugepage/enabled @reboot echo never > /sys/kernel/mm/transparent_hugepage/defrag |
- 数据库文件目录所在存储卷关闭atime
文章图片
注意每行的第三个配置,默认为defaults,修改准备存放库文件目录的卷,在defaults后面添加“,noatime,nodiratime”,例如放在/home目录下:
文章图片
- 禁用SELinux
文章图片
如果未禁用,可以执行setenforce 0来临时禁用。
想要永久禁用,需要修改/etc/selinux/config,将SELINUX修改为disabled或者permissive,需要重启系统生效。
如果不想关闭SELinux,可以用以下命令放行Mongo(运行在默认端口27017上):
semanage port -a -t mongod_port_t -p tcp 27017 |
- 关闭防火墙
文章图片
如果未关闭,执行service firewalld stop。
3.2安装Mongo
- 下载安装包
文章图片
- 将安装包拷贝服务器上,例如/tmp目录下
- 打开终端进入安装包所在目录(/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中添加二进制文件路径
编辑shell的rc文件:
vi ~/.bashrc |
export PATH=/opt/mongodb/bin:$PATH |
- 验证安装成功
mongo –version |
文章图片
3.3安装numactl
对于启用了NUMA的主机,如果无法通过BIOS关闭,可以安装numactl工具。
- 下载rpm安装包
- 将安装包拷贝到需要运行Mongo的主机上,然后执行命令
rpm -ivh numactl-2.0.9-6.el7_2.x86_64.rpm |
文章图片
3.4安装bwm-ng
bwm-ng是监控网络带宽和磁盘IO的工具。它的官网是:http://www.gropp.org/,当前最新下载地址为:https://www.gropp.org/bwm-ng/bwm-ng-0.6.1.tar.gz,安装步骤如下:
- 下载安装包
- 将安装包拷贝到主机上(例如拷贝到/tmp/目录下)
- 将安装包解压:
tar zxvf bwm-ng-0.6.tar.gz |
- 进入解压后的目录并编译安装:
cd bwm-ng-0.6.1 ./configure && make && make install |
- 检查是否安装成功,执行:
bwm-ng |
文章图片
常用监控命令:
- 监控网络带宽
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台服务器上的分配情况如下:
序号 | 主机 | 组件 |
1 | 10.20.50.142 | 配置服务器-primary 分片1-primary 路由 |
2 | 10.20.50.143 | 配置服务器-secondary 分片2-primary 路由 |
3 | 10.20.50.144 | 配置服务器-secondary 分片3-primary 路由 |
4 | 10.20.50.145 | 分片1-secondary 分片3- arbiter |
5 | 10.20.50.140 | 分片2-secondary 分片1- arbiter |
6 | 10.20.50.141 | 分片3-secondary 分片2- arbiter |
- 端口规划
因为MongoDB的默认端口是27017,每台主机可以有一个实例使用该端口,考虑到集群搭建过程中的便利性(不需要指定端口),所以将27017端口分配给每台主机上的数据节点(分片的主节点或从节点)。145、140、141主机上还有的仲裁节点,分配相同的28017端口。142、143、144主机上还有配置服务器节点和路由节点,也考虑根据类型分别分配相同端口,配置服务器分配28018端口,路由分配29017端口。
至此端口分配完成
序号 | 主机 | 组件 |
1 | 10.20.50.142 | 分片1-primary(27017) 配置服务器-primary(28017) 路由(29017) |
2 | 10.20.50.143 | 分片2-primary(27017) 配置服务器-secondary(28017) 路由(29017) |
3 | 10.20.50.144 | 分片3-primary(27017) 配置服务器-secondary(28017) 路由(29017) |
4 | 10.20.50.145 | 分片1-secondary(27017) 分片3- arbiter(28017) |
5 | 10.20.50.140 | 分片2-secondary(27017) 分片1- arbiter(28017) |
6 | 10.20.50.141 | 分片3-secondary(27017) 分片2- arbiter(28017) |
- 路径和磁盘规划
至于运行根目录,考虑到数据节点需要使用大量磁盘资源,所以应该选择磁盘容量最大的分区。例如,如果所有磁盘划分在根分区下(/),运行根目录就选择/var/mongodb/(var目录一般用来存储运行数据,如数据库文件等),如果磁盘主要划分在home分区(/home),下就选择/home/var/mongodb/。
以所有磁盘划分在根分区为例,配置服务器的运行目录为/var/mongodb/confsrv/,路由的运行目录为/var/mongodb/router/,分片的运行目录为/var/mongodb/shard1/、/var/mongodb/shard2/、/var/mongodb/shard3/。每个节点的配置文件、日志文件、PID文件都输出到运行目录中。另外除了路由节点之外,其余节点都需要存储数据,所以都在运行目录下创建dbpath文件夹作为数据目录。
至此各个节点的运行路径就划分完成,如下表所示:
序号 | 组件 | IP | 运行目录 | 数据目录 |
1 | 配置服务器 primary |
10.20.50.142 | /var/mongodb/confsrv/ | /var/mongodb/confsrv/dbpath/ |
2 | 配置服务器 secondary |
10.20.50.143 | /var/mongodb/confsrv/ | /var/mongodb/confsrv/dbpath/ |
3 | 配置服务器 secondary |
10.20.50.144 | /var/mongodb/confsrv/ | /var/mongodb/confsrv/dbpath/ |
4 | 分片1 primary |
10.20.50.142 | /var/mongodb/shard1/ | /var/mongodb/shard1/dbpath/ |
5 | 分片1 secondary |
10.20.50.145 | /var/mongodb/shard1/ | /var/mongodb/shard1/dbpath/ |
6 | 分片1 arbiter |
10.20.50.140 | /var/mongodb/shard1/ | /var/mongodb/shard1/dbpath/ |
7 | 分片2 primary |
10.20.50.143 | /var/mongodb/shard2/ | /var/mongodb/shard2/dbpath/ |
8 | 分片2 secondary |
10.20.50.140 | /var/mongodb/shard2/ | /var/mongodb/shard2/dbpath/ |
9 | 分片2 arbiter |
10.20.50.141 | /var/mongodb/shard2/ | /var/mongodb/shard2/dbpath/ |
10 | 分片3 primary |
10.20.50.144 | /var/mongodb/shard3/ | /var/mongodb/shard3/dbpath/ |
11 | 分片3 secondary |
10.20.50.141 | /var/mongodb/shard3/ | /var/mongodb/shard3/dbpath/ |
12 | 分片3 arbiter |
10.20.50.145 | /var/mongodb/shard3/ | /var/mongodb/shard3/dbpath/ |
13 | 路由 | 10.20.50.142 | /var/mongodb/router/ | 无 |
14 | 路由 | 10.20.50.143 | /var/mongodb/router/ | 无 |
15 | 路由 | 10.20.50.144 | /var/mongodb/router/ | 无 |
4.1.3集群规划清单
根据前两节的分析,对集群中各组件的最终规划如下:
序号 | 组件 | IP | Port | 副本集名称 | 进程 | 运行目录 |
1 | 配置服务器 primary |
10.20.50.142 | 28017 | confsrv | mongod | /var/mongodb/confsrv/ |
2 | 配置服务器 secondary |
10.20.50.143 | 28017 | confsrv | mongod | /var/mongodb/confsrv/ |
3 | 配置服务器 secondary |
10.20.50.144 | 28017 | confsrv | mongod | /var/mongodb/confsrv/ |
4 | 分片1 primary |
10.20.50.142 | 27017 | shard1 | mongod | /var/mongodb/shard1/ |
5 | 分片1 secondary |
10.20.50.145 | 27017 | shard1 | mongod | /var/mongodb/shard1/ |
6 | 分片1 arbiter |
10.20.50.140 | 28017 | shard1 | mongod | /var/mongodb/shard1/ |
7 | 分片2 primary |
10.20.50.143 | 27017 | shard2 | mongod | /var/mongodb/shard2/ |
8 | 分片2 secondary |
10.20.50.140 | 27017 | shard2 | mongod | /var/mongodb/shard2/ |
9 | 分片2 arbiter |
10.20.50.141 | 28017 | shard2 | mongod | /var/mongodb/shard2/ |
10 | 分片3 primary |
10.20.50.144 | 27017 | shard3 | mongod | /var/mongodb/shard3/ |
11 | 分片3 secondary |
10.20.50.141 | 27017 | shard3 | mongod | /var/mongodb/shard3/ |
12 | 分片3 arbiter |
10.20.50.145 | 28017 | shard3 | mongod | /var/mongodb/shard3/ |
13 | 路由 | 10.20.50.142 | 29017 | 无 | mongos | /var/mongodb/router/ |
14 | 路由 | 10.20.50.143 | 29017 | 无 | mongos | /var/mongodb/router/ |
15 | 路由 | 10.20.50.144 | 29017 | 无 | mongos | /var/mongodb/router/ |
各台主机上部署的组件清单如下:
序号 | 主机 | 组件 |
1 | 10.20.50.142 | 配置服务器-primary(28017) 分片1-primary(27017) 路由(29017) |
2 | 10.20.50.143 | 配置服务器-secondary(28017) 分片2-primary(27017) 路由(29017) |
3 | 10.20.50.144 | 配置服务器-secondary(28017) 分片3-primary(27017) 路由(29017) |
4 | 10.20.50.145 | 分片1-secondary(27017) 分片3- arbiter(28017) |
5 | 10.20.50.140 | 分片2-secondary(27017) 分片1- arbiter(28017) |
6 | 10.20.50.141 | 分片3-secondary(27017) 分片2- arbiter(28017) |
4.2创建配置服务器
- 创建运行目录
mkdir -p /var/mongodb/confsrv/dbpath/ |
- 创建配置文件
sharding: clusterRole: configsvr replication: replSetName: confsrv oplogSizeMB: 10240 systemLog: destination: file path: /var/mongodb/confsrv/mongod-cs.log logAppend: true net: port: 28017 storage: dbPath: /var/mongodb/confsrv/dbpath/ directoryPerDB: true processManagement: fork: true pidFilePath: /var/mongodb/confsrv/mongod-cs.pid |
注意:配置中所有冒号后面必须增加空格
- 启动mongod实例
mongod –config /var/mongodb/confsrv/mongod-cs.cnf |
numactl –interleave=all mongod –config /var/mongodb/confsrv/mongod-cs.cnf |
注意:确保在三个配置服务器节点上(142、143、144)均完成上述步骤。
- 连接并初始化
mongo –port 28017 |
rs.initiate( { _id: “confsrv”, configsvr: true, members: [ { _id : 0, host : “10.20.50.142:28017” }, { _id : 1, host : “10.20.50.143:28017” }, { _id : 2, host : “10.20.50.144:28017” } ] } ) |
这样一主二从的配置服务器副本集就搭建完成。
查看副本集配置,执行:
rs.conf() |
rs.status() |
- 添加副本集成员(可选)
rs.add(“:“) |
注:配置完成后优先确认网络通畅,防火墙关闭或端口不被屏蔽,如果中间有操作错误,可以使用如下命令进行重新配置:
conf = { _id: “confsrv”, configsvr: true, members: [ { _id : 0, host : “10.20.50.140:28017” }, { _id : 1, host : “10.20.50.141:28017” }, { _id : 2, host : “10.20.50.142:28017” } ] } 回车 rs.initiate(conf,{force:true})//已经运行的系统此命令不建议使用 |
4.3创建分片
- 创建运行目录
mkdir -p /var/mongodb/shard1/dbpath/ |
- 创建配置文件
sharding: clusterRole: shardsvr replication: replSetName: shard1 oplogSizeMB: 10240 systemLog: destination: file path: /var/mongodb/shard1/mongod-sh.log logAppend: true net: port: 27017 storage: dbPath: /var/mongodb/shard1/dbpath/ directoryPerDB: true processManagement: fork: true pidFilePath: /var/mongodb/shard1/mongod-sh.pid |
- 启动mongod实例
mongod –config /var/mongodb/shard1/mongod-sh.cnf |
numactl –interleave=all mongod –config /var/mongodb/shard1/mongod-sh.cnf |
在145服务器上完成以上步骤,在140服务器也完成以上步骤(注意:根据规划,需要将配置文件中的端口改为28017)
- 连接并初始化
mongo –port 27017 或者 mongo |
rs.initiate( { _id: “shard1”, members: [ { _id : 0, host : “10.20.50.142”, priority: 10 }, { _id : 1, host : “10.20.50.145”, priority:5 } ] } ) |
rs.addArb(“10.20.50.140:28017”) |
查看副本集配置,执行:
rs.conf() |
rs.status() |
- 添加副本集成员(可选)
rs.add(“:“) |
- 按照1-5步,分别创建分片2副本集(143、140、141)和分片3副本集(144、141、145)
sharding: clusterRole: shardsvr replication: replSetName: shard2 oplogSizeMB: 10240 systemLog: destination: file path: /var/mongodb/shard2/mongod-sh.log logAppend: true net: port: 27017 storage: dbPath: /var/mongodb/shard2/dbpath/ directoryPerDB: true processManagement: fork: true pidFilePath: /var/mongodb/shard2/mongod-sh.pid |
sharding: clusterRole: shardsvr replication: replSetName: shard3 oplogSizeMB: 10240 systemLog: destination: file path: /var/mongodb/shard3/mongod-sh.log logAppend: true net: port: 27017 storage: dbPath: /var/mongodb/shard3/dbpath/ directoryPerDB: true processManagement: fork: true pidFilePath: /var/mongodb/shard3/mongod-sh.pid |
4.4创建查询路由
- 创建运行目录
mkdir -p /var/mongodb/router/ |
- 创建配置文件
sharding: configDB: confsrv/10.20.50.142:28017,10.20.50.143:28017,10.20.50.144:28017 systemLog: destination: file path: /var/mongodb/router/mongos.log logAppend: true net: port: 29017 processManagement: fork: true pidFilePath: /var/mongodb/router/mongos.pid |
- 启动mongos实例(注意:这里是mongos,而上面都是mongod)
mongos –config /var/mongodb/router/mongos.cnf |
- 在143、144上重复上述步骤
4.5添加分片
在142上(143、144也行)使用mongo shell连接mongos实例,执行:
mongo –port 29017 |
sh.addShard( “shard1/10.20.50.142:27017”) sh.addShard( “shard2/10.20.50.143:27017”) sh.addShard( “shard3/10.20.50.144:27017”) |
sh.status() |
shards: {“_id” : “shard1”,“host” : “shard1/10.20.50.142:27017,10.20.50.145:27017”,“state” : 1 } {“_id” : “shard2”,“host” : “shard2/10.20.50.143:27017,10.20.50.140:27017”,“state” : 1 } {“_id” : “shard3”,“host” : “shard3/10.20.50.144:27017,10.20.50.141:27017”,“state” : 1 } |
4.6设置开机启动
通过crontab将分片集群各组件设置为开机启动,以142主机为例,具体操作如下:
- 编辑crontab,执行:
crontab -e |
- 在打开的crontab文件中末尾追加以下内容:
@reboot /opt/mongodb/bin/mongod –config /var/mongodb/confsrv/mongod-cs.cnf @reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard1/mongod-sh.cnf @reboot /opt/mongodb/bin/mongos –config /var/mongodb/router/mongos.cnf |
@reboot /opt/mongodb/bin/mongod –config /var/mongodb/confsrv/mongod-cs.cnf @reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard2/mongod-sh.cnf @reboot /opt/mongodb/bin/mongos –config /var/mongodb/router/mongos.cnf |
@reboot /opt/mongodb/bin/mongod –config /var/mongodb/confsrv/mongod-cs.cnf @reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard3/mongod-sh.cnf @reboot /opt/mongodb/bin/mongos –config /var/mongodb/router/mongos.cnf |
@reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard1/mongod-sh.cnf @reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard3/mongod-sh.cnf |
@reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard2/mongod-sh.cnf @reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard1/mongod-sh.cnf |
@reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard3/mongod-sh.cnf 【数据库技术|MongoDB 4.2 分片集群搭建】@reboot /opt/mongodb/bin/mongod –config /var/mongodb/shard2/mongod-sh.cnf |
推荐阅读
- 数据库|linux系统mongodb 分片集群搭建
- mongodb|mongodb分片集群搭建
- db|MongoDB的分片集群搭建
- 数据库|微信小程序·云开发 云数据库的使用教程
- 线上活动| 如何运用 MongoDB 可调一致性(报名直播技术大佬带你了解!)
- 数据库|Navicat Premium操作Mongodb(基本的增删改查)
- Java进阶之路|好用到爆,GitHub 星标 32.5k+的命令行软件管理神器,功能真强大
- 活动报名 | MongoDB 5.0 时序存储特性介绍
- Mongodb 唯一索引