Docs 菜单

Docs 主页开发应用程序MongoDB Manual

副本集配置

在此页面上

  • 副本集配置文档示例
  • 副本集配置字段

您可以使用 rs.conf() 方法或 replSetGetConfig 命令访问副本集的配置。

要修改副本集的配置,请使用 rs.reconfig() 方法,并向该方法传递配置文档。请参阅 rs.reconfig(),获取更多信息。

警告

避免重新配置包含不同 MongoDB 版本节点的副本集,因为验证规则可能因 MongoDB 版本而异。

以下文档提供了副本集配置文档的表示。副本集的配置可能仅包含以下设置的子集:

{
_id: <string>,
version: <int>,
term: <int>,
protocolVersion: <number>,
writeConcernMajorityJournalDefault: <boolean>,
configsvr: <boolean>,
members: [
{
_id: <int>,
host: <string>,
arbiterOnly: <boolean>,
buildIndexes: <boolean>,
hidden: <boolean>,
priority: <number>,
tags: <document>,
secondaryDelaySecs: <int>,
votes: <number>
},
...
],
settings: {
chainingAllowed : <boolean>,
heartbeatIntervalMillis : <int>,
heartbeatTimeoutSecs: <int>,
electionTimeoutMillis : <int>,
catchUpTimeoutMillis : <int>,
getLastErrorModes : <document>,
getLastErrorDefaults : <document>,
replicaSetId: <ObjectId>
}
}
_id

类型:字符串

副本集的名称。

_id 必须与命令行上指定给 mongodreplication.replSetName--replSet 的值相同。

提示

请参阅:

replSetName--replSet,了解如何设置副本集名称。

version

类型:int

一个递增的数字,区分副本集配置文档的修订版本和配置的先前迭代。

副本集节点使用termversion就“最新”副本配置达成共识。当成员比较副本配置文档时,具有较大term的配置文档被视为“最新”。如果term相同或不存在,则version较大的配置文档被视为“最新”。

term

类型:int

仅适用于 featureCompatibilityVersion (fCV) "4.4" 或更高版本。

一个递增的数字,用于区分副本集配置文档的修订与配置的先前迭代。配置文档的term 与执行重新配置的副本集 节点的任期匹配。 主 节点在赢得选举后每次升级时都会增加其任期。如果在 操作中显式设置,主节点将忽略term replSetReconfig字段。

发出 强制 重新配置命令会删除term 字段。当主节点下次在replSetReconfig 强制的情况下发出 时,会将term 设置为其自己的任期。

副本集节点使用termversion就“最新”副本配置达成共识。当成员比较副本配置文档时,具有较大term的配置文档被视为“最新”。如果term相同或不存在,则version较大的配置文档被视为“最新”。

configsvr

类型:布尔值

默认:false

指示副本集是否用于分片集群的配置服务器。如果副本集用于分片集群的配置服务器,则设置为 true

protocolVersion

类型:数字

默认值:1

从 4.0 开始,MongoDB 仅支持 protocolVersion: 1,不再支持 protocolVersion: 0

提示

另请参阅:

writeConcernMajorityJournalDefault

类型:布尔值

默认值:true

如果 { w: "majority" } 写关注未显式指定日志选项 j,则确定该写关注的行为。

下表列出了 writeConcernMajorityJournalDefault 值和关联的 { w: "majority" } 行为:

{ w: "majority" } 行为
true

当大多数投票节点写入磁盘日志后,MongoDB 会确认该写入操作。

重要

writeConcernMajorityJournalDefaulttrue 时,副本集的所有投票节点都必须使用日志功能运行。

如果副本集的任何有投票权成员使用内存中存储引擎,则必须将writeConcernMajorityJournalDefault设置为false

如果副本集的任何有投票权成员使用 内存中存储引擎writeConcernMajorityJournalDefaulttrue ,则"majority" 写入操作可能会失败。其中包括本身使用 写关注的操作(例如"majority" replSetStepDown命令)或默认情况下使用mongosh 写关注的各种"majority" 方法(例如 用户管理方法 角色管理方法)。

从版本4开始。 2 (以及4 . 0 . 13和3 . 6 . 14 ),如果副本集成员使用内存中存储引擎(投票或非投票),但副本集已将writeConcernMajorityJournalDefault设置为 true,则副本集节点会记录启动警告。

false

当大多数投票节点在内存中应用该操作后,MongoDB 会确认该写入操作。

警告

如果副本集的任何有投票权成员使用内存中存储引擎,则必须将writeConcernMajorityJournalDefault设置为false

从版本4开始。 2 (以及4 . 0 . 13和3 . 6 . 14 ),如果副本集成员使用内存中存储引擎(投票或非投票),但副本集已将writeConcernMajorityJournalDefault设置为 true,则副本集节点会记录启动警告。

您无法在具有将writeConcernMajorityJournalDefault设置为false的分片(例如具有使用内存中存储引擎的投票成员的分片)的分片集群上运行事务。

提示

另请参阅:

members

类型:数组

节点配置文档数组,副本集的每个节点对应一个文档。 members数组是从零开始索引的数组。

