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

11 篇文章 0 订阅
9 篇文章 1 订阅

实验目标

两台服务器
主要使用服务器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中目录结构如图
在这里插入图片描述

132中目录结构如图
在这里插入图片描述
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()
    

    在这里插入图片描述
    发现这里显示 NotYetInitialized 说明还没有初始化,这样就没问题。

    接下来用同样的方法启动131的节点
    在这里插入图片描述
    启动完成后发现显示了 PRIMARY 说明131启动后进入的是主节点
    查看副本集状态
    在这里插入图片描述
    看到了

    “ok”:1,

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

    这时再回到132
    在这里插入图片描述
    发现变成了SECONDARY说明成功的成为了从节点。
    再查看副本集的结果发现和131显示的相同,没有问题,至此安装成功。

模拟宕机

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

重启Vmware 131的服务器。
在这里插入图片描述
在重启过程中发现132从SECONDARY变成里PRIMARY,升级成功。
当131重启完毕后,132又从PRIMARY变成了SECONDARY,说明降级成功。

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

补充20201220

131资源占用太厉害,将131的30718,37019,关闭了试一下,修改配置

rs.reconfig({
	_id: "mongoReplSet",
	members: [{
			_id: 1,
			host: "192.168.79.131:37017",
			priority: 2
		}, {
			_id: 2,
			host: "192.168.79.132:37017",
			priority: 1
		}, {
			_id: 3,
			host: "192.168.79.132:37018",
			arbiterOnly: true
		}
	]
}, {
	"force": true
})

这时会显示失败,说_id和host冲突,先移除两个节点

rs.remove("192.168.79.132:37017")
rs.remove("192.168.79.132:37018")

再reconfig一下就可以正常使用了。

补充2020122019

132关闭后,发现131直接降级为从节点,而且远程连不上去了。
重新启动132,131又成为了主节点。

为了满足132关闭后,131还能继续使用。经实验,131至少得有3个节点,其中2个普通节点,1个选举节点。

参考

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值