侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

MongoDB 初始化副本集的同步流程

zze
zze
2021-01-04 / 0 评论 / 0 点赞 / 708 阅读 / 3193 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

副本集中的成员启动之后,就会检查自身状态,确定是否可以从某个成员那里进行同步。如果不行的话,它会尝试从副本的另一个成员那里进行完整的数据复制。这个过程就是初始化同步(initial syncing),包括几个步骤,可以从 mongod 的日志中看到。

1、首先,这个成员会做一些记录前的准备工作:选择一个成员作为同步源,在 local.me 中为自己创建一个标识符,删除所有已存在的数据库,以一个全新的状
态开始进行同步:

Mon Jan 30 11:09:18 [rsSync] replSet initial sync pending
Mon Jan 30 11:09:18 [rsSync] replSet syncing to: server-1:27017
Mon Jan 30 11:09:18 [rsSync] build index local.me { _id: 1 }
Mon Jan 30 11:09:18 [rsSync] build index done 0 records 0 secs
Mon Jan 30 11:09:18 [rsSync] replSet initial sync drop all databases
Mon Jan 30 11:09:18 [rsSync] dropAllDatabasesExceptLocal 1

注意,在这个过程中,所有现有的数据都会被删除。应该只在不需要保留现有数据的情况下做初始化同步(或者将数据移到其他地方),因为 mongod 会首先
将现有数据删除。

2、然后是克隆(cloning),就是将同步源的所有记录全部复制到本地。这通常是整个过程中最耗时的部分:

Mon Jan 30 11:09:18 [rsSync] replSet initial sync clone all databases
Mon Jan 30 11:09:18 [rsSync] replSet initial sync cloning db: db1
Mon Jan 30 11:09:18 [fileAllocator] allocating new datafile /data/db/db1.ns,
filling with zeroes...

3、然后就进入 oplog 同步的第一步,克隆过程中的所有操作都会被记录到 oplog 中。如果有文档在克隆过程中被移动了,就可能会被遗漏,导致没有被克隆,
对于这样的文档,可能需要重新进行克隆:

Mon Jan 30 15:38:36 [rsSync] oplog sync 1 of 3
Mon Jan 30 15:38:36 [rsBackgroundSync] replSet syncing to: server-1:27017
Mon Jan 30 15:38:37 [rsSyncNotifier] replset setting oplog notifier to server-1:27017
Mon Jan 30 15:38:37 [repl writer worker 2] replication update of non-mod failed: { ts: Timestamp 1352215827000|17, h: -5618036261007523082, v: 2, op: "u", ns: "db1.someColl", o2: { _id: ObjectId('50992a2a7852201e750012b7') }, o: { $set: { count.0: 2, count.1: 0 } } }
Mon Jan 30 15:38:37 [repl writer worker 2] replication info adding missing object
Mon Jan 30 15:38:37 [repl writer worker 2] replication missing object not found on source. presumably deleted later in oplog

上面是一个比较粗略的日志,显示了有文档需要重新克隆的情况。在克隆过程中也可能不会遗漏文档,这取决于流量等级和同步源上的操作类型。

4、接下来是 oplog 同步过程的第二步,用于将第一个 oplog 同步中的操作记录下来。

Mon Jan 30 15:39:41 [rsSync] oplog sync 2 of 3

这个过程比较简单,也没有太多的输出。只有在没有东西需要克隆时,这个过程才会与第一个不同。

5、到目前为止,本地的数据应该与主节点在某个时间点的数据集完全一致了,可以开始创建索引了。如果集合比较大,或者要创建的索引比较多,这个过程会
很耗时间:

Mon Jan 30 15:39:43 [rsSync] replSet initial sync building indexes
Mon Jan 30 15:39:43 [rsSync] replSet initial sync cloning indexes for : db1
Mon Jan 30 15:39:43 [rsSync] build index db.allObjects { someColl: 1 }
Mon Jan 30 15:39:44 [rsSync] build index done. scanned 209844 total records.
1.96 secs

6、如果当前节点的数据仍然远远落后于同步源,那么 oplog 同步过程的最后一步就是将创建索引期间的所有操作全部同步过来,防止该成员成为备份节点。

Tue Nov 6 16:05:59 [rsSync] oplog sync 3 of 3

7、现在,当前成员已经完成了初始化同步,切换到普通同步状态,这时当前成员就可以成为备份节点了:

Mon Jan 30 16:07:52 [rsSync] replSet initial sync done
Mon Jan 30 16:07:52 [rsSync] replSet syncing to: server-1:27017
Mon Jan 30 16:07:52 [rsSync] replSet SECONDARY

如果想跟踪初始化同步过程,最好的方式就是查看服务器日志。

0

评论区