Docker MongoDB v4.0.0 集群搭建

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

1. 本文使用的容器

集群角色 ContainerName IP:port
Config Server cfg_1 10.1.1.2:27019
Config Server cfg_2 10.1.1.3:27019
Config Server cfg_3 10.1.1.4:27019
Shard Server shard1_1 10.1.1.5:27018
Shard Server shard1_2 10.1.1.6:27018
Shard Server shard1_3 10.1.1.7:27018
Shard Server shard2_1 10.1.1.8:27018
Shard Server shard2_2 10.1.1.9:27018
Shard Server shard2_3 10.1.1.10:27018
Shard Server shard3_1 10.1.1.11:27018
Shard Server shard3_2 10.1.1.12:27018
Shard Server shard3_3 10.1.1.13:27018
Mongos mongos_1 10.1.1.14:27020
Mongos mongos_2 10.1.1.15:27020
Mongos mongos_3 10.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
                            来源:CSDN
                            原文:https://blog.csdn.net/vincerom/article/details/81145938

                            你可能感兴趣的:(总结)