一、准备工作
1、拉取mongodb镜像
docker pull mongo:4.2
docker tag docker.io/mongo:4.2 mongo4.2
docker rmi docker.io/mongo:4.2
2、安装docker-compose工具
# 升级 pip
pip3 install --upgrade pip
# 指定 docker-compose 版本安装
pip install docker-compose==1.22
# 验证是否安装成功,有返回值,说明安装成功
docker-compose -v
3、创建相关文件夹
mkdir -p /data/docker-compose/mongo
mkdir -p /data/docker-config/mongo
mkdir -p /data/docker-data/mongo
二、构建mongodb集群
1、集群规划
宿主机:192.168.78.103
容器名称 | 端口号 | 目录 | 角色 |
---|---|---|---|
mongo_100 | 27017:27017 | - | Route Server |
mongo_101 | 27101:27019 | /data/docker-data/mongodb/config_servers/101:/data/configdb | Config Server 1 |
mongo_102 | 27102:27019 | /data/docker-data/mongodb/config_servers/102:/data/configdb | Config Server 2 |
mongo_111 | 27111:27018 | /data/docker-data/mongodb/A/111:/data/db | 分片A的shard |
mongo_112 | 27112:27018 | /data/docker-data/mongodb/A/112:/data/db | 分片A的secondary |
mongo_113 | 27113:27018 | /data/docker-data/mongodb/A/113:/data/db | 分片A的arbiter |
mongo_121 | 27121:27018 | /data/docker-data/mongodb/B/121:/data/db | 分片B的shard |
mongo_122 | 27122:27018 | /data/docker-data/mongodb/B/122:/data/db | 分片B的secondary |
mongo_123 | 27123:27018 | /data/docker-data/mongodb/B/123:/data/db | 分片B的arbiter |
2、编写docker-compose.yml
cd /data/docker-compose/mongo
vi docker-compose.yml
version: '3.6'
services:
shard_A_111:
image: mongo4.2
container_name: mongo_111
ports:
- 27111:27018
command: mongod --shardsvr --directoryperdb --replSet shard_A
volumes:
- /data/docker-data/mongodb/A/111:/data/db
privileged: true
networks:
- mongo
secondary_A_112:
image: mongo4.2
container_name: mongo_112
ports:
- 27112:27018
command: mongod --shardsvr --directoryperdb --replSet shard_A
volumes:
- /data/docker-data/mongodb/A/112:/data/db
privileged: true
networks:
- mongo
arbiter_A_113:
image: mongo4.2
container_name: mongo_113
ports:
- 27113:27018
command: mongod --shardsvr --directoryperdb --replSet shard_A
volumes:
- /data/docker-data/mongodb/A/113:/data/db
privileged: true
networks:
- mongo
shard_B_121:
image: mongo4.2
container_name: mongo_121
ports:
- 27121:27018
command: mongod --shardsvr --directoryperdb --replSet shard_B
volumes:
- /data/docker-data/mongodb/B/121:/data/db
privileged: true
networks:
- mongo
secondary_B_122:
image: mongo4.2
container_name: mongo_122
ports:
- 27122:27018
command: mongod --shardsvr --directoryperdb --replSet shard_B
volumes:
- /data/docker-data/mongodb/B/122:/data/db
privileged: true
networks:
- mongo
arbiter_B_123:
image: mongo4.2
container_name: mongo_123
ports:
- 27123:27018
command: mongod --shardsvr --directoryperdb --replSet shard_B
volumes:
- /data/docker-data/mongodb/B/123:/data/db
privileged: true
networks:
- mongo
config_101:
image: mongo4.2
container_name: mongo_101
ports:
- 27101:27019
command: mongod --configsvr --directoryperdb --replSet config_servers
volumes:
- /data/docker-data/mongodb/config_servers/101:/data/configdb
networks:
- mongo
config_102:
image: mongo4.2
container_name: mongo_102
ports:
- 27102:27019
command: mongod --configsvr --directoryperdb --replSet config_servers
volumes:
- /data/docker-data/mongodb/config_servers/102:/data/configdb
networks:
- mongo
route_100:
image: mongo4.2
container_name: mongo_100
ports:
- 27017:27017
command: mongos --configdb config_servers/config_101:27019,config_102:27019 --bind_ip 0.0.0.0 --port 27017
depends_on:
- config_101
- config_102
networks:
- mongo
networks:
mongo:
driver: bridge
ipam:
config:
- subnet: "174.200.7.0/24"
有两个参数是需要注意的,
1、--configsvr
标识该节点是config节点,mongodb的config节点端口号是27019,不再是27017
2、--shardsvr
标识该节点是shard节点,mongodb的shard节点端口号是27018,不再是27017
3、开始构建
cd /data/docker-compose/mongo
docker-compose up -d
4、查看构建结果
[root@v3 mongo]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f939fef982e5 mongo4.2 "docker-entrypoint..." 8 seconds ago Up 7 seconds 0.0.0.0:27017->27017/tcp mongo_100
89ddb2f00b72 mongo4.2 "docker-entrypoint..." 9 seconds ago Up 7 seconds 0.0.0.0:27101->27017/tcp mongo_101
d236b9539ab5 mongo4.2 "docker-entrypoint..." 9 seconds ago Up 7 seconds 0.0.0.0:27102->27017/tcp mongo_102
d2b14e218211 mongo4.2 "docker-entrypoint..." 10 seconds ago Up 8 seconds 0.0.0.0:27113->27017/tcp mongo_113
a5f0231b0b0e mongo4.2 "docker-entrypoint..." 10 seconds ago Up 8 seconds 0.0.0.0:27121->27017/tcp mongo_121
f30d018945fe mongo4.2 "docker-entrypoint..." 10 seconds ago Up 8 seconds 0.0.0.0:27123->27017/tcp mongo_123
af8aec40f602 mongo4.2 "docker-entrypoint..." 10 seconds ago Up 8 seconds 0.0.0.0:27111->27017/tcp mongo_111
dd72eff40f5a mongo4.2 "docker-entrypoint..." 10 seconds ago Up 8 seconds 0.0.0.0:27122->27017/tcp mongo_122
1806b3020208 mongo4.2 "docker-entrypoint..." 10 seconds ago Up 8 seconds 0.0.0.0:27112->27017/tcp mongo_112
5、将两个mongo_config_server加入同一个组里
docker-compose exec config_101 bash -c "echo 'rs.initiate({_id: \"config_servers\",configsvr: true, members: [{ _id : 0, host : \"config_101:27019\" },{ _id : 1, host : \"config_102:27019\" }]})' | mongo --port 27019"
这里需要注意的是,当docker exec后面跟的节点是config节点时,一定要在最后指定mongo --port 27019
,否则mongodb会用默认的27017端口,最后就会报错导致集群构建失败。
6、将属于A分片的节点加入A分片里,将属于B分片的节点加入B分片里
docker-compose exec shard_A_111 bash -c "echo 'rs.initiate({_id: \"shard_A\",members: [{ _id : 0, host : \"shard_A_111:27018\" }, { _id : 1, host : \"secondary_A_112:27018\" }, { _id : 2, host : \"arbiter_A_113:27018\" }]})' | mongo --port 27018"
docker-compose exec shard_B_121 bash -c "echo 'rs.initiate({_id: \"shard_B\",members: [{ _id : 0, host : \"shard_B_121:27018\" }, { _id : 1, host : \"secondary_B_122:27018\" }, { _id : 2, host : \"arbiter_B_123:27018\" }]})' | mongo --port 27018"
这里需要注意的是,当docker exec后面跟的节点是shard节点时,一定要在最后指定mongo --port 27018
,否则mongodb会用默认的27017端口,最后就会报错导致集群构建失败。
7、将两个分片加入分片集群
docker-compose exec route_100 bash -c "echo 'sh.addShard(\"shard_A/shard_A_111:27018,secondary_A_112:27018,arbiter_A_113:27018\")' | mongo"
docker-compose exec route_100 bash -c "echo 'sh.addShard(\"shard_B/shard_B_121:27018,secondary_B_122:27018,arbiter_B_123:27018\")' | mongo"
8、验证集群数据是否成功
[root@v3 mongo]# docker exec -it mongo_100 bash
root@12943e819939:/# mongo
mongos> show dbs
admin 0.000GB
config 0.002GB
mongos> use config
switched to db config
mongos> db.getCollection('shards').find({})
{ "_id" : "shard_A", "host" : "shard_A/arbiter_A_113:27018,secondary_A_112:27018,shard_A_111:27018", "state" : 1 }
{ "_id" : "shard_B", "host" : "shard_B/arbiter_B_123:27018,secondary_B_122:27018,shard_B_121:27018", "state" : 1 }
看到这些数据,说明构建成功了。