自管理副本集配置
您可以使用 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
的值相同。
version
类型:int
一个递增的数字,区分副本集配置文档的修订版本和配置的先前迭代。
副本集成员使用
term
和version
就“最新”副本配置达成共识。当成员比较副本配置文档时,具有较大term
的配置文档被视为“最新”。如果term
相同或不存在,则具有较大version
的配置文档被视为“最新”。
term
类型:int
仅适用于 featureCompatibilityVersion (fCV) "4.4" 或更高版本。
一个递增的数字,区分副本集配置文档的修订版本和配置的先前迭代。配置文档的
term
与执行重新配置的副本集主节点的任期相同。每次赢得选举后,主节点都会递增其任期。如果在replSetReconfig
操作中进行显式设置,主节点将忽略term
字段。发出强制重配置会删除
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
命令,或默认使用"majority"
写关注的各种mongosh
方法,例如用户管理方法和角色管理方法。从版本 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
数组中每个文档的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>",... } 对于读取操作,您可以在读取偏好中指定标签集,以将操作定向到具有指定标签的副本集节点员。
对于写入操作,您可以使用
settings.getLastErrorModes
和settings.getLastErrorDefaults
. 创建自定义写关注。
有关更多信息,请参阅配置副本集标签集。
members[n].secondaryDelaySecs
可选。
类型:整型
默认值:0
该副本集节点应“滞后”于主节点的秒数。
使用此选项创建延迟节点。延迟节点维护反映过去某个时间点数据状态的数据副本。
延迟成员可以帮助确认通过写关注发出的写入操作。但是,它们返回的写入确认不早于配置的延迟值。对于以
"majority"
写关注发出的写入操作,该节点还必须是投票节点(即votes
大于0
)。
members[n].votes
可选。
类型:整型
默认值:1
服务器在副本集选举中将投的票数。每个节点拥有的票数为
1
或0
,仲裁节点始终恰好拥有1
票。priority
大于 0 的成员不能有 0 个votes
。副本集最多可以有 50 个成员,但只能有 7 个有投票权的成员。如果在一个副本集中需要 7 个以上具有投票权的成员,请将额外的无投票权成员的
members[n].votes
设置为0
。非投票(即
votes
是0
)节点的priority
必须为 0。从 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
默认:-1,无限追赶时间。
新选出的主节点与可能有更多近期写入操作的其他副本集成员进行同步(赶上)的时间限制(以毫秒为单位)。无限或较高的时间限制可能会减少其他成员在选举后需要回滚的数据量,但可能会延长故障转移时间。
新当选的主节点一旦被其他节点完全赶上,则会提前结束追赶期。在追赶期间,新当选的主节点不可用于客户端的写入操作。使用
replSetAbortPrimaryCatchUp
中止追赶,然后完成向主节点的过渡。该设置仅在使用
protocolVersion: 1
时适用。
settings.catchUpTakeoverDelayMillis
可选。
类型:int
默认:30000(30 秒)
某节点在确定其领先于当前主节点后,等待启动追赶接管的时间(以毫秒为单位)。在追赶接管期间,当前主节点之前的节点发起选举以成为副本集的新主节点。
启动接管的节点确定其领先于当前主节点后,会等待指定的毫秒数,然后验证:
它仍然领先于当前主节点,
它是所有可用节点中最新的节点,
当前主节点正在追赶它。
一旦确定所有这些条件都得到满足,启动接管的节点将立即竞选。
有关副本集选举的更多信息,请参阅副本集选举。
注意
将
catchUpTakeoverDelayMillis
设置为-1
将禁用追赶接管。将catchUpTimeoutMillis
设置为0
会禁用主节点追赶,因此也会禁用追赶接管。
settings.replicaSetId
类型:对象标识符
与该副本集相关联并在
rs.initiate()
或replSetInitiate
期间自动创建的 ObjectId。您无法更改replicaSetId
。