Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

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

指定 true 会迫使可用副本集节点接受新配置。默认值为 false

强制重新配置可能导致意外或不希望发生的行为,包括回滚 "majority" 已提交的写入。

整型

Optional

指定在游标上处理 rs.reconfig() 操作的累计时间限制(以毫秒为单位)。默认情况下,rs.reconfig() 会无限期等待副本配置传播到大多数副本集成员。

要重新配置现有的副本集,请先使用 rs.conf() 检索当前配置,按需修改配置文档,然后将修改后的文档传递给 rs.reconfig()

force 参数允许向非主节点发出重新配置命令。

从 MongoDB 5.0 开始,在尝试使用更改隐式默认写关注配置重新配置副本集之前,您必须显式设置全局默认写关注。要设置全局默认写关注,请使用 setDefaultRWConcern 命令。

term 字段是由副本集节点设置的。如果在 rs.reconfig() 操作中进行显式设置,主节点将忽略 term 字段。

rs.reconfig() 默认情况下,允许一次添加或删除不超过 1voting 个节点。例如,新配置最多可以对集群 membership 进行以下更改之一

  • 添加新的投票副本集节点。

  • 删除现有的投票副本集成员。

  • 修改现有副本集节点的 votes

要添加或删除多个投票成员,请发出一系列 rs.reconfig() 操作,每次添加或删除一个成员。

发出 force 重新配置将立即安装新配置,即使它添加或删除多个投票节点。force 重新配置可能会导致意外行为,例如,回滚 "majority" 提交的写入操作。

rs.reconfig() 等待大多数投票副本集成员安装新的副本配置,才会返回成功。投票成员是任何 members[n].votes1 的副本集成员,包括仲裁节点。

副本集节点通过心跳传播其副本配置。每当节点发现具有更高 versionterm 的配置时,它就会安装新配置。重新配置过程具有两个不同的“等待”阶段:

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 驱动程序可检测到主节点丢失,并一次性自动重试某些写入操作,从而为自动故障转移和选举提供额外的内置处理功能:

兼容的驱动程序将默认启用可重试写入

要进一步降低对生产集群的潜在影响,请仅在计划维护期间重新配置。

警告

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);
  1. 第一个语句使用 rs.conf() 方法来检索包含副本集当前配置的文档,并将该文档设为局部变量 cfg

  2. 第二条语句将members[n].priority值设置为members数组中的第二个文档。有关其他设置,请参阅副本集配置设置。

    要访问数组中的成员配置文档,该语句使用数组索引而不是副本集成员的 members[n]._id 字段。

  3. 最后一条语句使用修改后的 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);

提示

另请参阅:

后退

rs.printSecondaryReplicationInfo

在此页面上