一个主库,两个从库组成,主库宕机时,这两个从库都可以被选为主库。
当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主库恢复后,作为从库加入当前的复制集群即可。
准备环境,准备三台虚拟机: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: falseservices: 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
# 400权限是要保证安全性,否则mongod启动会 错# 存放目录随意,只要对应yaml文件中的地址即可。openssl rand -base64 756 > mongodb.keychmod 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 映射到容器内
启动
# 启动mongodbdocker-compose -f docker-compose-mongo.yaml up -d# 随意选择一台机器,进入mongo 容器docker exec -it mongo bash# 登录mongomongo -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()查看状态就能看到了。
通过rs.status()的输出我们就能分出哪个是PRIMARY节点了。
故障模拟,故障恢复
模拟和恢复比较简单,就是停止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
单独链接某一台机器测试
比如链接122 secondary机器,如下所示: 其他两台链接类似。
下一篇文章,搭建 docker-compose 搭建 mongodb 副本集分片(多机版),感兴趣的同学可以前往查看。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!