【问题标题】:Configuring a MongoDB Cluster配置 MongoDB 集群
【发布时间】:2018-10-30 13:38:32
【问题描述】:

我应该配置一个有两个节点的 mongodb 集群。每个节点都应该复制所有数据。如果一台服务器死机,另一台应假定为主服务器。

在配置集群之前,我正在使用 docker 实例进行本地测试来配置它。 As I saw in the documentation,我应该至少有 3 个 MongoDB 实例。对吗?

首先我使用 docker 创建了树实例,我将实例配置为主要实例。下面的代码是我的 docker compose 和配置脚本。

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 配置内部集群?

【问题讨论】:

  • 在 setup.sh 中等待几秒钟。在容器成功启动并出现可供依赖项使用后,Mongodb 需要一些时间来启动并开始监听端口。

标签: mongodb docker cluster-computing mongodb-replica-set


【解决方案1】:

2 节点副本集不会有太大帮助;如果其中一个节点出现故障,则另一个节点无法接任主节点,因为它无法在选举中获得多数票。您可以获得一些好处,因为您在第二个节点上拥有数据的完整副本,但要获得副本集的全部好处(冗余和高可用性),您需要添加第三个节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2019-12-27
    • 2013-05-16
    • 2016-05-22
    • 2013-11-26
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多