- MongoDB官方文档中文版
- MongoDB中文手册说明
- MongoDB简介
- 安装 MongoDB
- The mongo Shell
- MongoDB CRUD 操作
- 聚合
- 数据模型
- 事务
- 索引
- 安全
- 安全检查列表
- 启用访问控制
- 身份验证
- 基于角色的访问控制
- TLS / SSL(传输加密)
- 静态加密
- 客户端字段级加密
- 审计
- 网络和配置强化
- 实现字段级别修订
- 安全参考
- 附录
- 变更流
- 复制
- 分片
- 分片键
- 哈希分片
- 范围分片
- 区
- 管理分片区
- 按位置细分数据
- 用于更改SLA或SLO的分层硬件
- 按应用或客户细分数据
- 仅插入工作负载的分布式本地写入
- 管理分片区
- 使用块进行数据分区
- 在分片集群中拆分数据块
- 管理
- 存储
- 存储引擎
- 日志记录
- 管理日志记录
- GridFS
- FAQ:MongoDB 存储
- 存储引擎
- 参考
- 运算符
- 查询与映射运算符
- 更新运算符
- 聚合管道阶段
- 聚合管道操作符
- $abs (aggregation)
- $acos (aggregation)
- $acosh (aggregation)
- $add (aggregation)
- $addToSet (aggregation)
- $allElementsTrue (aggregation)
- $and (aggregation)
- $anyElementTrue (aggregation)
- $arrayElemAt (aggregation)
- $arrayToObject (aggregation)
- $asin (aggregation)
- $asinh (aggregation)
- $atan (aggregation)
- $atan2 (aggregation)
- $atanh (aggregation)
- $avg (aggregation)
- $ceil (aggregation)
- $cmp (aggregation)
- $concat (aggregation)
- $concatArrays (aggregation)
- $cond (aggregation)
- $convert (aggregation)
- $cos (aggregation)
- $dateFromParts (aggregation)
- $dateToParts (aggregation)
- $dateFromString (aggregation)
- $literal (aggregation)
- 查询修饰符
- 数据库命令
- 聚合命令
- 地理空间命令
- 查询和写操作命令
- 查询计划缓存命令
- 认证命令
- 用户管理命令
- 角色管理命令
- 复制命令
- 分片命令
- 会话命令
- 管理命令
- 诊断命令
- 免费监控命令
- 系统事件审计命令
- mongo Shell 方法
- 集合方法
- db.collection.aggregate()
- db.collection.bulkWrite()
- db.collection.copyTo()
- db.collection.count()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.createIndex()
- db.collection.createIndexes()
- db.collection.dataSize()
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.distinct()
- db.collection.drop()
- db.collection.dropIndex()
- db.collection.dropIndexes()
- db.collection.ensureIndex()
- db.collection.explain()
- db.collection.find()
- db.collection.findAndModify()
- db.collection.findOne()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.getIndexes()
- db.collection.getShardDistribution()
- db.collection.getShardVersion()
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
- db.collection.isCapped()
- db.collection.latencyStats()
- db.collection.mapReduce()
- db.collection.reIndex()
- db.collection.remove()
- db.collection.renameCollection()
- db.collection.replaceOne()
- db.collection.save()
- db.collection.stats()
- db.collection.storageSize()
- db.collection.totalIndexSize()
- db.collection.totalSize()
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.watch()
- db.collection.validate()
- 词汇表
- 默认的MongoDB端口
- 默认的MongoDB读/写关注
- 服务器会话
- MongoDB驱动
- FAQ
- 联系我们
- 更多资料
- [快学Mongo]
- [Mongo问题讨论区]
- [Mongo 驱动使用手册]
- 本书使用 GitBook 发布
复制集数据同步
副本集数据同步
在本页
为了维护共享数据集的最新副本,副本集中的从节点成员可以从其他成员同步或复制数据。MongoDB中有两种形式的数据同步:初始化同步将完整的数据集填充至新成员;而复制会持续将变更应用到整个数据集上。
初始化同步
初始化同步会从副本集成员中的一个节点复制所有的数据到另外一个成员。有关初始化同步源选择条件的更多信息请参见初始化同步源选择。
从MongoDB 4.2.7开始,你可以使用参数initialSyncSourceReadPreference
指定优先的初始化同步源。这只能在启动mongod
时配置。
过程
当执行一个初始化同步时,MongoDB会:
3.4版本的变化:初始化同步在为每个集合复制文档时会建立集合的所有索引。在MongoDB的早期版本中,在这个阶段只建立_id索引。
3.4版本的变化:初始化同步会获取在数据复制期间新增的oplog记录。请确保目标成员的local 数据库中有足够的磁盘空间,以便可以在数据复制阶段期间内临时存储这些oplog记录。
若要执行初始化同步,请参见重新同步副本集成员。
容错
为了从短暂网络或操作故障中恢复,初始化同步具有内置的重试逻辑。
版本3.4的变化:MongoDB 3.4改进了初始化同步的重试逻辑,对网络上的间歇性故障更有弹性。
初始化同步源的选择
初始化同步源的选择取决于mongod
的启动参数initialSyncSourceReadPreference
(版本4.2.7中的新参数):
- 若参数
initialSyncSourceReadPreference
设置为primary
(禁用级联后的默认值),则选择主节点作为同步源。如果主服务器不可用或无法访问,则记录错误并定期检查主服务器的可用性。 - 若参数
initialSyncSourceReadPreference
设置为primaryPreferred
,则优先尝试选择主节点作为同步源。如果主节点不可用或者无法访问,则将从剩余可用的副本集成员中选择同步源。 - 若参数
initialSyncSourceReadPreference
设置为nearest
(启用级联后的默认值),则从副本集成员中选择网络时延最小的节点最为同步源。 - 对于所有其他受支持的读偏好类型,则将从这些副本集成员中选择同步源。
执行初始化同步源选择的成员将会遍历所有副本集成员的列表两次:
同步源选择(第一次遍历)
当选择初始同步源进行第一次遍历时,执行同步源选择的成员将检查每个副本集成员是否满足如下条件:
- 同步源必须处于
PRIMARY
或者SECONDARY
的复制状态。 - 同步源必须是在线且可访问的。
- 如果参数
initialSyncSourceReadPreference
设置为secondary
或者secondaryPreferred
,则同步源必须是一个从节点。 - 同步源必须和主节点最新的oplog条目同步时间相差在30s之内。
- 如果该成员是可创建索引的,则同步源也必须可创建索引。
- 如果该成员可参与副本集选举投票,则同步源也必须具有投票权。
- 如果该成员不是一个延迟成员,则同步源也不能是延迟成员。
- 如果该成员是一个延迟成员,则同步源必须配置一个更短的延迟时间。
- 同步源必须比当前最好的同步源更快(即更低的时延)。
如果第一次遍历没有产生候选的同步源,则该成员会用更宽松的条件进行第二次遍历。请参考同步源选择(第二次遍历)。
同步源选择(第二次遍历)
当选择初始同步源进行第二次遍历时,执行同步源选择的成员将检查每个副本集成员是否满足如下条件:
- 同步源必须处于
PRIMARY
或者SECONDARY
的复制状态。 - 同步源必须是在线且可访问的。
- 如果参数
initialSyncSourceReadPreference
设置为secondary
,则同步源必须是一个从节点。 - 如果该成员是可创建索引的,则同步源也必须可创建索引。
- 同步源必须比当前最好的同步源更快(即更低的时延)。
如果该成员在两次遍历后依然无法选择出初始同步源,它会记录报错并在等待1s后重新发起选择的过程。从节点的Mongod进程在出现报错退出之前,最多会重试10次初始同步源选择的过程。
复制
从节点成员在初始化同步之后会不断地复制数据。从节点成员从同步源复制oplog ,并以异步的方式应用这些操作 [1]。
从节点可以根据ping时间和其他成员复制状态的变化,按需来自动调整它们的同步源。
3.2版本的变化:MongoDB 3.2中投票权为1的副本集成员无法从投票权为0的成员那里同步数据。
如果一个从节点成员的参数members[n].buildIndexes
设置为true,它只能从其他参数buildIndexes设置为true的成员同步数据。参数buildIndexes设置为false的成员可以从任何其他节点同步数据,除非有其他的同步限制。参数buildIndexes默认为true。
[1] | 从4.2版本开始(从4.0.6开始也是可行的),副本集的副本成员会记录oplog中应用时间超过慢操作阈值的慢操作条目。这些慢oplog信息被记录在从节点的诊断日志中,其路径位于REPL 组件的文本applied op: took ms
中。这些慢日志条目仅仅依赖于慢操作阈值。它们不依赖于日志级别(无论是系统还是组件级别)、过滤级别,或者慢操作采样比例。过滤器不会捕获慢日志条目。
多线程复制
MongoDB通过使用多线程批量应用写操作来提高并发。MongoDB根据文档id (WiredTiger)进行分批,同时使用不同的线程应用每组操作。MongoDB总是按照原始的写顺序对给定的文档应用写操作。
4.0版本的变化。
从MongoDB 4.0开始,如果读取发生在正在应用批量复制的从节点上,那么针对从节点且读关注级别设置为“local”或“majority”的读取操作,现在将从WiredTiger数据快照中读取数据。从快照中读取数据可以保证数据的一致性视图,并且允许在进行复制的同时进行读取,而不需要使用锁。因此,这些读关注级别的从节点读取操作不再需要等待批量复制应用完成,并且可以在接收它们的同时进行处理。
流控制
从MongoDB 4.2开始,管理员可以限制主节点应用其写操作的速度,目的是将大多数提交延迟保持在可配置参数flowControlTargetLagSeconds
最大值之下。
默认情况下,流控制是启用的。
说明
为了进行流控制,副本集/分片集群必须满足:参数featureCompatibilityVersion (FCV) 设置为4.2,并启用majority级别的读关注。也就是说,如果FCV不是4.2,或者读关注majority被禁用,那么流控制的启用将不会生效。
更多信息请参见流控制。
复制同步源的选择
复制同步源的选择取决于副本集参数chaining
的设置:
- 启用级联(默认)后,从副本集成员间执行同步源选择。
- 禁用级联后,选择主节点作为复制源。如果主服务器不可用或无法访问,则记录错误并定期检查主服务器的可用性。
Members performing replication sync source selection make two passes through the list of all replica set members:
执行复制同步源选择的成员将会遍历所有副本集成员的列表两次:
同步源选择(第一次)
当为选择复制同步源进行第一次遍历时,执行同步源选择的成员将检查每个副本集成员是否满足如下条件:
- 同步源必须处于
PRIMARY
或者SECONDARY
的复制状态。 - 同步源必须是在线且可访问的。
- 同步源必须比该成员具有更新的oplog条目(即同步源数据同步领先于该成员)。
- 同步源必须是可见的。
- 同步源必须和主节点最新的oplog条目同步时间相差在30s之内。
- 如果该成员是可创建索引的,则同步源也必须可创建索引。
- 如果该成员可参与副本集选举投票,则同步源也必须具有投票权。
- 如果该成员不是一个延迟成员,则同步源也不能是延迟成员。
- 如果该成员是一个延迟成员,则同步源必须配置一个更短的延迟时间。
- 同步源必须比当前最好的同步源更快(即更低的时延)。
如果第一次遍历没有产生候选的同步源,则该成员会用更宽松的条件进行第二次遍历。请参考同步源选择(第二次遍历)。
同步源选择(第二次遍历)
当为选择复制同步源进行第二次遍历时,执行同步源选择的成员将检查每个副本集成员是否满足如下条件:
- 同步源必须处于
PRIMARY
或者SECONDARY
的复制状态。 - 同步源必须是在线且可访问的。
- 如果该成员是可创建索引的,则同步源也必须可创建索引。
- 同步源必须比当前最好的同步源更快(即更低的时延)。
如果该成员在两次遍历后依然无法选择出初始同步源,它会记录报错并在等待1s后重新发起选择的过程。
说明
从MongoDB 4.2.7开始,当选择一个初始化同步源时,启动参数 initialSyncSourceReadPreference
是优先级高于副本集参数 settings.chainingAllowed
。在副本集成员成功执行初始化同步之后,选择复制同步源时则取决于参数 chainingAllowed
的值。
有关初始化同步源的选择的更多信息请参考初始化同步源的选择 。
原文链接:https://docs.mongodb.com/manual/core/replica-set-sync/
译者:李正洋
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05