[Linux] docker-compose环境下mongoDB4.4.2副本集搭建

文章目录

实验目标

两台服务器
主要使用服务器A进行读写,每天需要定时重启。
服务器B只进行备份操作,不需要每天重启。

  1. 当服务器A重启时,服务器B能够自动升级成主节点。
  2. 当服务器A重启完成后,服务器B能够自动降级成从节点,服务器A成为主节点。

实验环境

Vmware安装的两台Ubuntu20.04.1服务器
ip地址是:192.168.79.131,192.168.79.132以下简称131和132
131安装3个mongo节点:端口号:37017(主节点),37018(从节点),37019(仲裁节点)
132安装2个mongo节点:端口号:37017(从节点),37018(仲裁节点)
共5个mongo节点

目录结构

131中目录结构如图
[Linux] docker-compose环境下mongoDB4.4.2副本集搭建

132中目录结构如图
[Linux] docker-compose环境下mongoDB4.4.2副本集搭建
37017,37018,37019存放mongo的数据
两台服务器中的mongodb.key相同

操作步骤

  1. 生成mongodb.key,mongodb.key作为各个节点通信的密钥至关重要,4个节点需要用同一个key

    openssl rand -base64 756 > mongodb.key
    chmod 400 mongodb.key
    
  2. 131中docker-compose.yml文件:

    version: '3.3'
    
    services:
      mongodb442-37017:
        image: mongo:4.4.2
        volumes:
          - ./37017/data/db:/data/db
          - ./mongodb.key:/data/mongodb.key
        user: root
        environment:
          - MONGO_INITDB_ROOT_USERNAME=3GXY9W7ONSF30E64
          - MONGO_INITDB_ROOT_PASSWORD=LMN8S35AG2JV0HGA
        container_name: mongodb442-37017
        ports:
          - 37017:27017
        command: mongod --replSet mongoReplSet --keyFile /data/mongodb.key
        restart: always
        entrypoint:
          - bash
          - -c
          - |
            chmod 400 /data/mongodb.key
            chown 999:999 /data/mongodb.key
            exec docker-entrypoint.sh $$@
      mongodb442-37018:
        image: mongo:4.4.2
        volumes:
          - ./37018/data/db:/data/db
          - ./mongodb.key:/data/mongodb.key
        user: root
        environment:
          - MONGO_INITDB_ROOT_USERNAME=3GXY9W7ONSF30E64
          - MONGO_INITDB_ROOT_PASSWORD=LMN8S35AG2JV0HGA
        container_name: mongodb442-37018
        ports:
          - 37018:27017
        command: mongod --replSet mongoReplSet --keyFile /data/mongodb.key
        restart: always
        entrypoint:
          - bash
          - -c
          - |
            chmod 400 /data/mongodb.key
            chown 999:999 /data/mongodb.key
            exec docker-entrypoint.sh $$@
      mongodb442-37019:
        image: mongo:4.4.2
        volumes:
          - ./37019/data/db:/data/db
          - ./mongodb.key:/data/mongodb.key
        user: root
        environment:
          - MONGO_INITDB_ROOT_USERNAME=3GXY9W7ONSF30E64
          - MONGO_INITDB_ROOT_PASSWORD=LMN8S35AG2JV0HGA
        container_name: mongodb442-37019
        ports:
          - 37019:27017
        command: mongod --replSet mongoReplSet --keyFile /data/mongodb.key
        restart: always
        entrypoint:
          - bash
          - -c
          - |
            chmod 400 /data/mongodb.key
            chown 999:999 /data/mongodb.key
            exec docker-entrypoint.sh $$@
      mongodb442-init:
        image: mongo:4.4.2
        depends_on:
          - mongodb442-37017
          - mongodb442-37018
        restart: on-failure:5
        command:
          - mongo
          - mongodb://3GXY9W7ONSF30E64:LMN8S35AG2JV0HGA@192.168.79.131:37017/admin
          - --eval
          - 'rs.initiate({_id:"mongoReplSet",members:[{_id:1,host:"192.168.79.131:37017",priority:3},{_id:2,host:"192.168.79.131:37018",priority:2},{_id:3,host:"192.168.79.131:37019",arbiterOnly:true},{_id:4,host:"192.168.79.132:37017",priority:1},{_id:5,host:"192.168.79.132:37018",arbiterOnly:true}]})'
      
    

    priority代表优先级,数字越大优先级越高,越有可能成为主节点
    arbiterOnly代表选举节点

    132中docker-compose.yml文件:

    version: '3.3'
    
    services:
      mongodb442-37017:
        image: mongo:4.4.2
        volumes:
          - ./37017/data/db:/data/db
          - ./mongodb.key:/data/mongodb.key
        user: root
        environment:
          - MONGO_INITDB_ROOT_USERNAME=3GXY9W7ONSF30E64
          - MONGO_INITDB_ROOT_PASSWORD=LMN8S35AG2JV0HGA
        container_name: mongodb442-37017
        ports:
          - 37017:27017
        command: mongod --replSet mongoReplSet --keyFile /data/mongodb.key
        restart: always
        entrypoint:
          - bash
          - -c
          - |
            chmod 400 /data/mongodb.key
            chown 999:999 /data/mongodb.key
            exec docker-entrypoint.sh $$@
      mongodb442-37018:
        image: mongo:4.4.2
        volumes:
          - ./37018/data/db:/data/db
          - ./mongodb.key:/data/mongodb.key
        user: root
        environment:
          - MONGO_INITDB_ROOT_USERNAME=3GXY9W7ONSF30E64
          - MONGO_INITDB_ROOT_PASSWORD=LMN8S35AG2JV0HGA
        container_name: mongodb442-37018
        ports:
          - 37018:27017
        command: mongod --replSet mongoReplSet --keyFile /data/mongodb.key
        restart: always
        entrypoint:
          - bash
          - -c
          - |
            chmod 400 /data/mongodb.key
            chown 999:999 /data/mongodb.key
            exec docker-entrypoint.sh $$@
      
    
  3. 启动mongo。

    首先启动132

    sudo docker-compose up -d && sudo docker-compose logs -f
    

    进入mongo查看副本集状态

    sudo docker exec -it mongodb442-37017 bash
    mongo -u 3GXY9W7ONSF30E64 -p LMN8S35AG2JV0HGA
    rs.status()
    

    [Linux] docker-compose环境下mongoDB4.4.2副本集搭建
    发现这里显示 NotYetInitialized 说明还没有初始化,这样就没问题。

    接下来用同样的方法启动131的节点
    [Linux] docker-compose环境下mongoDB4.4.2副本集搭建
    启动完成后发现显示了 PRIMARY 说明131启动后进入的是主节点
    查看副本集状态
    [Linux] docker-compose环境下mongoDB4.4.2副本集搭建
    看到了

    “ok”:1,

    而且显示的是docker-compose中输入的配置。说明没问题

    这时再回到132
    [Linux] docker-compose环境下mongoDB4.4.2副本集搭建
    发现变成了SECONDARY说明成功的成为了从节点。
    再查看副本集的结果发现和131显示的相同,没有问题,至此安装成功。

模拟宕机

当131宕机后,按理来说132中的mongo会成为主节点,顶替宕掉的主节点。

重启Vmware 131的服务器。
[Linux] docker-compose环境下mongoDB4.4.2副本集搭建
在重启过程中发现132从SECONDARY变成里PRIMARY,升级成功。
当131重启完毕后,132又从PRIMARY变成了SECONDARY,说明降级成功。

至此这次试验满足了预期要求。

参考

https://www.cnblogs.com/ricklz/p/13237419.html (主要参考)
http://www.361way.com/mongodb-forced-primary/1704.html
https://www.cnblogs.com/zhoujinyi/p/3554010.html

上一篇:mongo数据库的各种查询语句示例(比较全的)


下一篇:Docker / Podman 建立MongoDB 副本集群