教你快速搭建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 节点:数据存储节点,每个分片存储部分全体数据,所有主分片的数据组成全体数据,每个主分片有其数据相同的副分片。
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 |
$ vim ~/mongodb/config/shard1.conf |
登录任意一台服务器,进行副本集的初始化
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 集合的分片策略。