docker快速搭建mongodb集群

一、准备工作

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 }

看到这些数据,说明构建成功了。