目前MongoDB官网推荐的集群方式,主要有两种:Replication(复制)和Sharding(分片)。他们的具体实现分别是 ReplicaSet(副本集)和 Sharded Cluster(分片集群)。在实际生产中,分片集群使用更加广泛,所以本文也主要讲解 Sharded Cluster(分片集群)的搭建过程。
下图是MongoDB官网推荐的分片集群架构。
按照官网要求,分片集群需要三种角色:
Shard 分片: mongod 实例,用于存储业务数据。用于生产的分片集群,要求至少有两个分片,每个分片采用副本集方式,那么分片至少需要6个mongod实例。
Config Servers 配置服务: mongod 实例,存储集群的元数据。必须实现副本集,可以是1个或3个mongod实例。小编注:即便是1个mongod实例,也要实现副本集,否则会报错。
Router 路由: mongos 实例,前端路由及负载均衡,客户端接入入口,为了防止路由单点,至少需要2个mongos实例。
本例一共启动了11个Docker容器,来完整实现这套分片集群。下面就来讲述一下整个集群的搭建过程:
Step 1 下载 MongoDB 镜像
对于有一定Docker基础的同学,这一步没啥要说的
Step 2 搭建 Config Servers 副本集
1、创建mongoconfig1 容器
挂载的启动参数文件configserver.conf内容如下:
# 默认只能本机访问,修改后可以允许任何IP访问
bind_ip=0.0.0.0
# 创建副本集并命名副本集名称
replSet=configserver
# 此项必须设置,否则无法将此服务配置为config servers
configsvr=true
注:configsvr的默认端口是27019
2、创建mongoconfig2和mongoconfig3容器
3、配置config servers副本集
1) 进入任意一个mongoconfig容器,本例进入的是mongoconfig1
2) 链接mongo
3) 使用admin数据库
4) 定义副本集配置信息
注意:_id配置信息要与configserver.conf中replSet的配置信息保持一致
5) 初始化副本集配置
rs.initiate(config);
6) 检查config servers 配置结果
rs.status();
Step 3 搭建 Shard 副本集
本文创建2组分片,共6个Docker容器
mongoshard1_1(shard1 primary),
mongoshard1_2(shard1 secondary),
mongoshard1_3(shard1 arbiter)
mongoshard2_1(shard2 primary),
mongoshard2_2(shard2 secondary),
mongoshard2_3(shard2 arbiter)
1、创建mongoshard1_1容器
挂载的启动参数文件shard1.conf内容如下:
# 默认只能本机访问,修改后可以允许任何IP访问
bind_ip=0.0.0.0
# 创建副本集并命名副本集名称
replSet=shard1
# 此项必须设置,否则无法将此服务配置为shard servers
shardsvr=true
注:shardsvr的默认端口是27018
2、创建mongoshard1_2和mongoshard1_3容器
3、配置shard1副本集
1) 任意进入一个shard1容器,本例进入的是mongoshard1_1容器
2) 链接mongo
3) 使用admin数据库
4) 定义副本集配置信息
priority优先级,数值越大,优先级越高。arbiterOnly设置仲裁者,必须指定的参数,否则会报错。
注意:和config server一样,_id配置信息要与shard1.conf中replSet的配置信息保持一致
5) 初始化shard1副本集配置
rs.initiate(config);
6) 检查shard1副本集状态
rs.status();
检查的地方可以查考config servers副本集
Step 4 搭建shard2副本集
小编这里只讲述shard1副本集的搭建,shard2的搭建就不罗列了。
否则文章就太长太啰嗦了,读者也没有耐性读下去了。
不过,读者能读到这里,小编已经觉得同学你是一个很有耐性的人了,小编也相信,只要shard1能搭建成功,对于shard2的搭建应该不是什么问题了。
Step 5 搭建路由服务mongos
按照官网的建议(1 or more Routers),那么只要配置一台即可。但由于路由服务mongos,是整个分片集群的对外接口。为了整个集群的高可用,不能让mongos成为单点。所以,小编这里配置两台mongos。
1、创建mongos1容器
挂载的启动参数文件mongos.conf内容如下:
# 默认只能本机访问,修改后可以允许任何IP访问
bind_ip=0.0.0.0
# 指定配置服务,格式为host:port,多个服务用逗号连接,configserver为配置服务副本集名称
configdb=configserver/mongoconfig1:27019,mongoconfig2:27019,mongoconfig3:27019
2、创建mongos2容器
configdb配置,将config servers与mongos联系在了一起,那么shard servers与mongos是怎么建立关联的呢?
3、将分片副本集加入到分片集群
1) 任意进入一个mongos容器,本例进入的是mongo1容器
2) 链接mongo
3) 使用admin数据库
4) 将shard1分片、shard2分片加入到集群
5) 为测试数据库chuanlu开启分片功能
sh.enableSharding("chuanlu")
6) 为数据库chuanlu的goods集合开启分片功能
sh.shardCollection("chuanlu.goods",{"_id":1});
测试可行结果
1) 使用chuanlu数据库
use chuanlu;
2) 往goods集合插入2579571条测试数据(数据量小的话,数据都散列在一个分片上,看不出分片效果,小编亲测,200万以上数据,才开始看到分片效果)
3) 查看goods分片状况
db.goods.stats();
可以看到shard2分片数据量 1204622,shard1分片数据量1374949,两个分片的总数据量2579571。刚好是插入的数量。
测试运行通过。
结束
领取专属 10元无门槛券
私享最新 技术干货