Подключиться к удаленному докеризированному набору реплик MongoDB - PullRequest
0 голосов
/ 04 марта 2019

На моей удаленной машине я настроил докер-контейнер, которым я управляю с помощью docker-compose.Я создал 3 контейнера докеров для каждого экземпляра MongoDB, который я хочу в своем наборе реплик

mongodb_01:
    image: mvertes/alpine-mongo
    entrypoint: ['/usr/bin/mongod', '--bind_ip_all', '--replSet', 'rs0']
    restart: always
    ports:
      - 10001:27017
    volumes:
      - ./mongodb/01:/data/db

mongodb_02:
    image: mvertes/alpine-mongo
    entrypoint: ['/usr/bin/mongod', '--bind_ip_all', '--replSet', 'rs0']
    restart: always
    depends_on:
       - mongodb_01
    ports:
      - 10002:27017
    volumes:
      - ./mongodb/02:/data/db

mongodb_03:
    image: mvertes/alpine-mongo
    entrypoint: ['/usr/bin/mongod', '--bind_ip_all', '--replSet', 'rs0']
    restart: always
    depends_on:
      - mongodb_02
    ports:
      - 10003:27017
    volumes:
      - ./mongodb/03:/data/db

Я также настроил набор реплик.и это отрывок:

"_id" : "rs0",
...
"members" : [
    {
        "_id" : 0,
        "host" : "mongodb_01:27017",
        ...
    },
    {
        "_id" : 1,
        "host" : "mongodb_02:27017",
        ...
    },
    {
        "_id" : 2,
        "host" : "mongodb_03:27017",
        ...
    }
],
...
}

Все работает нормально, и внутри-коммуникация между другими образами док-станции и этим набором реплик работает нормально, используя строку подключения

mongodb://mongodb_01:27017,mongodb_02:27017,mongodb_03:27017/<database>?replicaSet=rs0

Проблема в том, когдаМне нужно подключить удаленный клиент к этому набору реплик.Например, используя mongoose через узел на моем компьютере разработчика, я получаю:

MongoNetworkError: failed to connect to server [mongodb_02:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND mongodb_02 mongodb_02:27017]

Иногда это не сработает на mongodb_03.

Edit : как указано, вот мое соединениестрока с удаленного компьютера:

mongodb://<remote-host>:10001,<remote-host>:10002,<remote-host>:10003/<database>?replicaSet=rs0

Редактировать 2 : с помощью клиента, такого как Mongodb Compass, я могу правильно подключиться к отдельным экземплярам.Когда я добавляю репликацию, я получаю ошибку.Поэтому я попытался создать фиктивный контейнер с mongodb (используя mongo: latest).

$ docker run -it mongo:latest bash

и запустить

mongo mongodb://<remote-host>:10001,<remote-host>:10002,<remote-host>:10003/<database>?replicaSet=rs0

Я получаю

MongoDB shell version v4.0.6
connecting to: mongodb://<remote-host>:10001,<remote-host>:10002,<remote-host>:10003/<database>?gssapiServiceName=mongodb&replicaSet=rs0
2019-03-04T16:12:54.375+0000 I NETWORK  [js] Starting new replica set monitor for rs0/<remote-host>:10001,<remote-host>:10002,<remote-host>:10003
2019-03-04T16:12:54.377+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to <remote-host>:10003 (1 connections now open to <remote-host>:10003 with a 5 second timeout)
2019-03-04T16:12:54.377+0000 I NETWORK  [js] Successfully connected to <remote-host>:10001 (1 connections now open to <remote-host>:10001 with a 5 second timeout)
2019-03-04T16:12:54.378+0000 I NETWORK  [js] changing hosts to rs0/mongodb_01:27017,mongodb_02:27017,mongodb_03:27017 from rs0/<remote-host>:10001,<remote-host>:10002,<remote-host>:10003
2019-03-04T16:12:54.882+0000 W NETWORK  [js] Unable to reach primary for set rs0
2019-03-04T16:12:54.882+0000 I NETWORK  [js] Cannot reach any nodes for set rs0. Please check network connectivity and the status of the set. This has happened for 1 checks in a row.

