第九章 创建副本集
1 复制简介
- 使用复制可以将数据副本保存到多台服务器上,保证应用程序正常运行与数据安全
- 创建一个副本集就可以使用复制功能
- 副本集是一组服务器,一个主服务器用于处理客户端请求,多个备份服务器用于保存主服务器数据副本
主服务器崩溃,备份服务器会自动将一个成员升级为主服务器
- 原理图
2 副本集建立与配置
- 参考这篇博客
3 设计副本集
-
推荐的配置方式
- 将
大多数
成员放在一个主数据中心,其它的作为备份数据中心 - 两个数据中心各自放置相等的成员,第三个地方放置一个决定胜负的副本集成员
- 将
-
MongoDB 只支持单一主节点
-
选举机制
- 备份节点无法与主节点连通时,就会请求自己被选举为主节点(即主节点候选人)
- 其他成员会进行三项理性检测:
- 自身是否与主节点连通
- 候选人数据是否最新
- 有无更高优先级的候选人
- 一张否决票相当于 -1000 张赞成票
4 成员配置选项
-
选举仲裁者
- 仲裁者(arbiter)唯一作用是参与选举,不保存数据,也不为客户端提供服务
- 最多只能有一个仲裁者
- 尽可能使用奇数个成员,而不要使用仲裁者
-
优先级
- 优先级表示一个成员渴望成为主节点的程度
- 取值范围
0 ~ 100
,默认为 1 - 优先级为 0 的成员为被动成员,永远不会成为主节点
- 拥有最高优先级的成员会优选选举为主节点
- 优先值只影响副本集成员间的相对优先级大小关系
-
隐藏成员
- 客户端不会向隐藏成员发请求
- 隐藏成员不会作为复制源
- 可以将不够强大的服务器或备份服务器隐藏
-
延迟备份节点
- 延迟备份节点会比主节点延迟指定时间(单位秒)
- 可使用
slaveDelay
设置,成员优先级必须是 0 - 应避免请求到备份节点
第十章 副本集的组成
1 同步
- MongoDB 的复制功能是使用操作日志 oplog 实现的,其包含主节点的每一次写操作
- oplog 是主节点的 local 数据库中的一个固定集合
- 备份节点查询 oplog 集合即可得知需要进行的复制操作
- 每个备份节点维护着自己的 oplog,记录每一次从主节点复制数据的操作
- 每个成员都可以作为同步源供其他成员使用
2 心跳
-
为维护集合的最新视图,每个成员每隔2秒就会向其他成员发送一个
心跳请求
,用于检查每个成员的状态 -
心跳最重要功能之一就是让主节点知道自己是否满足“大多数”的条件,如果不满足则自动退位,变为备份节点
-
成员状态
- STARTUP(0):刚启动,加载成员的副本集配置
- PRIMARY(1)
- SECONDARY(2)
- RECOVERING(3):正常运行,不可处理读取请求
- STARTUP2(5):同步初始化,持续几秒
- UNKNOW(6从集合中另一个成员的角度来看,该成员的状态未知
- ARBITER(7):仲裁者的状态
- DOWN(8):从集合的另一个成员看,该成员是不可访问
- ROLLBACK(9):数据回滚。回滚结束时,服务器会转为RECOVERING状态,成为备份节点
- REMOVED(10):成员被移出副本集
3 回滚
-
服务器从另一个成员进行同步,发现无法在同步源中找到自己的最后一次操作。此时切换到
ROLLBACK
进行回滚 -
服务器找到两个 oplog 的一个共同点,撤销同步点后的操作,回滚完成后进入
RECOVERING
进行正常同步 -
回滚失败
- 回滚数据量大于 300 MB 或 回滚时间超过 30 分钟会导致回滚失败
- 回滚失败的节点必须重新同步