每份节点专用配置文档可包含以下字段:

members[n]._id

类型:整型

副本集中节点的整数标识符,在所有节点中具有唯一性。

从 MongoDB 5.0 开始,该值可以是大于或等于 0 的任何整数值。以前,该值仅限于 0255(含)之间的整数。

每个副本集节点都必须具有唯一的_id即使当前配置中没有members[n]条目使用该_id ,也请避免重复使用_id值。

一旦设置,就无法更改成员的_id

注意

更新副本配置对象时,访问 数组中的副本集节点, 数组索引为 。数组索引以members 开头。0 请勿 将此索引值与members[n]._id 数组中每个文档的members 字段的值混淆。

members[n].host

类型:字符串

主主机名以及副本集节点的端口号(如果端口号经过设置)。

副本集中每个主机的主机名名称必须可解析。

警告

members[n].host不能包含解析为localhost或本地接口的值,除非集合的所有成员都位于解析为localhost的主机上。

members[n].arbiterOnly

可选

类型:布尔值

默认:false

标识仲裁节点的布尔值。值为 true 表示该节点是仲裁节点。

使用rs.addArb()方法添加仲裁节点时,该方法会自动将已添加节点的members[n].arbiterOnly设置为true

在下列的 MongoDB 版本中,对于带有仲裁节点的副本集,与 pv0 协议版本(MongoDB 4.0+ 中不再支持)相比,pv1 协议版本增加了 w:1 回滚的可能性:

  • MongoDB 3.4.1

  • MongoDB 3.4.0

  • MongoDB 3.2.11 或更早的版本

请参阅副本集协议版本。

members[n].buildIndexes

可选

类型:布尔值

默认值:true

布尔值,表示mongod是否在此成员上构建索引。只有在向副本集添加成员时,才能设置此值。将成员添加到集合后,您无法更改members[n].buildIndexes字段。要添加成员,请参阅rs.add()rs.reconfig()

对于接收来自客户端的查询的 mongod 实例,请勿将其设置为 false

如果以下所有条件为 true,则将buildIndexes设置为 false可能会很有用:

  • 您仅使用此实例通过mongodump执行备份,并且

  • 此成员将不会收到任何查询,

  • 索引创建和维护使主机系统负担过重。

即使设为 false,从节点也会_id 字段构建索引,以便执行复制所需的操作。

警告

如果将members[n].buildIndexes设置为false ,则还必须将members[n].priority设置为0 。如果members[n].priority不是0 ,则 MongoDB 在尝试添加members[n].buildIndexes等于false的成员时将返回错误。

为确保成员不接收任何查询,应隐藏所有未构建索引的实例。

其他从节点无法从members[n].buildIndexes为 false 的成员复制。

members[n].hidden

可选

类型:布尔值

默认:false

当该值为 true 时,副本集会隐藏该实例,不会将该节点包含在 db.hello()hello 的输出中。这样可以防止读取操作(即查询)通过从节点读取偏好到达此主机。

隐藏成员可以确认使用写关注发出的写入操作。对于以"majority"写关注发出的写入操作,该成员还必须是投票成员(即votes大于0 )。

提示

另请参阅:

members[n].priority

可选

类型:0 到 1000 之间的数字,表示主节点/从节点;0 或 1 为仲裁节点。

默认值:1.0 用于主/从节点;0 为仲裁节点。

一个数字,表示副本集节点成为主节点的相对可能性。

  • 要提高某个成员成为从节点的可能性,请为该成员指定较高的 priority 值。

  • 要降低某个节点成为主节点的可能性,请为该节点指定一个较低的 priority 值。

更改节点的优先级会触发一次或多次选举。选举算法尽最大努力将优先级最高的节点选为主节点。然而,即使有较高优先级的从节点可用,较低优先级的节点也可能成为主节点。

如果优先级较低的节点成为节点,服务器将继续定期进行选举,直到优先级最高的副本集节点成为主节点。选举频率取决于当选节点和最高优先级节点之间的优先级差异。

优先级为 0 的成员无法成为主节点。

无投票权的节点(指将votes设置为0的节点)的优先级必须为0

提示

members[n].tags

可选

类型:文档

默认:无

一份 tags 文档包含用户定义的副本集节点标签字段和值对。

{ "<tag1>": "<string1>", "<tag2>": "<string2>",... }

有关更多信息,请参阅配置副本集标签集。

members[n].secondaryDelaySecs

可选

类型:整型

默认值:0

该副本集节点应“滞后”于主节点的秒数。

使用此选项创建延迟节点。延迟节点维护反映过去某个时间点数据状态的数据副本。

延迟成员可以帮助确认使用写关注发出的写入操作。但是,它们返回的写入确认不早于配置的延迟值。对于以"majority"写关注发出的写入操作,该成员还必须是投票成员(即votes大于0 )。

提示

另请参阅:

members[n].votes

可选

类型:整型

默认值:1

服务器在副本集选举中将投的票数。每个节点拥有的票数为 10仲裁节点始终恰好拥有 1 票。

