副本集数据同步
为了维护共享数据集的最新副本,副本集的从节点同步或从其他节点复制数据。MongoDB 使用两种形式的数据同步:初始同步用完整数据集填充新节点,复制将持续更改应用到整个数据集。
初始同步
初始同步将所有数据从副本集的一个节点复制到另一个节点。看初始同步源选择有关初始同步源选择标准的更多信息。
从 MongoDB 4.4 开始,您可以使用initialSyncSourceReadPreference
参数指定首选的初始同步源。该参数只能在启动时指定 mongod
。
从 MongoDB 5.2 开始,初始同步可以是逻辑的或基于文件副本的。
逻辑初始同步过程
当您执行逻辑初始同步时,MongoDB:
- 克隆除本地数据库之外的所有数据库。为了克隆,
mongod
扫描每个源数据库中的每个集合并将所有数据插入到这些集合的它自己的副本中。 - 在为每个集合复制文档时构建所有集合索引。
- 在数据复制期间拉取新添加的 oplog 记录。确保目标节点在
local
数据库中有足够的磁盘空间来临时存储这些 oplog 记录在此数据复制阶段的持续时间。 - 将所有更改应用于数据集。使用来自源的操作日志,
mongod
更新其数据集以反映副本集的当前状态。
当初始同步完成时,成员从 过渡 STARTUP2
到SECONDARY
。
要执行初始同步,请参阅 重新同步副本集的成员。
基于文件复制的初始同步
仅在 MongoDB Enterprise 中可用。
基于文件复制的初始同步通过在文件系统上复制和移动文件来运行初始同步过程。这种同步方法可以比 逻辑初始同步。
IMPORTANT
基于文件副本的初始同步可能会导致计数不准确
基于文件副本的初始同步完成后,如果您在 count()
没有查询谓词的情况下运行该方法,则返回的文档计数可能不准确。
没有查询谓词的count
方法如下所示: db.<collection>.count()
。
要了解更多信息,请参阅没有查询谓词的不准确计数。
启用基于文件复制的初始同步
要启用基于文件复制的初始同步,请将 initialSyncMethod
参数设置fileCopyBased
为初始同步的目标节点。该参数只能在启动时设置。
行为
基于文件副本的初始同步将local
正在同步的节点上的数据库替换为正在同步的节点的local
数据库。
限制
- 在基于文件复制的初始同步期间:
- 您不能对同步到的节点或同步自的节点运行备份。
- 您不能写入
local
正在同步到的节点上的数据库。
- 您一次只能从一个给定的节点运行初始同步。
- 使用加密存储引擎时,MongoDB 使用源密钥加密目标。
容错
如果执行初始同步的从节点在同步过程中遇到非暂时性 (即持久性)网络错误,则从节点从头开始重新启动初始同步过程。
从 MongoDB 4.4 开始,如果被瞬态(即临时)网络错误、集合删除或集合重命名中断,则执行初始同步的从节点可以尝试恢复同步过程。同步源还必须运行 MongoDB 4.4 以支持可恢复的初始同步。如果同步源运行 MongoDB 4.2 或更早版本,从节点必须重新启动初始同步过程,就好像它遇到了非暂时性网络错误一样。
默认情况下,从节点尝试恢复初始同步 24 小时。MongoDB 4.4 添加了 initialSyncTransientErrorRetryPeriodSeconds
服务器参数,用于控制从节点尝试恢复初始同步的时间量。如果从节点在配置的时间段内无法成功恢复初始同步过程,它会从副本集中选择一个新的健康源并从头开始重新启动初始同步过程。
10
次要尝试在返回致命错误之前多次重新启动初始同步。
初始同步源选择
初始同步源选择取决于 mongod
启动参数 的值initialSyncSourceReadPreference
(4.4 新增):
- 对于
initialSyncSourceReadPreference
设置为primary
(默认情况下chaining
禁用),选择主要 作为同步源。如果主节点不可用或无法访问,请记录错误并定期检查主节点的可用性。 - 对于
initialSyncSourceReadPreference
设置为primaryPreferred
(投票副本集节点的默认值),尝试选择主节点作为同步源。如果主节点不可用或无法访问,则从剩余的副本集节点中执行同步源选择。 - 对于所有其他支持的读取模式,从副本集节点执行同步源选择。
执行初始同步源选择的节点通过所有副本集节点的列表进行两次传递:
在选择初始同步源的第一遍时,节点将以下条件应用于每个副本集节点:
- 同步源必须处于
PRIMARY
或SECONDARY
复制状态。 - 同步源必须在线且可访问。
- 如果
initialSyncSourceReadPreference
是secondary
或secondaryPreferred
,则同步源必须是从节点 - 同步源必须是
visible
. - 同步源必须在
30
主节点上最新的 oplog 条目的几秒钟内。 - 如果是节点
builds indexes
,则同步源必须 建立索引。 - 如果节点
votes
在副本集选举中,同步源也必须投票。 - 如果节点不是
delayed member
则同步源不得延迟。 - 如果节点是
delayed member
则同步源必须具有较短的配置延迟。 - 同步源必须比当前最佳同步源更快(即延迟更低)。
如果在第一遍之后没有候选同步源剩余,则该节点执行具有宽松标准的第二遍。请参阅同步源选择(第二遍)。
如果节点在两次通过后无法选择初始同步源,它会记录一个错误并等待1
第二次,然后重新启动选择过程。从节点可以在出现错误退出之前多次mongod
重新启动初始同步源选择过程。10
在进行第二遍选择初始同步源时,成员将以下条件应用于每个副本集节点:
- 同步源必须处于
PRIMARY
或SECONDARY
复制状态。 - 同步源必须在线且可访问。
- 如果
initialSyncSourceReadPreference
是secondary
,则同步源必须是 从节点 - 如果节点
builds indexes
,则同步源必须建立索引。 - 同步源必须比当前最佳同步源更快(即延迟更低)。
如果节点在两次通过后无法选择初始同步源,它会记录一个错误并等待1
第二次,然后重新启动选择过程。从节点可以在出现错误退出之前多次mongod
重新启动初始同步源选择过程。10
复制
从节点在初始同步后连续复制数据。从节点从源同步中复制操作日志,并在异步过程中应用这些操作。
根据 ping 时间和其他节点复制状态的变化,从节点可以根据需要自动更改与源的同步。看复制同步源选择 有关同步源选择标准的更多信息。
[ 1 ] | 从 4.2 版开始,副本集的从节点现在会记录比慢速操作阈值应用时间更长的 oplog 条目。这些缓慢的 oplog 消息:记录在 diagnostic log .记录在REPL 带有文本的组件 下applied op: <oplog entry> took <num>ms 。不依赖于日志级别(无论是在系统级别还是组件级别)不要依赖于分析级别。可能受 影响slowOpSampleRate ,具体取决于您的 MongoDB 版本:在 MongoDB 4.2 中,这些慢速 oplog 条目不受slowOpSampleRate . 无论采样率如何,MongoDB 都会记录所有慢速 oplog 条目。在 MongoDB 4.4 及更高版本中,这些慢速 oplog 条目受slowOpSampleRate .探查器不会捕获慢速 oplog 条目。 |
---|---|
流复制
从 MongoDB 4.4 开始,来自源的同步将连续的oplog条目流发送到它们的同步从节点。流式复制减轻了高负载和高延迟网络中的复制滞后。它也是:
- 减少从从节点读取的陈旧性。
- 降低了由于主节点故障转移而丢失w:1的写操作的风险。
- 使用w: >1减少写操作的延迟
w: "majority"
(即任何需要等待复制的写关注)。
在 MongoDB 4.4 之前,从节点通过从源向其同步发出请求并等待响应来获取成批的oplog条目。这需要为每批oplog条目进行一次网络往返。MongoDB 4.4 添加了用于禁用流复制和使用旧复制行为的启动参数。如果从源同步有任何资源限制,或者如果您希望限制 MongoDB 对网络带宽的使用以进行复制,则将参数设置为 only。oplogFetcherUsesExhaust
oplogFetcherUsesExhaust
false
多线程复制
MongoDB 使用多线程批量应用写入操作以提高并发性。MongoDB 按文档 ID ( WiredTiger ) 对批次进行分组,并使用不同的线程同时应用每组操作。MongoDB 始终按照原始写入顺序将写入操作应用于给定文档。
如果读取发生在应用复制批处理的从节点上,则以辅助节点为目标并配置读取关注级别 "local"
或 "majority"
从数据的WiredTiger快照读取的读取操作。
从快照读取保证了数据的一致视图,并允许读取与正在进行的复制同时发生而无需锁定。因此,需要这些读取关注级别的辅助读取不再需要等待应用复制批次,并且可以在收到它们时进行处理。
流量控制
从 MongoDB 4.2 开始,管理员可以限制主数据库应用其写入的速率,目的是将majority committed
延迟保持在可配置的最大值以下flowControlTargetLagSeconds
。
默认情况下,流量控制是enabled
.
笔记
为了进行流量控制,副本集/分片集群必须具有:featureCompatibilityVersion (FCV)和
4.2
read concernmajority enabled
。4.2
也就是说,如果 FCV 不是,或者如果读取关注多数被禁用,则启用的流量控制无效。有关详细信息,请参阅流量控制。
复制同步源选择
复制同步源选择取决于副本集 chaining
设置:
- 启用链接(默认),从副本集节点执行同步源选择。
- 在禁用链接的情况下,选择主节点作为同步源。如果主服务器不可用或无法访问,请记录错误并定期检查主服务器的可用性。
执行复制同步源选择的成员通过所有副本集成员的列表进行两次传递:
第一遍:
在选择初始同步源的第一遍时,节点将以下条件应用于每个副本集节点:
- 同步源必须处于
PRIMARY
或SECONDARY
复制状态。 - 同步源必须在线且可访问。
- 如果
initialSyncSourceReadPreference
是secondary
或secondaryPreferred
,则同步源必须是从节点 - 同步源必须是
visible
. 同步源必须在
30
主节点上最新的 oplog 条目的几秒钟内。- 如果是节点
builds indexes
,则同步源必须 建立索引。
- 如果是节点
如果节点
votes
在副本集选举中,同步源也必须投票。- 如果节点不是,
delayed member
则同步源不得延迟。 - 如果节点是,
delayed member
则同步源必须具有较短的配置延迟。 - 同步源必须比当前最佳同步源更快(即延迟更低)。
如果在第一遍之后没有候选同步源剩余,则该节点执行具有宽松标准的第二遍。请参阅同步源选择(第二遍)。
如果节点在两次通过后无法选择初始同步源,它会记录一个错误并等待1
第二次,然后重新启动选择过程。从节点可以在出现错误退出之前多次mongod
重新启动初始同步源选择过程。10
第二关
在进行第二遍选择初始同步源时,节点将以下条件应用于每个副本集节点:
- 同步源必须处于
PRIMARY
或SECONDARY
复制状态。 - 同步源必须在线且可访问。
- 如果
initialSyncSourceReadPreference
是secondary
,则同步源必须是 次要的。 - 如果是成员
builds indexes
,则同步源必须建立索引。 - 同步源必须比当前最佳同步源更快(即延迟更低)。
如果节点在两次通过后无法选择初始同步源,它会记录一个错误并等待1
第二次,然后重新启动选择过程。从节点可以在出现错误退出之前多次mongod
重新启动初始同步源选择过程。10
如果在第一遍之后没有候选同步源剩余,则该节点执行具有宽松标准的第二遍。请参阅同步源选择(第二遍)。
如果节点在两次通过后无法选择同步源,它会记录一个错误并等待1
第二次,然后再重新启动选择过程。
每小时可以更改源的次数可通过设置maxNumSyncSourceChangesPerHour
参数进行配置。
NOTE
从 MongoDB 4.4 开始, 在选择初始同步源时,启动参数
initialSyncSourceReadPreference
优先于副本集的设置。settings.chainingAllowed
副本集成员成功执行初始同步后,将遵循chainingAllowed
选择复制同步源时的值。看初始同步源选择有关初始同步源选择的更多信息。
原文链接 -https://docs.mongodb.com/manual/core/replica-set-sync/
译者:陆文龙