用了11个Docker容器搭建的最精简的分片集群

目前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。刚好是插入的数量。

测试运行通过。

结束

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190101A12XVY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券