教你快速搭建mongodb分片集群
环境准备
阿里云申请3台ECS,如下:
序号 | 内网IP | OS |
---|---|---|
A | 172.16.190.78 | CentOS 7.6 |
B | 172.16.242.36 | CentOS 7.6 |
C | 172.16.190.77 | CentOS 7.6 |
部署规划
Mongodb 分片集群节点分为三种类型:
- mongos 节点:处理客户端的连接,扮演存取路由器的角色,将请求分发到正确的数据节点上,对客户端屏蔽分片的概念;
- configsvr 节点:配置服务,保存数据结构的元数据,比如每个分片上的数据范围,数据块列表等;
- shard 节点:数据存储节点,每个分片存储部分全体数据,所有主分片的数据组成全体数据,每个主分片有其数据相同的副分片。
3台服务器组成 mongodb 集群,包含3个 mongos 节点,3个配置服务节点,数据分为3个分片,每个分片包含1个主节点与2个副节点。下表是具体规划,包含服务端口:
172.16.190.78 | 172.16.242.36 | 172.16.190.77 |
---|---|---|
mongos (27017) | mongos (27017) | mongos (27017) |
configsvr (28017) | configsvr (28017) | configsvr (28017) |
shard1 primary (29017) | shard1 secondary (29017) | shard1 secondary (29017) |
shard2 primary (29018) | shard2 secondary (29018) | shard2 secondary (29018) |
shard3 primary (29019) | shard3 secondary (29019) | shard3 secondary (29019) |
部署
安装
在3台服务器上都执行下面命令
1 | $ cd ~/software |
配置 configsvr 节点
在3台服务器上都添加 configsvr.conf 配置文件,并都启动 configsvr 节点,如下:
1 | $ vim ~/mongodb/config/configsvr.conf |
登录任意一台服务器,进行副本集的初始化
1 | $ mongo --port 28017 |
初始化成功后可以通过 rs.status() 查看状态
1 | mustone:PRIMARY> rs.status() |
配置 shard 节点
shard 节点本质上与 configsvr 节点是同样的,都是副本集的设置,只是部分配置不同,重点是副本集名称与角色名称不同。
在3台服务器上都执行下面操作:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26$ vim ~/mongodb/config/shard1.conf
# 内容如下
systemLog:
destination: file
logAppend: true
path: /home/dolphin/mongodb/log/shard1.log
storage:
dbPath: /home/dolphin/mongodb/data/shard1
journal:
enabled: true
processManagement:
fork: true
net:
port: 29017
bindIp: 0.0.0.0
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
# 启动节点
$ numactl --interleave=all mongod -f /home/dolphin/mongodb/config/shard1.conf
# 输出一下内容代表成功
about to fork child process, waiting until server is ready for connections.
forked process: 9905
child process started successfully, parent exiting
登录任意一台服务器,进行副本集的初始化
1 | $ mongo --port 29017 |
可以通过 rs.status() 查看副本集状态。
同理配置shard2、shard3,并进行副本集初始化。
配置 mongos 节点
在3台服务器上配置 mongos 配置文件:
1 | vim ~/mongodb/config/mongos.conf |
启动 mongos 节点:
1 | $ numactl --interleave=all mongos -f /home/dolphin/mongodb/config/mongos.conf |
启动分片
上述操作只是启动了4个副本集(1个configsvr,3个shard),如何将它们联系在一起,组成 mongodb 的分片机制呢?还需要启用分片。
在其中一台服务器登录 mongos 节点:
1 | $ mongo --port 27017 |
通过 sh.status() 查看状态
1 | mongos> sh.status() |
验证
总结下上面的步骤:
- 下载与解压部署包
- 创建 configsvr 配置文件,并启动 configsvr 节点,初始化 configsvr 副本集
- 创建 shard1 配置文件,并启动 shard1 节点,初始化 shard1 副本集
- 创建 shard2 配置文件,并启动 shard2 节点,初始化 shard2 副本集
- 创建 shard3 配置文件,并启动 shard3 节点,初始化 shard3 副本集
- 创建 mongos 配置文件,启动 mongos 节点。
- 启动分片。
完成后在每台服务器上查看进程,如下
1 | $ ps aux | grep mongo |
可以看到 mongos 为路由进程,configsvr 与 shard 都是 mongod 进程,本质都是 mongodb 的副本集,只是存的数据内容不同。configsvr 存的是集群元数据,shard 存的是业务数据。
虽然我们搭建的是分片集群,实际上只是提供了分片的能力。当用户往数据库中写数据时,默认是不分片存取的,而是全部存在某个shard副本集中。如果要分片存取,需要用户显式的指定。
如以下操作指定数据库 mustone 中的 myuser 集合进行分片存取,并指定片键为 _id。
1 | mongos> use admin |
配置后可以往该集合中写入多条数据,并登陆每个分片查看其中数据量,此处略。
再次通过 sh.status() 查看集群状态
1 | mongos> sh.status() |
可以看到数据库 mustone 的 partitioned 值为 true,并且详细列出了 myuser 集合的分片策略。
不明白 mongodb 的分片原理?没关系,等我。