Конфигурирование кластера MongoDB - PullRequest
0 голосов
/ 30 октября 2018

Я должен настроить кластер mongodb с двумя узлами. На каждом узле должны быть реплицированы все данные. Если один сервер умирает, другой должен принять за основной.

Перед настройкой кластера я делаю локальный тест с использованием экземпляров докера для его настройки. Как я видел в документации , у меня должно быть как минимум 3 экземпляра MongoDB. Это правильно?

Сначала я создал экземпляр дерева с помощью Docker, и я настроил экземпляр как основной. Приведенный ниже код - это мой docker compose и скрипт configure.

Состав Docker:

version: '3'
services:
    mongo-2:
        container_name: mongo-2
        image: mongo:4
        ports:
            - 30102:27017
        command: mongod --replSet cnf-serv --port 27017 --oplogSize 16 --bind_ip_all
        restart: always

    mongo-3:
        container_name: mongo-3
        image: mongo:4
        ports:
            - 30103:27017
        command: mongod --replSet cnf-serv --port 27017 --oplogSize 16 --bind_ip_all
        restart: always 

    mongo-1:
        container_name: mongo-1
        image: mongo:4
        ports:
            - 30101:27017
        command: mongod --replSet cnf-serv --port 27017 --oplogSize 16 --bind_ip_all
        links:
            - mongo-2:mongo-2
            - mongo-3:mongo-3
        restart: always

    mongo-setup:
        container_name: mongo-setup
        image: mongo:4
        depends_on:
            - mongo-1
            - mongo-2
            - mongo-3
        links:
            - mongo-1:mongo-1
            - mongo-2:mongo-2
            - mongo-3:mongo-3
        volumes:
            - ./scripts:/scripts
        environment: 
            - MONGO1=mongo-1
            - MONGO2=mongo-2
            - MONGO3=mongo-3
            - RS=cnf-serv
            - PORT=27017
        entrypoint: [ "/scripts/setup.sh" ]

Настраиваемый скрипт:

#!/bin/bash 

mongodb1=`getent hosts ${MONGO1} | awk '{ print $1 }'`
mongodb2=`getent hosts ${MONGO2} | awk '{ print $1 }'`
mongodb3=`getent hosts ${MONGO3} | awk '{ print $1 }'`

port=${PORT:-27017}

echo "Waiting for startup.."
until mongo --host ${mongodb1}:${port} --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)' &>/dev/null; do
printf '.'
sleep 1
done

echo "Started.."

echo setup.sh time now: `date +"%T" `
mongo --host ${mongodb1}:${port} <<EOF
var cfg = {
        "_id": "${RS}",
        "protocolVersion": 1,
        "members": [
            {
                "_id": 100,
                "host": "${mongodb1}:${port}"
            },
            {
                "_id": 101,
                "host": "${mongodb2}:${port}"
            },
            {
                "_id": 102,
                "host": "${mongodb3}:${port}"
            }
        ]
    };
    rs.initiate(cfg, { force: true });
    rs.reconfig(cfg, { force: true });
EOF

Когда я пытаюсь подключиться к любому внешнему порту контейнера, у меня появляется то же сообщение об ошибке: Could not connect to MongoDB on the provided host and port

Как настроить внутренний кластер с помощью Docker?

1 Ответ

0 голосов
/ 04 января 2019

Набор реплик из 2 узлов не очень поможет; если один из узлов выходит из строя, то другой узел не может стать основным, потому что он не может получить большинство голосов на выборах. Вы получаете некоторое преимущество в том, что у вас есть полная копия данных на втором узле, но чтобы в полной мере использовать свой набор реплик (как избыточность, так и высокая доступность), вам необходимо добавить третий узел.

...