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
必须与命令行上指定给mongod
的replication.replSetName
或--replSet
的值相同。提示
请参阅:
replSetName
或--replSet
,了解如何设置副本集名称。
version
类型:int
一个递增的数字,区分副本集配置文档的修订版本和配置的先前迭代。
副本集节点使用
term
和version
就“最新”副本配置达成共识。当成员比较副本配置文档时,具有较大term
的配置文档被视为“最新”。如果term
相同或不存在,则version
较大的配置文档被视为“最新”。
term
类型:int
仅适用于 featureCompatibilityVersion (fCV) "4.4" 或更高版本。
一个递增的数字,用于区分副本集配置文档的修订与配置的先前迭代。配置文档的
term
与执行重新配置的副本集 主 节点的任期匹配。 主 节点在赢得选举后每次升级时都会增加其任期。如果在 操作中显式设置,主节点将忽略term
replSetReconfig
字段。发出 强制 重新配置命令会删除
term
字段。当主节点下次在replSetReconfig
不 强制的情况下发出 时,会将term
设置为其自己的任期。副本集节点使用
term
和version
就“最新”副本配置达成共识。当成员比较副本配置文档时,具有较大term
的配置文档被视为“最新”。如果term
相同或不存在,则version
较大的配置文档被视为“最新”。
writeConcernMajorityJournalDefault
类型:布尔值
默认值:true
如果
{ w: "majority" }
写关注未显式指定日志选项 j,则确定该写关注的行为。下表列出了
writeConcernMajorityJournalDefault
值和关联的{ w: "majority" }
行为:值{ w: "majority" }
行为true当大多数投票节点写入磁盘日志后,MongoDB 会确认该写入操作。
重要
当
writeConcernMajorityJournalDefault
为true
时,副本集的所有投票节点都必须使用日志功能运行。如果副本集的任何有投票权成员使用内存中存储引擎,则必须将
writeConcernMajorityJournalDefault
设置为false
。如果副本集的任何有投票权成员使用 内存中存储引擎 且
writeConcernMajorityJournalDefault
为true
,则"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
数组是从零开始索引的数组。每份节点专用配置文档可包含以下字段:
members[n]._id
类型:整型
副本集中节点的整数标识符,在所有节点中具有唯一性。
从 MongoDB 5.0 开始,该值可以是大于或等于
0
的任何整数值。以前,该值仅限于0
和255
(含)之间的整数。每个副本集节点都必须具有唯一的
_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>",... } 对于读取操作,您可以在读取偏好中指定标签集,以将操作定向到具有指定标签的副本集节点员。
对于写入操作,您可以使用 和
settings.getLastErrorModes
创建自定义 写关注settings.getLastErrorDefaults
。
有关更多信息,请参阅配置副本集标签集。
members[n].secondaryDelaySecs
可选。
类型:整型
默认值:0
该副本集节点应“滞后”于主节点的秒数。
使用此选项创建延迟节点。延迟节点维护反映过去某个时间点数据状态的数据副本。
延迟成员可以帮助确认使用写关注发出的写入操作。但是,它们返回的写入确认不早于配置的延迟值。对于以
"majority"
写关注发出的写入操作,该成员还必须是投票成员(即votes
大于0
)。提示
另请参阅:
members[n].votes
可选。
类型:整型
默认值:1
服务器在副本集选举中将投的票数。每个节点拥有的票数为
1
或0
,仲裁节点始终恰好拥有1
票。副本集最多可以有50个节点,但只能有7有投票权的节点。如果在一个副本集中需要超过7个节点,请将额外的无投票权节点的
members[n].votes
设置为0
。无投票权(即
votes
为0
)成员的0值必须为priority
}。从 MongoDB 5.0 开始,新添加的从节点不计为投票节点,并且在达到
SECONDARY
状态之前无法当选。无投票权的成员无法确认带有
"majority"
写关注的写入操作。
settings
settings
可选。
类型:文档
一份包含应用于整个副本集的配置选项的文档。
settings
文档包含以下字段:settings.chainingAllowed
可选。
类型:布尔值
默认值:true
在 MongoDB 5中。 0 。 1及更早版本,如果
settings.chainingAllowed
为:从 MongoDB 5开始。 0 。 2 :
即使
settings.chainingAllowed
为false
,副本集从 节点 也可以从其他从节点复制数据。要覆盖
settings.chainingAllowed
,请将enableOverrideClusterChainingSetting
服务器参数设置为true
。enableOverrideClusterChainingSetting
的默认值为false
。
提示
另请参阅:
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.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 秒)
某节点在确定其领先于当前主节点后,等待启动追赶接管的时间(以毫秒为单位)。在追赶接管期间,当前主节点之前的节点发起选举以成为副本集的新主节点。
启动接管的节点确定其领先于当前主节点后,会等待指定的毫秒数,然后验证:
它仍然领先于当前主节点,
它是所有可用节点中最新的节点,
当前主节点正在追赶它。
一旦确定所有这些条件都得到满足,启动接管的节点将立即竞选。
有关副本集选举的更多信息,请参阅副本集选举。
注意
将
catchUpTakeoverDelayMillis
设置为-1
会禁用追赶接管。将catchUpTimeoutMillis
设置为0
会禁用主节点追赶,因此也会禁用追赶接管。
settings.replicaSetId
类型:对象标识符
与副本集关联并在
rs.initiate()
或replSetInitiate
期间自动创建的 ObjectId。您无法更改replicaSetId
。