Docker搭建高可用的mongodb副本集+分片(Replica Sets+Sharded Cluster)集群
一,前言
本文主要讲解如何通过docker制作高可用的mongodb副本集+分片(Replica Sets+Sharded Cluster)集群 ,采用各软件版本如下:
操作系统
centos7
docker
1.13.1
mongodb
4.0.0
robo3t
Robo 3T 1.1.1
二,目的
本文的目的很简单,使用三台物理机做数据库集群,任意一台宕机之后不会影响线上的业务运转。不会有任何的数据丢失。
三,架构
此次采用的是Replica Sets+Sharded Cluster的集群,具有高可用,故障转移,分布式存储等特性,这里我们采用三台物理机来搭建集群。架构图如下:
依上图所示我们此次集群配置如下:
- 三台物理机,每台物理机拥有完整的分片集群配置,都可独立运行
- 配置服务器:使用使用3个配置服务器确保元数据完整性。
- 路由(mongos)进程:使用3个路由进程实现平衡,提高客户端接入性能
- 3 个分片进程:Shard11,Shard12,Shard13 组成一个副本集,提供Sharding 中 Shard1 的功能。
- 3 个分片进程:Shard21,Shard22,Shard23 组成一个副本集,提供Sharding 中 Shard2 的功能。
构建一个 mongoDB Sharding Cluster 需要三种角色:shard 服务器(ShardServer)、配置服务器(config Server)、路由进程(Route Process)
Shard 服务器
shard 服务器即存储实际数据的分片,每个 shard 可以是一个 mongod 实例, 也可以是一组 mongod 实例构成的 Replica Sets.为了实现每个 Shard 内部的故障 自动转换,MongoDB 官方建议每个 shard 为一组 Replica Sets.
配置服务器
为了将一个特定的 collection 存储在多个 shard 中,需要为该 collection 指定 一个 shard key,决定该条记录属于哪个 chunk,配置服务器可以存储以下信息, 每个shard节点的配置信息,每个chunk的shard key范围,chunk在各shard 的分布情况,集群中所有 DB 和 collection 的 sharding 配置信息。
路由(mongos)进程
它是一个前段路由,客户端由此接入,首先询问配置服务器需要到哪个 shard 上查询或保存记录,然后连接相应的 shard 执行操作,最后将结果返回给客户端,客 户端只需要将原本发给 mongod 的查询或更新请求原封不动地发给路由进程,而 不必关心所操作的记录存储在哪个 shard 上。
四,准备工作
以三台机器网络互通为基础条件,需要在/home中创建四个文件夹,且每个文件夹都包含backup ,config,db三个文件夹,其中config文件夹中包含一个名为config.conf的空配置文件,结构如下:
1
2
3
4
5
6 1--backup
2--config
3 --config.conf
4--db
5
6
然后以以上文件夹结构为模板在三台物理机分别创建以下四个文件夹:
172.16.2.121:
1
2
3
4
5
6 1 mongos1
2 config-server1
3 shard11
4 shard21
5
6
172.16.2.122:
1
2
3
4
5
6 1 mongos2
2 config-server2
3 shard12
4 shard22
5
6
172.16.2.123:
1
2
3
4
5
6 1 mongos3
2 config-server3
3 shard13
4 shard23
5
6
五,创建配置服务器
分别在三台物理机进入括号内的文件夹执行以下命令:
172.16.2.121(/home/config-server1):
docker run –restart=always –privileged=true -p 10021:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d –name pro-file-server-config1 mongo:4.0.0 -f /etc/mongod/config.conf –configsvr –replSet "rs-file-server-config-server" –bind_ip_all
172.16.2.122(/home/config-server2):
docker run –restart=always –privileged=true -p 10022:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d –name pro-file-server-config2 mongo:4.0.0 -f /etc/mongod/config.conf –configsvr –replSet "rs-file-server-config-server" –bind_ip_all
172.16.2.123(/home/config-server3):
docker run –restart=always –privileged=true -p 10023:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d –name pro-file-server-config3 mongo:4.0.0 -f /etc/mongod/config.conf –configsvr –replSet "rs-file-server-config-server" –bind_ip_all
然后使用客户端连接到172.16.2.121:10021,执行以下命令初始化副本集
1
2
3
4
5
6
7
8
9
10
11 1rs.initiate({
2 _id: "rs-file-server-config-server",
3 configsvr: true,
4 members: [
5 { _id : 0, host : "172.16.2.121:10021" },
6 { _id : 1, host : "172.16.2.122:10022" },
7 { _id : 2, host : "172.16.2.123:10023" }
8 ]
9});
10
11
执行完毕之后执行rs.status()查看状态副本集是否成功。
六,创建Shard1分片服务器
分别在三台物理机进入括号内的文件夹执行以下命令:
172.16.2.121(/home/shard11):
docker run –restart=always –privileged=true -p 10031:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d –name pro-file-server-shard11 mongo:4.0.0 -f /etc/mongod/config.conf –shardsvr –replSet "rs-file-server-shard1-server" –bind_ip_all
172.16.2.122(/home/shard12):
docker run –restart=always –privileged=true -p 10032:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d –name pro-file-server-shard12 mongo:4.0.0 -f /etc/mongod/config.conf –shardsvr –replSet "rs-file-server-shard1-server" –bind_ip_all
172.16.2.123(/home/shard13):
docker run –restart=always –privileged=true -p 10033:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d –name pro-file-server-shard13 mongo:4.0.0 -f /etc/mongod/config.conf –shardsvr –replSet "rs-file-server-shard1-server" –bind_ip_all
然后使用客户端连接到172.16.2.121:10031,执行以下命令初始化副本集
1
2
3
4
5
6
7
8
9
10 1rs.initiate({
2 _id: "rs-file-server-shard1-server",
3 members: [
4 { _id : 0, host : "172.16.2.121:10031" },
5 { _id : 1, host : "172.16.2.122:10032" },
6 { _id : 2, host : "172.16.2.123:10033" }
7 ]
8});
9
10
执行完毕之后执行rs.status()查看状态副本集是否成功。
七,创建Shard2分片服务器
分别在三台物理机进入括号内的文件夹执行以下命令:
172.16.2.121(/home/shard21):
docker run –restart=always –privileged=true -p 10041:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d –name pro-file-server-shard21 mongo:4.0.0 -f /etc/mongod/config.conf –shardsvr –replSet "rs-file-server-shard2-server" –bind_ip_all
172.16.2.122(/home/shard22):
docker run –restart=always –privileged=true -p 10042:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d –name pro-file-server-shard22 mongo:4.0.0 -f /etc/mongod/config.conf –shardsvr –replSet "rs-file-server-shard2-server" –bind_ip_all
172.16.2.123(/home/shard23):
docker run –restart=always –privileged=true -p 10043:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d –name pro-file-server-shard23 mongo:4.0.0 -f /etc/mongod/config.conf –shardsvr –replSet "rs-file-server-shard2-server" –bind_ip_all
然后使用客户端连接到172.16.2.121:10041,执行以下命令初始化副本集
1
2
3
4
5
6
7
8
9
10 1rs.initiate({
2 _id: "rs-file-server-shard2-server",
3 members: [
4 { _id : 0, host : "172.16.2.121:10041" },
5 { _id : 1, host : "172.16.2.122:10042" },
6 { _id : 2, host : "172.16.2.123:10043" }
7 ]
8});
9
10
执行完毕之后执行rs.status()查看状态副本集是否成功。
八,创建mongos服务器
分别在三台物理机进入括号内的文件夹执行以下命令:
172.16.2.121(/home/mongos1):
docker run –restart=always –privileged=true -p 10011:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d –entrypoint mongos –name pro-file-server-mongos1 mongo:4.0.0 -f /etc/mongod/config.conf –configdb rs-file-server-config-server/172.16.2.121:10021,172.16.2.122:10022,172.16.2.123:10023 –bind_ip_all
172.16.2.122(/home/mongos2):
docker run –restart=always –privileged=true -p 10012:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d –entrypoint mongos –name pro-file-server-mongos2 mongo:4.0.0 -f /etc/mongod/config.conf –configdb rs-file-server-config-server/172.16.2.121:10021,172.16.2.122:10022,172.16.2.123:10023 –bind_ip_all
172.16.2.123(/home/mongos3):
docker run –restart=always –privileged=true -p 10013:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d –entrypoint mongos –name pro-file-server-mongos3 mongo:4.0.0 -f /etc/mongod/config.conf –configdb rs-file-server-config-server/172.16.2.121:10021,172.16.2.122:10022,172.16.2.123:10023 –bind_ip_all
确保mongos服务起来之后,连接到172.16.2.121:10011执行以下命令添加分片服务器信息
1
2
3
4 1sh.addShard("rs-file-server-shard1-server/172.16.2.121:10031,172.16.2.122:10032,172.16.2.123:10033")
2sh.addShard("rs-file-server-shard2-server/172.16.2.121:10041,172.16.2.122:10042,172.16.2.123:10043")
3
4
此时集群已经搭建完成了,让我们来测试一下,在172.16.2.121:10011创建一个test数据库,然后执行以下命令
1
2
3
4 1sh.enableSharding("test")
2sh.shardCollection("test.user", {"_id": "hashed" })
3
4
以上是将一个Collection加入分片,来让我们插入1000条数据试试看:
1
2
3
4 1use test
2for (i = 1; i <= 1000; i=i+1){db.user.insert({'userIndex': 1})}
3
4
插入完成之后可以在172.16.2.121:10011,172.16.2.122:10012,172.16.2.123:10013三台数据库下分别看到test数据库中名为user的Collection拥有一千条数据,使用以下代码查询记录数:
1
2
3 1db.getCollection('user').find({}).count()
2
3
结果为1000
现在可以连接到172.16.2.121:10031,172.16.2.121:10041上使用以上命令查询记录数,会发现两个数据库的记录数只和正好是1000
九,Spring boot连接
在application.yml配置即可访问mogos数据库:
1
2
3
4
5
6 1spring:
2 data :
3 mongodb :
4 uri: mongodb://172.16.2.121:10011,172.16.2.122:10012,172.16.2.123:10013/test
5
6
十,完结
到此为止我们已经成功建立了基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群。可以自己尝试着关掉一个物理机,来验证可用性。压力测试等等来验证此架构的性能。这里我不多做阐述。
如配置过程中有什么问题可以留言联系我。