使用Docker部署MongoDB Cluster实践
环境准备
- 四台服务器,分别命名为ServerA、ServerB、ServerC、ServerD
- 2 Shard(1 Primary 1 Secondary 1 Arbiter) Nodes
- 3 Config Nodes
- 4 Router Nodes
docker-compose.yml
ServerA配置文件
version: '2'
services:
configsrv:
image: mongo
command: mongod --keyFile /data/configdb/mongodb-keyfile --oplogSize 1024 --replSet configrs --port 27017 --configsvr --wiredTigerCacheSizeGB 5
volumes:
- /data/configsrv_db:/data/configdb
ports:
- "27018:27017"
restart:
always
container_name:
configsrv
ulimits:
nofile:
soft: 300000
hard: 300000
rs1_node:
image: mongo
command: mongod --keyFile /data/db/mongodb-keyfile --oplogSize 10240 --replSet rs1 --directoryperdb --port 27017 --shardsvr
volumes:
- /data/rs1_node_db:/data/db
ports:
- "27019:27017"
restart:
always
container_name:
rs1_node
ulimits:
nofile:
soft: 300000
hard: 300000
router:
image: mongo
command: mongos --keyFile /data/db/mongodb-keyfile --configdb configrs/ServerA:27018,ServerB:27018,ServerC:27018
ports:
- "27017:27017"
volumes:
- /data/router_db:/data/db
restart:
always
container_name:
router
ulimits:
nofile:
soft: 300000
hard: 300000ServerB配置文件
version: '2'
services:
configsrv:
image: mongo
command: mongod --keyFile /data/configdb/mongodb-keyfile --oplogSize 1024 --replSet configrs --port 27017 --configsvr --wiredTigerCacheSizeGB 5
volumes:
- /data/configsrv_db:/data/configdb
ports:
- "27018:27017"
restart:
always
container_name:
configsrv
ulimits:
nofile:
soft: 300000
hard: 300000
rs1_node:
image: mongo
command: mongod --keyFile /data/db/mongodb-keyfile --oplogSize 10240 --replSet rs1 --directoryperdb --port 27017 --shardsvr
volumes:
- /data/rs1_node_db:/data/db
ports:
- "27019:27017"
restart:
always
container_name:
rs1_node
ulimits:
nofile:
soft: 300000
hard: 300000
rs2_arbiter:
image: mongo
command: mongod --keyFile /data/db/mongodb-keyfile --oplogSize 1024 --replSet rs2 --directoryperdb --port 27017 --shardsvr --wiredTigerCacheSizeGB 1 --nojournal --smallfiles
volumes:
- /data/rs2_arbiter_db:/data/db
ports:
- "27020:27017"
restart:
always
container_name:
rs2_arbiter
ulimits:
nofile:
soft: 300000
hard: 300000
router:
image: mongo
command: mongos --keyFile /data/db/mongodb-keyfile --configdb configrs/ServerA:27018,ServerB:27018,ServerC:27018
ports:
- "27017:27017"
volumes:
- /data/router_db:/data/db
restart:
always
container_name:
router
ulimits:
nofile:
soft: 300000
hard: 300000ServerC配置文件
version: '2'
services:
configsrv:
image: mongo
command: mongod --keyFile /data/configdb/mongodb-keyfile --oplogSize 1024 --replSet configrs --port 27017 --configsvr --wiredTigerCacheSizeGB 5
volumes:
- /data/configsrv_db:/data/configdb
ports:
- "27018:27017"
restart:
always
container_name:
configsrv
ulimits:
nofile:
soft: 300000
hard: 300000
rs2_node:
image: mongo
command: mongod --keyFile /data/db/mongodb-keyfile --oplogSize 10240 --replSet rs2 --directoryperdb --port 27017 --shardsvr
volumes:
- /data/rs2_node_db:/data/db
ports:
- "27019:27017"
restart:
always
container_name:
rs2_node
ulimits:
nofile:
soft: 300000
hard: 300000
rs1_arbiter:
image: mongo
command: mongod --keyFile /data/db/mongodb-keyfile --oplogSize 1024 --replSet rs1 --directoryperdb --port 27017 --shardsvr --wiredTigerCacheSizeGB 1 --nojournal --smallfiles
volumes:
- /data/rs1_arbiter_db:/data/db
ports:
- "27020:27017"
restart:
always
container_name:
rs1_arbiter
ulimits:
nofile:
soft: 300000
hard: 300000
router:
image: mongo
command: mongos --keyFile /data/db/mongodb-keyfile --configdb configrs/ServerA:27018,ServerB:27018,ServerC:27018
ports:
- "27017:27017"
volumes:
- /data/router_db:/data/db
restart:
always
container_name:
router
ulimits:
nofile:
soft: 300000
hard: 300000
ServerD配置文件
version: '2'
services:
rs2_node:
image: mongo
command: mongod --keyFile /data/db/mongodb-keyfile --oplogSize 10240 --replSet rs2 --directoryperdb --port 27017 --shardsvr
volumes:
- /data/rs2_node_db:/data/db
ports:
- "27019:27017"
restart:
always
container_name:
rs2_node
ulimits:
nofile:
soft: 300000
hard: 300000
router:
image: mongo
command: mongos --keyFile /data/db/mongodb-keyfile --configdb configrs/ServerA:27018,ServerB:27018,ServerC:27018
ports:
- "27017:27017"
volumes:
- /data/router_db:/data/db
restart:
always
container_name:
router
ulimits:
nofile:
soft: 300000
hard: 300000启动前准备工作
- 创建mongodb-keyfile文件
openssl rand -base64 741 > mongodb-keyfile chmod 600 mongodb-keyfile
- 创建宿主机的volume文件夹
初始化Config节点
重要:在初始化启动前需要去掉docker-compose.yml配置文件中的--keyFile参数
启动节点
在ServerA、ServerB和ServerC三台服务器上运行命令:
docker-compose up -d configsrv
初始化
利用mongo连接到ServerA节点,输入以下命令创建管理用户:
use admin
db.createUser({user: "mongoUserAdmin", pwd: "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
db.createUser({user: "mongoRootAdmin", pwd: "123456", roles: [ { role: "root", db: "admin" } ] })初始化ReplicaSet信息
rs.initiate(
{
_id: "configrs",
configsvr: true,
members: [
{ _id : 0, host : "ServerA:27018" },
{ _id : 1, host : "ServerB:27018" },
{ _id : 2, host : "ServerC:27018" }
]
}
)初始化Shard1节点
重要:在初始化启动前需要去掉docker-compose.yml配置文件中的--keyFile参数
启动节点
- 在ServerA和ServerB两台服务器上运行命令:
docker-compose up -d rs1_node - 在ServerC服务器上运行命令:
docker-compose up -d rs1_arbiter
初始化
利用mongo连接到ServerA节点,创建管理用户
use admin
db.createUser({user: "mongoUserAdmin", pwd: "123456", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
db.createUser({user: "mongoRootAdmin", pwd: "123456", roles: [ { role: "root", db: "admin" } ] })初始化ReplicaSet信息
rs.initiate(
{
_id : "rs1",
members: [
{ _id : 0, host : "ServerA:27019" },
{ _id : 1, host : "ServerB:27019" }
]
}
)增加Arbiter节点
rs.addArb("ServerC:27020")查看rs状态:rs.status()
初始化Shard2节点
与Shard1节点雷同,只需要修改对应的服务器IP
重启Config和Shard节点
- 取消
--keyFile参数的注释,删掉上述创建的所有container - 利用
docker-compose再次启动上面所有节点
启动Router节点
使用命令docker-compose up -d router在四台服务器上启动路由节点
配置Cluster
增加Shard节点
使用mongo连接到任意一台服务器的router节点,然后执行以下命令将Shard节点加入到当前Cluster中
use admin
db.auth("<username>","<password>")
sh.addShard("rs1/ServerA:27019")
sh.addShard("rs2/ServerD:27019")启动Sharding
在对collection进行sharding之前一定要先对数据库启动sharding
sh.enableSharding("<database>")
sh.shardCollection( "<database>.<collection>", { _id : "hashed" } )参考资料:
官方资料:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Docker数据卷挂载命令volume(-v)与mount的使用总结
本文主要介绍了Docker数据卷挂载命令volume(-v)与mount的使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-08-08
Docker使用nodejs镜像构建express服务的方法
这篇文章主要介绍了Docker使用nodejs镜像构建express服务,主要包括nodejs容器的启动,安装nodejs第三方依赖模块及启动nodejs服务的相关操作,本文给大家介绍的非常详细,需要的朋友可以参考下2022-07-07
Docker拉取镜像失败解决(connect: connection refused)
最近遇到Docker拉取centos镜像时报错,本文主要介绍了Docker拉取镜像失败解决(connect: connection refused),具有一定的参考价值,感兴趣的可以了解一下2024-07-07
docker容器在uos-12038.101上启动报错的解决办法
这篇文章主要介绍了docker容器在uos-12038.101上启动报错的问题,解决方案是需要在/etc/systemd/system/或者 /usr/lib/systemd/system/2024-03-03
找到docker.service文件,在ExecStart=/usr/bin/dockerd后面添加 --default-ulimit nofile=65536:65536参数,需要的朋友可以参考下


最新评论