新节点加入时 initial sync 做了哪几步?怎么看进度?期间的写入会不会丢?这篇给副本集加一个新成员,记录状态、进度、日志,最后用 dbHash 核对数据。
成员状态变化(距加入的秒数): [(0.01, 'STARTUP'), (0.78, 'STARTUP2'), (2.55, 'SECONDARY')] initial sync 总耗时约 2.5 s(数据 121 MB);同步期间 primary 上并发写入了 278 轮(每轮一个 $inc 加一个 insert)
新成员依次经过 STARTUP、STARTUP2(正在 initial sync)、SECONDARY。
initialSyncStatus 的键: ['appliedOps', 'approxTotalBytesCopied', 'approxTotalDataSize', 'bytesPerSecond', 'databases', 'failedInitialSyncAttempts', 'initialSyncAttempts', 'initialSyncOplogFetchingStart', 'initialSyncOplogStart', 'initialSyncStart', 'maxFailedInitialSyncAttempts', 'method', 'phase', 'remainingInitialSyncEstimatedMillis', 'totalAttempts', 'totalInitialSyncElapsedMillis', 'totalTimeUnreachableMillis']
method = logical;maxFailedInitialSyncAttempts = 10;failedInitialSyncAttempts = 0
距加入 已复制 总量 复制速度 已应用的 oplog
0.78 s 0.0 MB 120.8 MB 0.0 MB/s 0
1.03 s 15.5 MB 120.8 MB 0.0 MB/s 0
1.28 s 62.0 MB 120.8 MB 0.0 MB/s 0
1.54 s 108.5 MB 120.8 MB 0.0 MB/s 0
1.79 s 120.7 MB 120.8 MB 0.0 MB/s 0
2.04 s 120.7 MB 120.8 MB 0.0 MB/s 0replSetGetStatus 里的 initialSyncStatus 有 approxTotalBytesCopied、approxTotalDataSize、appliedOps 等字段;方式是 logical(逐个集合复制)。
11:42:41.795 Initial sync required. Attempting to start initial sync... 11:42:41.803 Initial sync started 11:42:41.803 Starting initial sync attempt 11:42:41.816 Initial syncer oplog truncation finished 11:42:41.910 About to abort all running index builders 11:42:41.931 Failed to refresh key cache 11:42:43.419 Writing to the oplog and applying operations until stopTimestamp before initial sync can complete 11:42:43.429 Finished fetching oplog during initial sync 11:42:43.430 Initial sync attempt finishing up 11:42:43.430 Initial sync status and statistics 11:42:43.447 Initial sync done
从 “Initial sync required” 到 “Writing to the oplog and applying operations until stopTimestamp” 再到 “Initial sync done”。
primarybig=600,000 small=1000 live=278 dbHash(big)=5b2ec3035bfb… dbHash(live)=8ede2cb02f76… 新成员 big=600,000 small=1000 live=278 dbHash(big)=5b2ec3035bfb… dbHash(live)=8ede2cb02f76…
同步期间 primary 上并发的写入也被带过来,完成后 dbHash 完全相同。
primary oplog 最早 ts = Timestamp(1791776557, 1);新成员 oplog 最早 ts = Timestamp(1791776561, 130);primary oplog 条目数 1,784,新成员 429
新成员的 oplog 只从同步点开始,没有更早的历史,所以更早的 change stream token 在它上面恢复不了。
数据只剩几千个文档:新成员 2.0 s 就进入 SECONDARY(对比 121 MB 时的 2.5 s)
即使数据很少也有约 2 秒的固定开销;数据多时主要是复制数据的时间。