文章目录
实验目标
两台服务器
主要使用服务器A进行读写,每天需要定时重启。
服务器B只进行备份操作,不需要每天重启。
- 当服务器A重启时,服务器B能够自动升级成主节点。
- 当服务器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相同
操作步骤
-
生成mongodb.key,mongodb.key作为各个节点通信的密钥至关重要,4个节点需要用同一个key
openssl rand -base64 756 > mongodb.key chmod 400 mongodb.key
-
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 $$@
-
启动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,说明降级成功。
至此这次试验满足了预期要求。
参考
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