基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群
目标
使用三台物理机做数据库集群任意一台宕机之后不会影响线上的业务运转
不会有任何的数据丢失
方案
采用的是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 上。
实施
目前我在自己电脑上搭建该环境即就一台物理机
先规划下端口分配
mongos1 mongos2 mongos3 10011 10012 10013 config1 config2 config3 10021 10022 10023 share11 share12 share13 10031 10032 10033 share21 share22 share23 10041 10042 10043
文件目录
先创建一个如下的目录结果
mengfaniaodeMBP:third_software mengfanxiao$ tree mongodb/
mongodb/
├── node1
│ ├── config-server1
│ │ ├── backup
│ │ ├── config
│ │ │ └── config.conf
│ │ └── db
│ ├── mongos1
│ │ ├── backup
│ │ ├── config
│ │ │ └── config.conf
│ │ └── db
│ ├── shard11
│ │ ├── backup
│ │ ├── config
│ │ │ └── config.conf
│ │ └── db
│ └── shard21
│ ├── backup
│ ├── config
│ │ └── config.conf
│ └── db
├── node2
│ ├── config-server2
│ │ ├── backup
│ │ ├── config
│ │ │ └── config.conf
│ │ └── db
│ ├── mongos2
│ │ ├── backup
│ │ ├── config
│ │ │ └── config.conf
│ │ └── db
│ ├── shard12
│ │ ├── backup
│ │ ├── config
│ │ │ └── config.conf
│ │ └── db
│ └── shard22
│ ├── backup
│ ├── config
│ │ └── config.conf
│ └── db
└── node3
├── config
├── config-server3
│ ├── backup
│ ├── config
│ │ └── config.conf
│ └── db
├── db
├── mongos3
│ ├── backup
│ ├── config
│ │ └── config.conf
│ └── db
├── shard13
│ ├── backup
│ ├── config
│ │ └── config.conf
│ └── db
└── shard23
├── backup
├── config
│ └── config.conf
└── db
如果3台物理机的话 把对应的node1 node2 node3复制过去即可
配置服务
配置服务1
node1/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
配置服务2
node2/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
配置服务3
node3/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
将3个配置服务关联到一起
使用mongodb客户端连接
mongo 192.168.50.100:10021
这里的客户端是我在本地另外又安装了一个mongodb 我这里是mac安装mongod方式 非mac 请跳过
a、切换brew安装库
brew tap mongodb/brew
b、安装mongodb社区版
brew install mongodb-community
c、启动、停止
brew services start mongodb-community
brew services stop mongodb-community
初始化配置
rs.initiate({ _id: "rs-file-server-config-server",
configsvr: true,
members: [
{ _id : 0,host : "192.168.50.100:10021" },
{ _id : 1,host : "192.168.50.100:10022" },
{ _id : 2, host : "192.168.50.100:10023" }
]
});
注意这里一定要用服务器ip 不要用127.0.0.1
查看配置结果
rs.status()
分片服务集群1
分片服务share11
cd node1/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
分片服务share12
cd node2/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
分片服务share13
cd node1/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
将分片服务11、12、13关联起来 作为分片服务集群1
mongodb客户端连接11
mongo 127.0.0.1:10031
配置
rs.initiate({ _id: "rs-file-server-shard1-server",
members: [
{ _id : 0, host : "192.168.50.100:10031" },
{ _id : 1, host : "192.168.50.100:10032" },
{ _id : 2, host : "192.168.50.100:10033" }
]
});
分片备份服务集群2
分片服务share21
cd node1/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
分片服务share22
node2/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
分片服务share23
cd node3/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
关联下share21、share22、share23
通过客户端连接
mongo 127.0.0.1:10041
配置
rs.initiate({ _id: "rs-file-server-shard2-server",
members: [
{ _id : 0, host : "192.168.50.100:10041" },
{ _id : 1, host : "192.168.50.100:10042" },
{ _id : 2, host : "192.168.50.100:10043" }
]
});
mongod服务
安装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/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all
安装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/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all
安装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/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all
配置
mongodb客户端连接
mongo 127.0.0.1:10011
配置
sh.addShard("rs-file-server-shard1-server/192.168.50.100:10031,192.168.50.100:10032,192.168.50.100:10033")
sh.addShard("rs-file-server-shard2-server/192.168.50.100:10041,192.168.50.100:10042,192.168.50.100:10043")
测试
mongodb客户端连接
mongo 127.0.0.1:10011
创建分片数据库test
sh.enableSharding("test")
将collection加入分片并设置分片字段
sh.shardCollection("test.user", {"_id": "hashed" })
插入1000条数据
a、切换分片库
use test
b、循环插入
for (i = 1; i <= 1000; i=i+1){db.user.insert({'userIndex': 1})}
确认数据
a、查看备份库 每个备份库都是1000
插入完成之后可以在127.0.0.1:10011,127.0.0.1:10012,127.0.0.1:10013
三台数据库下分别看到test数据库中名为user的Collection拥有一千条数据,
使用以下代码查询记录数
db.getCollection('user').find({}).count()
结果为1000
b、查看分片库 每个分片库之和为1000
现在可以连接到127.0.0.1:10031,127.0.0.1:10041上使用以上命令查询记录数,
会发现两个数据库的记录数只和正好是1000
springboot连接
在application.yml配置即可访问mogos数据库:
spring:
data :
mongodb :
uri: mongodb://127.0.0.1:10011,127.0.0.1:10012,127.0.0.1:10013/test
参考文档
https://blog.csdn.net/quanmaoluo5461/article/details/85164588
本文使用 mdnice 排版
以上是 基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群 的全部内容, 来源链接: utcz.com/a/31189.html