docker-compose 部署 MongoDB副本集 多机版

发布时间:2021-11-14作者:laosun阅读(1262)

docker-compose

    一个主库,两个从库组成,主库宕机时,这两个从库都可以被选为主库。

    Image

    当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主库恢复后,作为从库加入当前的复制集群即可。

    Image

    准备环境,准备三台虚拟机:192.168.0.121、192.168.0.122、192.168.0.123

    然后我们使用以下yaml文件进行配置、安装、启动

    学习以下步骤前,建议先学习安装 docker-compose 安装 MongoDB和mongo-express可视化

    docker-compose.yaml文件

    version: '3.9'
    networks:
      mongo-network:
        external: false
    services:
      mongo:
        image: mongo:latest
        networks:
          - mongo-network
        container_name: mongo
        restart: always
        ports:
         - 27017:27017
        environment:
          MONGO_INITDB_ROOT_USERNAME: root
          MONGO_INITDB_ROOT_PASSWORD: root
        command: mongod --replSet rs0 --keyFile /mongodb.key
        volumes:
          - ${PWD}/data/db:/data/db
          - ${PWD}/data/configdb:/data/configdb
          - ${PWD}/mongodb.key:/mongodb.key
        entrypoint:
          - bash
          - -c
          - |
            chmod 400 /mongodb.key
            chown 999:999 /mongodb.key
            exec docker-entrypoint.sh $$@

    上图中的 --keyFile /mongodb.key 我们可以使用openssl进行生成。

    生成keyFile

    • MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。

    • keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。

    • 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。

    • 可以使用任意方法生成keyFile。例如,如下操作使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。

    # 400权限是要保证安全性,否则mongod启动会报错
    # 存放目录随意,只要对应yaml文件中的地址即可。
    openssl rand -base64 756 > mongodb.key
    chmod 400 mongodb.key

    每一个副本集成员都要使用相同的 keyFile 文件

    文件详解

    chown 999:999 /mongodb.key:999用户是容器中的mongod用户,通过chown修改文件用户权限

    mongod --replSet rs0 --keyFile /mongodb.key 启动命令,--replSet rs0 以副本集形式启动并将副本集名字命名为 rs0

    --keyFile /mongodb.key 设置keyFile,用于副本集通信,文件通过 volumes 映射到容器内

    启动

    # 启动mongodb docker-compose -f docker-compose-mongo.yaml up -d # 随意选择一台机器,进入mongo 容器 docker exec -it mongo bash # 登录mongo mongo -u root -p root

    查看状态

    # 查看状态
    rs.status()
    
    # 显示结果,表示目前是单台运行的程序,并没有副本集的概念
    > rs.status()
    {
      "ok" : 0,"errmsg" : "no replset config has been received","code" : 94,"codeName" : "NotYetInitialized"
    }

    配置副本集

    # 使用指令rs.initiate进行配置副本集 rs.initiate({ _id: "mongos",members: [{_id:1,host:"192.168.0.122:27017"}]}); # 一次性配置多个副本集如下所示: # rs.initiate({ _id: "mongos",members: [{_id:1,host:"192.168.0.121:27017"},{_id:2,host:"192.168.0.122:27017"}]}); # 注意下边的rs0,就是上边的配置的 --replSet rs0 rs.initiate(   {      _id: "rs0",      members: [         { _id: 0, host : "192.168.0.121:27017" },         { _id: 1, host : "192.168.0.122:27017" },         { _id: 2, host : "192.168.0.123:27017" }      ]   } ); # 显示结果 { "ok" : 1 } # 也可以单独添加 > rs.add("192.168.0.123:27017") {  "ok" : 1,"$clusterTime" : {    "clusterTime" : Timestamp(1593868399,"BZJ2tCwFE1NvE22/LwGzFTWy+1M="),"operationTime" : Timestamp(1593868399,1) }

    上面提示ok就是表示成功了,这时候会选举出Primary节点。重新通过rs.status()查看状态就能看到了。

    Image

    通过rs.status()的输出我们就能分出哪个是PRIMARY节点了。

    Image

    故障模拟,故障恢复

    模拟和恢复比较简单,就是停止primary 节点,然后mongodb会自动从secondary中选择一台晋升成primary。这里就不演示了

    Navicat 链接 副本集 MongoDB

    URI:  mongodb://root@192.168.0.121:27017,192.168.0.122:27017,192.168.0.123:27017/?replicaSet=rs0&readPreference=secondary&authSource=admin

    Image

    单独链接某一台机器测试

    比如链接122 secondary机器,如下所示: 其他两台链接类似。

    Image


0 +1

版权声明

 请文明留言

0 条评论