环境
系统:mac os x
Docker :18.09.0
MongoDB安装:https://www.jianshu.com/p/cd146d07e153
Deploy a Replica Set 搭建一个复制集(副本集)
-
在mongodb_test目录下创建mongo1,mongo2,mongo3三个目录,用于存放配置文件和mongodb数据库的数据。分别在这三个目录下创建mongo1.conf,mongo2.conf,mongo3.conf三个配置文件,内容暂时为空。
创建三个mongodb实例,分别为test-mongo1,test-mongo2,test-mongo3。
docker run -p 28001:27017 --name test-mongo1 -v /Users/gzh/Desktop/测试项目/mongodb_test/mongo1:/etc/mongo -v /Users/gzh/Desktop/测试项目/mongodb_test/mongo1:/data/db -d mongo:4.0 --config /etc/mongo/mongo1.conf
docker run -p 28002:27017 --name test-mongo2 -v /Users/gzh/Desktop/测试项目/mongodb_test/mongo2:/etc/mongo -v /Users/gzh/Desktop/测试项目/mongodb_test/mongo2:/data/db -d mongo:4.0 --config /etc/mongo/mongo2.conf
docker run -p 28003:27017 --name test-mongo3 -v /Users/gzh/Desktop/测试项目/mongodb_test/mongo3:/etc/mongo -v /Users/gzh/Desktop/测试项目/mongodb_test/mongo3:/data/db -d mongo:4.0 --config /etc/mongo/mongo3.conf
cd mongo1
vi mongo1.conf
- 编辑mongo1.conf,mongo2.conf,mongo3.conf配置文件
replSet = replSetOne // "replSet"为复制集的名称
- 通过docker inspect 得到每个mongodb容器的IPAddress
如下,是mongo2的IPAddress
- 进入mongo1(以mongo1为主节点)容器,连接mongodb服务,配置复制集信息
docker exec -it mongo1 bash //进入容器
mongo //连接mongodb
rs.initiate( {
_id : "replSetOne",
members: [
{ _id: 0, host: "172.17.0.3:27017" }, //mongo1
{ _id: 1, host: "172.17.0.4:27017" }, //mongo2
{ _id: 2, host: "172.17.0.5:27017" } //mongo3
]
})
- 查看复制集信息
rs.status()
- 判断是否是主节点
db.isMaster()
-
验证复制集
主节点插入数据,(只有主节点可以写入数据)从节点会复制主节点的数据
- 重新选举
关掉mongo1服务,查看复制集状态
docker stop test-mongo1
rs.status()
可以看到mongo2变成了PRIMARY主节点,mongo2的权限提升到可以写入数据了
- 故障恢复
重新启动mongo1
docker start test-mongo1
可以看到复制集的所有成员节点数据是同步的。