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 的值相同。

提示

请参阅:

version

类型:int

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

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

term

类型:int

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

发出强制重配置会删除 term 字段。当主节点下一次发出 replSetReconfig 而不使用强制时,它将 term 设置为自己的术语。

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

configsvr

类型:布尔值

默认:false

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

protocolVersion

类型:数字

默认值:1

MongoDB 仅支持 protocolVersion: 1,不再支持 protocolVersion: 0

提示

另请参阅:

writeConcernMajorityJournalDefault

类型:布尔值

默认值:true

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

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

{ w: "majority" } 行为

true

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

重要提示:writeConcernMajorityJournalDefaulttrue 时,副本集的所有投票节点都必须使用日志记录功能运行。

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

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

从版本 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 数组中每个文档的 members[n]._id 字段的值混淆。

members[n].host

类型:字符串

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

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

警告

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

members[n].arbiterOnly

可选

类型:布尔值

默认:false

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

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

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)节点的 priority 必须为 0。

从 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

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

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

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

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

settings.catchUpTakeoverDelayMillis

可选

类型:int

默认:30000(30 秒)

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

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

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

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

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

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

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

注意

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

settings.heartbeatIntervalMillis

仅供内部使用

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

settings.replicaSetId

类型:对象标识符

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

后退

参考