Docker MongoDB v4.0.0 集群搭建

本文详述在Docker环境下部署无认证MongoDB集群的过程,包括网络配置、容器启动及集群初始化步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单地在Docker环境上搭建一个无认证的MongoDB集群。
本文基于CentOS 7.4,MongoDB版本为4.0.0,Docker版本为17.09.0-ce

1. 本文使用的容器

集群角色ContainerNameIP:port
Config Servercfg_110.1.1.2:27019
Config Servercfg_210.1.1.3:27019
Config Servercfg_310.1.1.4:27019
Shard Servershard1_110.1.1.5:27018
Shard Servershard1_210.1.1.6:27018
Shard Servershard1_310.1.1.7:27018
Shard Servershard2_110.1.1.8:27018
Shard Servershard2_210.1.1.9:27018
Shard Servershard2_310.1.1.10:27018
Shard Servershard3_110.1.1.11:27018
Shard Servershard3_210.1.1.12:27018
Shard Servershard3_310.1.1.13:27018
Mongosmongos_110.1.1.14:27020
Mongosmongos_210.1.1.15:27020
Mongosmongos_310.1.1.16:27020

2. 从Docker Hub上拉取MongoDB镜像

docker pull mongo:4.0.0
 
  • 3. Docker网络配置

    为MongoDB集群创建独立的docker网桥

    docker network create --subnet=10.1.1.0/24 mongodb0
       
    • 4. 准备MongoDB集群配置文件

      准备Docker挂载的目录

      mkdir -p /home/dmc/configsvr
      mkdir -p /home/dmc/shard1
      mkdir -p /home/dmc/shard2
      mkdir -p /home/dmc/shard3
      mkdir -p /home/dmc/mongos
           
        • Config-Server 配置文件
          路径:/home/dmc/configsvr/mongod.conf
          说明:MongoDB v3.4 之后要求Config-Server也需要组成副本集形式
        storage:
          dbPath: /data/db
          journal:
            enabled: true
        systemLog:
          destination: file
          logAppend: true
          path: /var/log/mongodb/mongod.log
        net:
          bindIp: 127.0.0.1
        processManagement:
          timeZoneInfo: /usr/share/zoneinfo
        replication:
          replSetName: cfg
        sharding:
          clusterRole: configsvr
               
          • Shard-Server 配置文件
            路径:/home/dmc/shard1/mongod.conf
            说明:此处配置3个分片为shard1,shard2,shard3;每个分片都需要组成副本集。
            shard2,shard3目录下配置文件同名,修改replSetName字段的值分别为’shard2’和’shard3’
          storage:
            dbPath: /data/db
            journal:
              enabled: true
          systemLog:
            destination: file
            logAppend: true
            path: /var/log/mongodb/mongod.log
          net:
            bindIp: 127.0.0.1
          processManagement:
            timeZoneInfo: /usr/share/zoneinfo
          replication:
            replSetName: shard1
          sharding:
            clusterRole: shardsvr
                   
            • Mongos 配置文件
              路径:/home/dmc/mongos/mongos.conf
              说明:mongos不需要存储因此去掉storage字段;可任意配置net.port字段,需要指定processManagement.fork为true以–fork方式启动;sharding.configDB字段用于指定Config-Server集群地址,格式为[replSetName]/[config-server1:port],[config-server2:port],[config-server3:port]…
            systemLog:
              destination: file
              logAppend: true
              path: /var/log/mongodb/mongos.log
            net:
              port: 27020
              bindIp: 127.0.0.1
            processManagement:
              fork: true
              timeZoneInfo: /usr/share/zoneinfo
            sharding:
              configDB: cfg/10.1.1.2:27019,10.1.1.3:27019,10.1.1.4:27019
                       

    5. 启动Docker容器

    • 启动3个Config-Server容器:
    docker run -d --name=cfg_1 --network=mongodb0 --ip=10.1.1.2 -v /home/dmc/configsvr:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
    docker run -d --name=cfg_2 --network=mongodb0 --ip=10.1.1.3 -v /home/dmc/configsvr:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
    docker run -d --name=cfg_3 --network=mongodb0 --ip=10.1.1.4 -v /home/dmc/configsvr:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
     

      进入其中一个容器配置Config-Server副本集:

      # 宿主机
      docker exec -it cfg_1 bash
      # 容器中
      mongo --port 27019
      # Mongo Shell中
      rs.initiate({
          "_id":"cfg",
          "members":[
              {
                  "_id":0,
                  "host":"10.1.1.2:27019"
              },
              {
                  "_id":1,
                  "host":"10.1.1.3:27019"
              },
              {
                  "_id":2,
                  "host":"10.1.1.4:27019"
              }
          ]
      })
       
        • 启动3*3个Shard-Server容器:
          说明:分片服务器启动后默认是以27018作为端口。
        # 启动第一个分片 - shard1
        docker run -d --name=shard1_1 --network=mongodb0 --ip=10.1.1.5 -v /home/dmc/shard1:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
        docker run -d --name=shard1_2 --network=mongodb0 --ip=10.1.1.6 -v /home/dmc/shard1:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
        docker run -d --name=shard1_3 --network=mongodb0 --ip=10.1.1.7 -v /home/dmc/shard1:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
         

          进入其中一个容器配置Shard-Server副本集:

          # 宿主机
          docker exec -it shard1_1 bash
          # 容器中
          mongo --port 27018
          # Mongo Shell中
          rs.initiate({
              "_id":"shard1",
              "members":[
                  {
                      "_id":0,
                      "host":"10.1.1.5:27018"
                  },
                  {
                      "_id":1,
                      "host":"10.1.1.6:27018"
                  },
                  {
                      "_id":2,
                      "host":"10.1.1.7:27018"
                  }
              ]
          })
           
            # 启动第二个分片 - shard2
            docker run -d --name=shard2_1 --network=mongodb0 --ip=10.1.1.8 -v /home/dmc/shard2:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
            docker run -d --name=shard2_2 --network=mongodb0 --ip=10.1.1.9 -v /home/dmc/shard2:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
            docker run -d --name=shard2_3 --network=mongodb0 --ip=10.1.1.10 -v /home/dmc/shard2:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
             

              进入其中一个容器配置Shard-Server副本集:

              # 宿主机
              docker exec -it shard2_1 bash
              # 容器中
              mongo --port 27018
              # Mongo Shell中
              rs.initiate({
                  "_id":"shard2",
                  "members":[
                      {
                          "_id":0,
                          "host":"10.1.1.8:27018"
                      },
                      {
                          "_id":1,
                          "host":"10.1.1.9:27018"
                      },
                      {
                          "_id":2,
                          "host":"10.1.1.10:27018"
                      }
                  ]
              })
               
                # 启动第三个分片 - shard3
                docker run -d --name=shard3_1 --network=mongodb0 --ip=10.1.1.11 -v /home/dmc/shard3:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
                docker run -d --name=shard3_2 --network=mongodb0 --ip=10.1.1.12 -v /home/dmc/shard3:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
                docker run -d --name=shard3_3 --network=mongodb0 --ip=10.1.1.13 -v /home/dmc/shard3:/etc/mongodb mongo:4.0.0 -f /etc/mongodb/mongod.conf
                 

                  进入其中一个容器配置Shard-Server副本集:

                  # 宿主机
                  docker exec -it shard3_1 bash
                  # 容器中
                  mongo --port 27018
                  # Mongo Shell中
                  rs.initiate({
                      "_id":"shard3",
                      "members":[
                          {
                              "_id":0,
                              "host":"10.1.1.11:27018"
                          },
                          {
                              "_id":1,
                              "host":"10.1.1.12:27018"
                          },
                          {
                              "_id":2,
                              "host":"10.1.1.13:27018"
                          }
                      ]
                  })
                   
                    • 启动3个mongos服务器
                      说明:这里也使用了mongo镜像,但是需要开启mongos进程,mongod进程并不需要用到。
                    docker run -d --name=mongos_1 --network=mongodb0 --ip=10.1.1.14 -v /home/dmc/mongos:/etc/mongodb mongo:4.0.0
                    docker run -d --name=mongos_2 --network=mongodb0 --ip=10.1.1.15 -v /home/dmc/mongos:/etc/mongodb mongo:4.0.0
                    docker run -d --name=mongos_3 --network=mongodb0 --ip=10.1.1.16 -v /home/dmc/mongos:/etc/mongodb mongo:4.0.0
                     

                      进入每个容器中,启动mongos进程(此处可以改进一下,自动运行mongos进程)

                      # 宿主机
                      docker exec -it mongos_1 bash
                      # 容器中
                      mongos -f /etc/mongodb/mongos.conf
                       

                        可以就在其中一个mongos容器中使用mongo shell连接mongos进程配置分片集群。

                        # 连接mongos,端口号与mongos配置文件中设定一致
                        mongo -port 27020
                        # 将分片加入集群
                        sh.addShard("shard1/10.1.1.5:27018,10.1.1.6:27018,10.1.1.7:27018")
                        sh.addShard("shard2/10.1.1.8:27018,10.1.1.9:27018,10.1.1.10:27018")
                        sh.addShard("shard3/10.1.1.11:27018,10.1.1.12:27018,10.1.1.13:27018")
                        
                        # 对数据库开启分片功能
                        sh.enableSharding("[dbName]")
                        # 对数据库中集合开启分片,并指定片键
                        sh.shardCollection("[dbName.collectionName]",{[keyName]:1})
                         

                          6. 尝试写入数据观察数据分块

                          # 插入5百万个简单的文档,耐心等待插入结束
                          for(var i=1;i<=5000000;i++){
                              db.coll1.insert({
                                  name:i,
                                  age:Math.round(Math.random() * 100),
                                  score1:Math.round(Math.random() * 100),
                                  score2:Math.round(Math.random() * 100),
                                  score3:Math.round(Math.random() * 100),
                                  score4:Math.round(Math.random() * 100),
                                  score5:Math.round(Math.random() * 100)
                              });
                          }
                          
                          # 查看分片状态
                          sh.status()
                           

                            作者:vincerom
                            来源:优快云
                            原文:https://blog.youkuaiyun.com/vincerom/article/details/81145938

                            评论
                            添加红包

                            请填写红包祝福语或标题

                            红包个数最小为10个

                            红包金额最低5元

                            当前余额3.43前往充值 >
                            需支付:10.00
                            成就一亿技术人!
                            领取后你会自动成为博主和红包主的粉丝 规则
                            hope_wisdom
                            发出的红包
                            实付
                            使用余额支付
                            点击重新获取
                            扫码支付
                            钱包余额 0

                            抵扣说明:

                            1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                            2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                            余额充值