1 简介
官方3.4手册里明确说明,主从复制将被副本集全部替代,后续版本应该不在支持主从复制,因此建议不要主从复制了,直接用副本集。
IMPORTANT
Replica sets replace master-slave replication for most use cases. If possible, use replica sets rather than master-slave replication for all new production deployments. This documentation remains to support legacy deployments and for archival purposes only.
MongoDB的replica set架构是通过一个日志来存储写操作的,这个日志就叫做 oplog 。oplog.rs 是一个固定长度的 Capped Collection,它存在于local数据库中,用于记录replicaSets操作日志。在默认情况下,对于64位的MongoDB,oplog是比较大的,可以达到5%的磁盘空间,oplog的大小是可以通过mongod的
-oplogSize (单位:MB)来改变oplog的日志大小。
–smallfiles 声明使用更小的默认文件。
经测试,mongo3 shell无法连接到mongo4。
在docker中部署副本集需要考虑容器的ip问题,可以使用命令 “docker exec 6bc cat /etc/hosts” 得到容器IP,
再用 “rs.initiate({_id: “rs”, members: [{_id: 0, host: “x.x.x.x:27017″}] })” 初始化副本集。
如果使用的是 driver: overlay 网路,那么可以不去获取容器IP,直接用 “falmongo” 名字就好了。
2 Docker 镜像副本集设置
mongo-entrypoint.sh:
#!/bin/bash _term() { # 测试请执行 docker stop <containerId>,会发送 SIGTERM 信号 echo "> mongod --shutdown --dbpath /data/db" mongod --shutdown --dbpath /data/db } trap _term HUP INT QUIT TERM set -e set -- $@ --dbpath /data/db --bind_ip 0.0.0.0 --port 27017 --replSet rs --oplogSize 128 echo ">>> starting mongo..." exec "$@" & child1=$! # 这里使用 wait 让 sleep 后台运行,以便在 sleep 时可以接收到 SIGTERM 信号。sleep 前台运行,调用 docker stop 是接收不到的。 # 运行速度慢的机器需要更久的 sleep sleep 30s & child2=$! wait $child2 echo ">>> set docker ip to replica set ..." #ipAddr=$(cat /etc/hosts | grep `hostname` | awk '{print $1}') #echo '>>> hostname:' $ipAddr echo ">>> initiate replica set..." mongo ${USR_LOCAL_BIN}/script.js echo ">>> initialization is finished." wait $child1
script.js:
rs.initiate({_id: "rs", members: [{_id: 0, host: "falmongo:27017"}] });