rs.reconfig()
定义
rs.reconfig( configuration, { options } )
重新配置现有副本集,从而覆盖现有副本集配置。 要运行该方法,必须连接到副本集的主节点 (primary node in the replica set)节点。
重要
mongosh 方法
本页面提供
mongosh
方法的相关信息。这不是数据库命令或特定语言驱动程序(例如 Node.js)的相关文档。有关数据库命令,请参阅
replSetReconfig
命令。如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。
rs.reconfig()
方法使用的语法如下:rs.reconfig( <configuration>, { "force" : <boolean>, "maxTimeMS" : <int> } ) Parameter类型说明文档
用于指定副本集配置的文档。
布尔
整型
Optional
指定处理
rs.reconfig()
操作的累积时间限制(以毫秒为单位)。默认,rs.reconfig()
无限期等待副本配置传播到大多数副本集成员。要重新配置现有的副本集,请先使用
rs.conf()
检索当前配置,按需修改配置文档,然后将修改后的文档传递给rs.reconfig()
。force
参数允许向非主节点发出重新配置命令。
兼容性
此方法可用于以下环境中托管的部署:
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
行为
全局写关注
从 MongoDB 5.0 开始,在尝试使用更改隐式默认写关注的配置重新配置副本集之前,您必须显式设置全局默认写关注。要设置全局默认写关注,请使用 setDefaultRWConcern
命令。
term
副本配置字段
term
字段是由主副本集节点设置的。如果在 rs.reconfig()
操作中进行显式设置,主节点将忽略 term
字段。
重新配置可以一次添加或删除不超过一个投票节点
rs.reconfig()
默认情况下,允许一次添加或删除不超过 1
voting
个节点。例如,新配置最多可以对集群 membership
进行以下更改之一:
添加新的投票副本集节点。
删除现有的投票副本集成员。
修改现有副本集节点的
votes
。
要添加或删除多个投票成员,请发出一系列 rs.reconfig()
操作,每次添加或删除一个成员。
发出 force 重新配置将立即安装新配置,即使它添加或删除多个投票节点。force 重新配置可能会导致意外行为,例如,回滚 "majority"
提交的写入操作。
重新配置一直等到大多数节点安装副本配置
rs.reconfig()
等待大多数投票副本集成员安装新的副本配置,才会返回成功。投票成员是任何 members[n].votes
为 1
的副本集成员,包括仲裁节点。
副本集节点通过心跳传播其副本配置。每当节点发现具有更高 version
和 term
的配置时,它就会安装新配置。重新配置过程具有两个不同的“等待”阶段:
- 1)等待提交当前配置,再安装新配置。
“当前”配置是指在发出
rs.reconfig()
时主节点使用的副本配置。在以下情况下,将提交配置:
大多数投票副本集节点都安装了当前配置,并且
所有在先前配置中以
"majority"
提交的写入也已复制到当前配置中的多数。
通常,当前配置已安装在大多数投票副本集节点上。不过,以前配置中的大多数提交的写入可能不会在当前配置中全部提交。
Delayed
节点或lagging behind
主节点的节点可能会增加在该阶段所花的时间。如果发出的操作具有 maxTimeMS 限制,并且 该操作在等待时超过该限制,该操作将返回错误并丢弃新配置。该限制是累积性的,在进入下一阶段后不会进行重置。
- 2)等待新配置中的大多数投票成员安装新配置。
“新”配置是指为
rs.reconfig()
指定的副本配置。主节点安装并开始使用新的副本配置,再将配置传播给其余副本集节点。该操作只需等待多数投票成员安装新配置,而无需等待提交新配置。
如果发出的操作具有 maxTimeMS 限制,并且操作在等待时超过该限制,则操作将返回错误,但会继续使用和传播新配置。
无论以前配置的提交状态如何,发出 force 重新配置将立即安装新配置。force 重新配置可能会导致意外行为,例如,回滚 "majority"
提交的写入操作。
要检查当前副本配置的提交状态,请在副本集主节点使用 commitmentStatus 参数发出 replSetGetConfig
。
访问控制
要在强制执行访问控制的部署上运行该方法,用户必须对集群资源具有 replSetConfigure
操作权限。admin
数据库中具有的 clusterManager
内置角色提供了该命令所需的权限。
锁定行为
rs.reconfig()
获取特殊的独占锁,防止同时发生多个 rs.reconfig()
操作。
混合版本的副本集
警告
避免重新配置包含不同 MongoDB 版本节点的副本集,因为验证规则可能因 MongoDB 版本而异。
可用性
在某些情况下,rs.reconfig()
shell 方法可以触发当前主节点降级。主节点降级会触发选举以选出新的主节点:
当主节点降级时,它会停止任何正在进行的写入操作。有关详情,请参阅行为。
假设采用默认 replica
configuration settings
(副本配置设置),那么集群选举新的主节点之前的平均时间通常不应超过 12 秒。这包括将主节点标记为不可用以及召集和完成选举所需的时间。您可以通过修改 settings.electionTimeoutMillis
复制配置选项来调整该时间段。网络延迟等因素可能会延长副本集选举完成所需的时间,这反过来又会影响集群在没有主节点的情况下运行的时间。这些因素取决于具体集群架构。
在选举进程期间,集群不能接受写操作,直到选举出新的主节点。
您的应用程序连接逻辑应包括对自动故障转移和后续选举的容忍度。MongoDB 驱动程序可检测到主节点丢失,并一次性自动重试某些写入操作,从而为自动故障转移和选举提供额外的内置处理功能:
兼容的驱动程序将默认启用可重试写入
要进一步降低对生产集群的潜在影响,请仅在计划维护期间重新配置。
{ force: true }
节点优先级和投票
删除成员后,删除传出连接
在使用 rs.reconfig()
删除副本集节点时,不会自动删除从其他副本集节点到删除的节点的打开传出连接。
默认情况下,副本集节点等待 5 分钟,然后再删除到删除的节点的连接。在分片副本集中,您可以使用 ShardingTaskExecutorPoolHostTimeoutMS
服务器参数修改该超时。
要立即删除从副本集到已删除成员的所有传出连接,请对副本集的每个剩余成员运行 dropConnections
管理命令:
db.adminCommand( { "dropConnections" : 1, "hostAndPort" : [ "<hostname>:<port>" ] } )
将 <hostname>
和 <port>
替换为已删除成员的值。
对副本集中新的投票节点的自动重新配置
从 MongoDB 5.0 开始,新添加的从节点在未达到 SECONDARY
状态之前将不被计为投票节点,并且无法被选为主节点。
当一个新的投票节点被添加到副本集时,replSetReconfig
将从内部向该节点的配置中添加一个 newlyAdded
字段。带有 newlyAdded
字段的节点不会被计入当前的投票节点数。当初始同步完成且节点达到 SECONDARY
状态后,newlyAdded
字段将被自动删除。
注意
即使使用
{ force: true }
运行,尝试添加名为newlyAdded
的字段的配置也会出错。如果现有节点有一个
newlyAdded
字段,使用rs.reconfig()
更改配置将不会删除newlyAdded
字段。newlyAdded
字段将被附加到用户提供的配置中。replSetGetConfig
将删除输出中的所有newlyAdded
字段。如果您想查看任何newlyAdded
字段,可以直接查询local.system.replset
集合。
示例
名为 rs0
的副本集配置如下:
{ "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "mongodb1.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "mongodb2.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : 2000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("58858acc1f5609ed986b641b") } }
更改副本集节点优先级
以下操作序列会更新第二个节点的 members[n].priority
。这些操作会通过连接到主节点的 mongosh
会话发出。
cfg = rs.conf(); cfg.members[1].priority = 2; rs.reconfig(cfg);
第二条语句将
members[n].priority
值设置为members
数组中的第二个文档。有关其他设置,请参阅副本集配置设置。要访问数组中的成员配置文档,该语句使用数组索引而不是副本集成员的
members[n]._id
字段。最后一条语句使用修改后的
cfg
调用rs.reconfig()
方法来初始化该新配置。成功重新配置后,副本集配置将如下所示:
{ "_id" : "rs0", "version" : 2, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "mongodb1.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 2, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "mongodb2.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : 2000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("58858acc1f5609ed986b641b") } }
更改副本集设置
您还可以修改集群副本集 settings
文档。settings
文档包含适用于整个副本集的配置选项。
以下操作序列会将集群的 settings.heartbeatTimeoutSecs
更新为 15
。这些操作通过连接到主节点的 mongosh
会话发出。
cfg = rs.conf(); cfg.settings.heartbeatTimeoutSecs = 15; rs.reconfig(cfg);