免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1244 | 回复: 0
打印 上一主题 下一主题

[MongoDB] Mongodb复制集数据同步流程 [复制链接]

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-24 18:20 |只看该作者 |倒序浏览
Mongodb复制集里的Secondary会从Primary上同步数据,以保持副本集所有节点的数据保持一致,数据同步主要包含2个过程

initial sync
replication (oplog sync)
先通过init sync同步全量数据,再通过replication不断重放Primary上的oplog同步增量数据。

initial sync

Secondary启动后,如果满足以下条件之一,会先进行initial sync

Secondary上oplog为空,比如新加入的空节点
local.replset.minvalid集合里_initialSyncFlag标记被设置。当initial sync开始时,同步线程会设置该标记,当initial sync结束时清除该标记,故如果initial sync过程中途失败,节点重启后发现该标记被设置,就知道应该重新进行initial sync。
BackgroundSync::_initialSyncRequestedFlag被设置。当向节点发送resync命令时,该标记会被设置,此时会强制重新initial sync。
** initial sync同步流程 **

minValid集合设置_initialSyncFlag
获取同步源当前最新的oplog时间戳t0
从同步源Clone所有的集合数据
获取同步源最新的oplog时间戳t1
同步t0~t1所有的oplog
获取同步源最新的oplog时间戳t2
同步t1~t2所有的oplog
从同步源读取index信息,并建立索引
获取同步源最新的oplog时间戳t3
同步t2~t3所有的oplog
minValid集合清除_initialSyncFlag,initial sync结束
replication (sync oplog)

initial sync结束后,Secondary会建立到Primary上local.oplog.rs的tailable cursor,不断从Primary上获取新写入的oplog,并应用到自身。

Tailable cursor每次会获取到一批oplog,Secondary采用多线程重放oplog以提高效率,通过将oplog按照所属的namespace进行分组,划分到多个线程里,保证同一个namespace的所有操作都由一个线程来replay,以保证统一namespace的操作时序跟primary上保持一致(如果引擎支持文档锁,只需保证同一个文档的操作时序与primary一致即可)。

同步场景分析

1. 副本集初始化

初始化选出Primary后,此时Secondary上无有效数据,oplog是空的,会先进行initial sync,然后不断的应用新的oplog

2. 新成员加入

因新成员上无有效数据,oplog是空的,会先进行initial sync,然后不断的应用新的oplog

3. 有数据的节点加入

有数据的节点加入有如下情况

该节点与副本集其他节点断开连接,一段时间后恢复
该节点从副本集移除(处于REMOVED)状态,通过replSetReconfig命令将其重新加入
其他? 因同一个副本集的成员replSetName配置必须相同,除非有误配置,应该不会有其他场景
此时,如果该节点最新的oplog时间戳,比所有节点最旧的oplog时间戳还要小,该节点将找不到同步源,会一直处于RECOVERING而不能服务;反之,如果能找到同步源,则直接进入replication阶段,不断的应用新的oplog。

因oplog太旧而处于RECOVERING的节点目前无法自动恢复,需人工介入处理(故设置合理的oplog大小非常重要),最简单的方式是发送resync命令,让该节点重新进行initial sync。

参考资料

Replica Set Data Synchronization
Resync a Member of a Replica Set
Create tailable cursor
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP