【问题标题】:How to add a new node to a mongodb replica set in docker swarm (docker compose 3.4)如何将新节点添加到 docker swarm 中的 mongodb 副本集(docker compose 3.4)
【发布时间】:2019-10-18 16:50:27
【问题描述】:

我正在尝试初始化 mongo 副本集模式并向其添加两个节点(群服务),我使用的是 docker-compose 3.4
我正在使用我在 ansible playbook(版本 2.7.10)上执行的脚本 shell

以下代码分别是docker-compose、ansible playbook和shell脚本:

version: '3.4'
services:
  mongo:
    image: mongodb:4.0.9-debian8-1
    command: mongod --smallfiles --replSet rs_mongo --port 27017
    ports:
      - 27017:27017
    volumes:
      - /opt/application/fwcwas/mongo/:/data/db
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.labels.mongo == true
    environment:
      MONGO_INITDB_ROOT_USERNAME: username
      MONGO_INITDB_ROOT_PASSWORD: pwd
      MONGO_REPLICATION_MODE: RS
      MONGO_REPLICATION_REPLSETNAME: rs_mongo
    networks:
        - web
  mongo02:
    image: mongodb:4.0.9-debian8-1
    command: mongod --smallfiles --replSet rs_mongo --port 27018
    ports:
      - 27018:27017
    volumes:
      - /opt/application/fwcwas/mongo02/:/data/db
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.labels.mongo == true
    environment:
      MONGO_INITDB_ROOT_USERNAME: username
      MONGO_INITDB_ROOT_PASSWORD: pwd
      MONGO_REPLICATION_MODE: RS
      MONGO_REPLICATION_REPLSETNAME: rs_mongo
    networks:
        - web
  mongo03:
    image: mongodb:4.0.9-debian8-1
    command: mongod --smallfiles --replSet rs_mongo --port 27019
    ports:
      - 27019:27017
    volumes:
      - /opt/application/fwcwas/mongo03/:/data/db
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.labels.mongo == true
    environment:
      MONGO_INITDB_ROOT_USERNAME: username
      MONGO_INITDB_ROOT_PASSWORD: pwd
      MONGO_REPLICATION_MODE: RS
      MONGO_REPLICATION_REPLSETNAME: rs_mongo
    networks:
        - web
networks:
  web:
    external:
      name: mongo_network

Ansible 剧本:


##########################################################
# Create a mongo replicaset using a script shell
##########################################################
    - name: Ensure replicaset rs_mongo exist
      shell: chmod +x init_replica_set.sh
      args:
        chdir: /home/docker/mongo/
      when:
        - ansible_host in groups['manager_launcher']

初始化副本集模式并添加mongo副本的脚本shell(init_replica_set.sh):

#!/bin/bash
echo "Intializing replica set on master"
replicate='rs.initiate();sleep(1000);cfg=rs.conf();cfg.members[0].host="mongo:27017";rs.reconfig(cfg);rs.add({host:"mongo02:27018",priority:0.5});rs.add({host:"mongo03:27019",priority:0.5});rs.status();'
docker exec -it $(docker ps -qf "name = mongo_mongo.1") bash -c "echo '$replicate' | mongo --port 27017 -u username -p pwd"

该脚本应该使用作为主副本的 swarm 服务 mongo:27017 初始化 mongodb 的副本集模式,并向其中添加服务 mongo02:27018 和 mongo03:27019 但它只使用第一个服务 mongo 进行了初始化:27017 当我尝试手动添加节点时:

rs.add({host:"mongo02:27018",priority:0.5});

我收到了这个错误


{
        "operationTime" : Timestamp(1571407148, 1),
        "ok" : 0,
        "errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: mongo:27017; the following nodes did not respond affirmatively: mongo02:27018 failed with Error connecting to mongo02:27018 (10.0.2.24:27018) :: caused by :: Connection refused",
        "code" : 74,
        "codeName" : "NodeNotFound",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1571407148, 1),
                "signature" : {
                        "hash" : BinData(0,"IAMJw09rJWNAcRle0WWba1eE8os="),
                        "keyId" : NumberLong("6749137026550857730")
                }
        }
}

请给点建议

【问题讨论】:

    标签: mongodb docker-compose ansible replicaset swarm


    【解决方案1】:

    我更喜欢通过同时定义副本集的所有参数来初始化副本集。即,调用 init 并加在一起...

    另外,请确保每个节点都可以通过主机名访问其他节点。

    示例:

    rs.initiate(
        {
            _id: "shard1",
            version: 1,
            members: [
                { _id: 0, host: "ip-172-31-30-65.us-west-2.compute.internal:27017" },
                { _id: 1, host: "ip-172-31-17-88.us-west-2.compute.internal:27017" },
                { _id: 2, host: "ip-172-31-23-140.us-west-2.compute.internal:27017" }
            ]
        }
    )
    

    另外,当查看您的 docker compose 时,看起来您使用端口 27018 启动 mongo2,这很好,但随后您将 27018 映射到 27017。不应该将其映射到 27018:27018 吗?

    【讨论】:

    • 谢谢Barrypicker,我尝试一次设置所有副本集参数,我得到了同样的错误:
    • 您是否更正了 docker compose 以公开正确的端口?
    • 是的,我做到了,实际上问题出在 mongo 服务之间的连接上,我使用此命令手动测试了它mongo --host mongo_mongo02 --port 27018,我收到了此错误: Error connecting to mongo_mongo02:27018 (10.0.2.170:27018) :: caused by :: Connection refused
    • 我怀疑从主机系统运行 mongo shell 的错误是由入口问题引起的,而不是 mongo 配置问题。需要先排除mongo配置问题。你能进入容器并运行 mongo shell(在容器内)来验证 mongo 连接和配置吗?如果在容器内连接到 mongo 时出现错误,则需要更改 mongodb 配置。
    • 另外,持久卷可能存在问题。如果数据目录不可用,MongoDB 将阻塞。
    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多