Docker搭建mongodb主从结构

Posted user_IaP54NlE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker搭建mongodb主从结构相关的知识,希望对你有一定的参考价值。

本文目的是学习mongodb,使用docker搭建一主二从的replica set,并且保证在宿主机上通过golang driver能成功连接到该结构。
有如下目录结构:

.
├── config
│   └── config.sh
└── docker-compose.yml

其中docker-compose.yml文件内容如下:

version: "3.8"

services:

    mongo_setup:
        image: mongo:5.0.0
        hostname: mongo_setup
        container_name: mongo_setup
        volumes: 
            - ./config:/rs_config
        entrypoint: /usr/bin/bash /rs_config/config.sh
        restart: "no"
        networks:
            - mongo_net
        depends_on:
            - mongo1
            - mongo2
            - mongo3

    mongo1:
        image: mongo:5.0.0
        hostname: mongo1
        container_name: mongo1
        entrypoint: /usr/bin/mongod --port 27117 --replSet "rs0" --bind_ip_all
        ports: 
            - 27117:27117
        networks:
            - mongo_net
        restart: on-failure

    mongo2:
        image: mongo:5.0.0
        hostname: mongo2
        container_name: mongo2
        entrypoint: /usr/bin/mongod --port 27217 --replSet "rs0" --bind_ip_all
        ports: 
            - 27217:27217
        networks:
            - mongo_net
        restart: on-failure
        
    mongo3:
        image: mongo:5.0.0
        hostname: mongo3
        container_name: mongo3
        environment: 
            - RS_NAME=rs0
        entrypoint: /usr/bin/mongod --port 27317 --replSet "rs0" --bind_ip_all
        ports: 
            - 27317:27317
        networks:
            - mongo_net
        restart: on-failure


networks:
    mongo_net:

实际上是在3个容器中启动mongod实例,然后再使用一个容器来初始化集群。

config.sh是用于配置主从的脚本,内容如下:

#/bin/bash

RS_NAME=rs0
MASTER=mongo1
REPLICA_1=mongo2
REPLICA_2=mongo3

until mongosh --host $MASTER --port 27117 --quiet <<EOF
exit
EOF
do
  sleep 5
done


mongosh --host $MASTER --port 27117 --quiet <<EOF
rs.initiate(
  {
     _id: "$RS_NAME",
     version: 1,
     members: [
        { _id: 0, host : "${MASTER}:27117", priority: 2 },
        { _id: 1, host : "${REPLICA_1}:27217", priority: 1 },
        { _id: 2, host : "${REPLICA_2}:27317", priority: 1 }
     ]
  }
)
EOF

按如上配置,就可以使用docker-compse up启动该主从实例。
不过,如果在宿主机上使用golang driver来连接该实例,会发生错误,原因在于,连接到master后,master返回其他副本的信息,而后客户端尝试连接其他副本,而由于宿主机与副本不在同一个网络里,因此无法成功通信。
解决的办法是配置宿主机的host,利用hosts文件来帮助宿主机解析其他副本的地址,增加下面几行:

# for mongodb replica
127.0.0.1  mongo1
127.0.0.1  mongo2
127.0.0.1  mongo3

OK.

以上是关于Docker搭建mongodb主从结构的主要内容,如果未能解决你的问题,请参考以下文章

Docker搭建MySQL主从集群,基于GTID

Docker搭建redis主从+哨兵

Docker Mysql主从同步配置搭建Demo

MongoDB主从

MongoDB 集群搭建(主从复制副本及)

MongoDB--架构搭建(主从副本集)之主从