и так

Спасибо за любую помощь и предложение!

Ответы [ 2 ]

0 голосов
/ 07 августа 2019

Я столкнулся с той же самой проблемой с вами, и я понял это.

Это потому, что ваш удаленный клиент не знает хост 'mongo1: 27017'.Он используется только внутри сети докеров.

Немного сложно объяснить, как я решил эту проблему.Сначала я покажу свой docker-compose.yml.

version: "3.3"
services:
  mongo-primary:
    container_name: mongo-primary
    hostname: mongo-primary
    image: mongo:4.0.11
    volumes:
      - $HOME/.dockerMongoRepl/primary/data/db:/data/db
      - $HOME/.dockerMongoRepl/keyfile:/data/keyfile
    extra_hosts:
      - "address.whichCanAccess.yourServer:192.168.1.xx"
    networks:
      - mongo-cluster
    ports:
      - 27017:27017
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: changeme
    command: --bind_ip_all --auth --keyFile /data/keyfile/mongo-cluster-key --replSet rs0 --enableMajorityReadConcern false
  mongo-secondary:
    container_name: mongo-secondary
    hostname: mongo-secondary
    image: mongo:4.0.11
    volumes:
      - $HOME/.dockerMongoRepl/secondary/data/db:/data/db
      - $HOME/.dockerMongoRepl/keyfile:/data/keyfile
    depends_on:
      - mongo-primary
    extra_hosts:
      - ""address.whichCanAccess.yourServer:192.168.1.xx""
    networks:
      - mongo-cluster
    ports:
      - 27018:27017
    restart: always
    command: --bind_ip_all -auth --keyFile /data/keyfile/mongo-cluster-key --replSet rs0 --enableMajorityReadConcern false
  mongo-arbiter:
    container_name: mongo-arbiter
    hostname: mongo-arbiter
    image: mongo:4.0.11
    volumes:
      - $HOME/.dockerMongoRepl/arbiter/data/arb:/data/arb
      - $HOME/.dockerMongoRepl/keyfile:/data/keyfile
    depends_on:
      - mongo-primary
    extra_hosts:
      - ""address.whichCanAccess.yourServer:192.168.1.xx""
    networks:
      - mongo-cluster
    ports:
      - 27019:27017
    restart: always
    command: --bind_ip_all --auth --keyFile /data/keyfile/mongo-cluster-key --replSet rs0 --enableMajorityReadConcern false

networks:
  mongo-cluster:

! Важная часть - это extra_hosts !!Это может сделать доступ контейнеров к хост-компьютеру.

"address.WhichCanAccess.yourServer" <- в моем случае для моего маршрутизатора asus было установлено asus ddns, поэтому это будет XXX.asuscomm.com </p>

"192.168.1.xx" <- IP-адреса, которым маршрутизатор asus назначил хост-компьютер </p>

Возможно, некоторая конфигурация этих составных файлов не требуется.

Запуск 3 контейнеров с докером-compose.

Далее, введите оболочку mongo первичного сервера, установите реплику, как показано ниже

config = {
  "_id": "rs0",
  "members": [{
    "_id": 0,
    "host": "address.whichCanAccess.yourServer:27017"
  }, {
    "_id": 1,
    "host": "address.whichCanAccess.yourServer:27018"
  }, {
    "_id": 2,
    "host": "address.whichCanAccess.yourServer:27019",
    arbiterOnly: true
  }]
}

rs.initiate(config)

Таким образом, контейнеры mongo будут связываться друг с другом через хост-сеть докера, и к ним можно получить доступс удаленного IP.

0 голосов
/ 06 марта 2019

В итоге я использовал бесплатную версию Atlas для тестирования и интеграции.Как только моя работа будет завершена, я буду использовать свой собственный набор реплик на своих серверах.

Это немного хлопотно, и мне нужно трижды проверить все перед производством без поддержки инструментов разработчика и отладчиков.

...