MongoDB 副本集(Replica Set)

By | 2021年12月31日

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"}] });

发表评论

您的电子邮箱地址不会被公开。