Как добавить новый узел в реплику mongodb, установленную в docker swarm (docker compose 3.4) - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь инициализировать режим установки реплики Монго и добавить к нему два узла (службы роя), я использую docker-compose 3.4
Я использую скрипт-оболочку, которую я выполняю на ANSIBLE playbook(версия 2.7.10)

Следующие фрагменты кода соответственно составляют docker-compose, ANSIBLE PlayBook и сценарий оболочки:

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 playbook:


##########################################################
# 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 (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"

Скрипт, предназначенный для инициализации режима установки реплик mongodb с помощью службы swarm mongo: 27017, которыйявляется основной репликой и добавляет к ней службы mongo02: 27018 и mongo03: 27019, но она выполняла инициализацию только с первой службой mongo: 27017, и когда я пытался добавить узлы вручную:

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

Iполучил эту ошибку


{
        "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")
                }
        }
}

любой совет, пожалуйста

1 Ответ

0 голосов
/ 18 октября 2019

Я предпочитаю инициализировать набор реплик, определяя все параметры для набора реплик одновременно. то есть, вызовите 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" }
        ]
    }
)

Кроме того, когда вы смотрите на композицию докера, похоже, что вы запускаете mongo2 с портом 27018, что нормально, но затем вы сопоставляете 27018 с 27017. Разве это не должно быть сопоставлено с 27018:27018 вместо этого?

...