本文转自张友东的文章,文章链接: http://www.mongoing.com/archives/2369
创新互联网站建设提供从项目策划、软件开发,软件安全维护、网站优化(SEO)、网站分析、效果评估等整套的建站服务,主营业务为成都网站设计、成都网站制作,成都app软件开发以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。创新互联深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
正好解释了我的问题,所以转发记录下
MongoDB复制集里的Secondary会从Primary上同步数据,以保持副本集所有节点的数据保持一致,数据同步主要包含2个过程:
先通过init sync同步全量数据,再通过replication不断重放Primary上的oplog同步增量数据。
Secondary启动后,如果满足以下条件之一,会先进行initial sync
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. 有数据的节点加入
有数据的节点加入有如下情况:
此时,如果该节点最新的oplog时间戳,比所有节点最旧的oplog时间戳还要小,该节点将找不到同步源,会一直处于RECOVERING而不能服务;反之,如果能找到同步源,则直接进入replication阶段,不断的应用新的oplog。
因oplog太旧而处于RECOVERING的节点目前无法自动恢复,需人工介入处理(故设置合理的oplog大小非常重要),最简单的方式是发送resync命令,让该节点重新进行initial sync。
张友东,就职于阿里云飞天技术部,主要关注分布式存储、NOSQL等技术领域,参与 TFS(淘宝分布式文件系统)、 AliCloudDB for redis等项目的开发工作,欢迎交流