priority大于0的成员不能拥有0 votes

副本集最多可以有50个节点,但只能有7有投票权的节点。如果在一个副本集中需要超过7个节点,请将额外的无投票权节点的members[n].votes设置为0

无投票权(即votes0 )成员的0值必须为priority }。

从 MongoDB 5.0 开始,新添加的从节点不计为投票节点,并且在达到 SECONDARY 状态之前无法当选。

无投票权的成员无法确认带有"majority"写关注的写入操作。

settings

可选

类型:文档

一份包含应用于整个副本集的配置选项的文档。

settings文档包含以下字段:

settings.chainingAllowed

可选

类型:布尔值

默认值:true

在 MongoDB 5中。 0 。 1及更早版本,如果settings.chainingAllowed为:

  • true副本集的从节点可以从其他从节点复制数据。

  • false,从节点只能从主节点复制数据。

从 MongoDB 5开始。 0 。 2 :

提示

另请参阅:

settings.getLastErrorDefaults

可选

类型:文档

(从 MongoDB 5.0 开始提供)

重要

从 MongoDB 5开始。 0 ,除了默认值{ w: 1, wtimeout: 0 }之外,不能指定具有settings.getLastErrorDefaults的默认写关注。相反,请使用setDefaultRWConcern命令为副本集或分片集群设置默认的读关注或写关注配置。

settings.getLastErrorModes

可选

类型:文档

用于通过使用 定义自定义 写关注 members[n].tags的文档。自定义写关注可以提供 数据中心感知。

{ getLastErrorModes: {
<name of write concern> : { <tag1>: <number>, .... },
...
} }

<number>是指满足写关注所需的不同标签值的数量。例如,以下settings.getLastErrorModes定义了一个名为datacenter的写关注,它要求将写入操作传播到两个dc标签值不同的成员。

{ getLastErrorModes: { datacenter: { "dc": 2 } } }

要使用该自定义写关注,请将该写关注名称传递给 w 选项,例如

{ w: "datacenter" }

有关更多信息和示例,请参阅配置副本集标记集

settings.heartbeatTimeoutSecs

可选

类型:int

默认值:10

副本集节点等待彼此成功心跳的秒数。如果某个节点没有及时回复,其他节点会将节点标记为不可访问。

settings.electionTimeoutMillis

可选

类型:int

默认值:10000(10 秒)

检测副本集主节点无法访问的时间限制(以毫秒为单位)。此设置控制使用protocolVersion: 1时的故障转移灵敏度。预计故障转移超时不会超过electionTimeoutMillis的值。

选择值时,请考虑以下事项:

  • 较高的值会导致故障转移速度较慢,但会减少对主节点或网络缓慢或不稳定的敏感度。

  • 较低的值会加快故障转移,但会增加对主节点或网络缓慢或不稳定的敏感度。

该设置仅在使用protocolVersion: 1时适用。

注意

当您使用rs.stepDown()replSetStepDown退出主节点而未将force字段设置为true时,退出的主节点会指定一个符合条件的从节点来立即进行选举。

settings.catchUpTimeoutMillis

可选

类型:int

3.6 版本中的变更

默认:-1,无限追赶时间。

新选出的主节点与可能有更多近期写入操作的其他副本集成员进行同步(赶上)的时间限制(以毫秒为单位)。无限或较高的时间限制可能会减少其他成员在选举后需要回滚的数据量,但可能会延长故障转移时间。

新当选的主节点一旦被其他节点完全赶上,则会提前结束追赶期。在追赶期间,新当选的主节点不可用于客户端的写入操作。使用 replSetAbortPrimaryCatchUp 中止追赶,然后完成向主节点的过渡。

该设置仅在使用protocolVersion: 1时适用。

注意

要将版本 3.6 中启动的副本集降级到 3.4,请将 catchUpTimeoutMillis-1 变更为正数。未能将此值变更为正数会导致运行版本 3.4 的节点既不重新启动也不加入副本集。

settings.catchUpTakeoverDelayMillis

可选

类型:int

默认:30000(30 秒)

某节点在确定其领先于当前主节点后,等待启动追赶接管的时间(以毫秒为单位)。在追赶接管期间,当前主节点之前的节点发起选举以成为副本集的新主节点。

启动接管的节点确定其领先于当前主节点后,会等待指定的毫秒数,然后验证:

  1. 它仍然领先于当前主节点,

  2. 它是所有可用节点中最新的节点,

  3. 当前主节点正在追赶它。

一旦确定所有这些条件都得到满足,启动接管的节点将立即竞选。

有关副本集选举的更多信息,请参阅副本集选举。

注意

catchUpTakeoverDelayMillis设置为-1会禁用追赶接管。将catchUpTimeoutMillis设置为0会禁用主节点追赶,因此也会禁用追赶接管。

settings.heartbeatIntervalMillis

仅供内部使用

心跳频率(以毫秒为单位)。

settings.replicaSetId

类型:对象标识符

与副本集关联并在rs.initiate()replSetInitiate期间自动创建的 ObjectId。您无法更改replicaSetId

← 复制参考资料