Docs 菜单

Docs 主页开发应用程序MongoDB Manual

rs.reconfig()

在此页面上

  • 定义
  • 行为
  • 举例
rs.reconfig( configuration, { options } )

重新配置现有副本集,从而覆盖现有副本集配置。要运行该方法,必须连接到副本集的主节点

重要

mongosh 方法

本页介绍了 mongosh方法。这不是数据库命令或特定语言驱动程序(例如 Node.js)的文档。

有关数据库命令,请参阅 replSetReconfig 命令。

对于 MongoDB API 驱动程序,请参阅特定语言的MongoDB 驱动程序文档。

对于传统 mongo Shell 文档,请参阅相应 MongoDB Server 版本的文档:

mongo shell v4.4

rs.reconfig()方法采用以下语法:

rs.reconfig(
<configuration>,
{
"force" : <boolean>,
"maxTimeMS" : <int>
}
)
范围
类型
说明

配置

文档
用于指定副本集配置的文档
布尔

Optional

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

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

整型

Optional

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

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

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

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

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

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

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

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

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

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

发出强制重新配置会立即安装新配置,即使它添加或删除多个投票成员也是如此。强制重新配置可能会导致意外行为,例如回滚"majority"已提交的写入操作。

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

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

1)等待提交当前配置,再安装新配置。

“当前”配置是指在发出rs.reconfig()时主节点使用的副本配置。

在以下情况下,将提交配置:

  • 大多数投票副本集节点都安装了当前配置,并且

  • 所有在先前配置中以 "majority" 提交的写入也已复制到当前配置中的多数。

通常,当前配置已安装在大多数投票副本集节点上。不过,以前配置中的大多数提交的写入可能不会在当前配置中全部提交。Delayed节点 lagging behind主节点的节点可能会增加在该阶段所花的时间。

如果发出的操作具有maxTimeMS限制,并且该操作在等待时超过该限制,则该操作将返回错误并丢弃新配置。该限制是累积性的,在进入下一阶段后不会重置。

2)等待新配置中的大多数投票成员安装新配置。

“新”配置是指指定给rs.reconfig()的副本配置。

主节点安装并开始使用新的副本配置,然后将配置传播给其余副本集成员。该操作只需等待多数投票成员安装新配置,而无需等待提交新配置

如果发出的操作具有maxTimeMS限制,并且该操作在等待时超过该限制,则该操作将返回错误,但会继续使用和传播新配置。

无论先前配置的提交状态如何,发出强制重新配置都会立即安装新配置。强制重新配置可能会导致意外行为,例如回滚"majority"已提交的写入操作。

要检查当前副本配置的提交状态,请在副本集主节点使用 commitmentStatus 参数发出 replSetGetConfig

要在强制执行访问控制的部署上运行该方法,用户必须对集群资源具有 replSetConfigure 操作权限。admin 数据库中具有的 clusterManager 内置角色提供了该命令所需的权限。

rs.reconfig()获得特殊的互斥锁,以防止多个rs.reconfig()操作同时发生。

警告

避免重新配置包含不同 MongoDB 版本节点的副本集,因为验证规则可能因 MongoDB 版本而异。

在某些情况下, rs.reconfig() shell 方法可以触发当前主节点降级。主节点降级会触发选举以选择新的主节点:

从 MongoDB 4.2 开始,当主节点降级时,它不再关闭所有客户端连接,正在进行的写入操作也会被终止。有关详情,请参阅行为

假设采用默认 replica configuration settings(副本配置设置),那么集群选举新的主节点之前的平均时间通常不应超过 12 秒。这包括将主节点标记为不可用以及召集和完成选举所需的时间。您可以通过修改 settings.electionTimeoutMillis 复制配置选项来调整该时间段。网络延迟等因素可能会延长副本集选举完成所需的时间,这反过来又会影响集群在没有主节点的情况下运行的时间。这些因素取决于具体集群架构。

在选举进程期间,集群不能接受写操作,直到选举出新的主节点。

您的应用程序连接逻辑应包括对自动故障转移和后续选举的容忍度。MongoDB 驱动程序可检测到主节点丢失,并一次性自动重试某些写入操作,从而为自动故障转移和选举提供额外的内置处理功能:

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

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

警告

rs.reconfig(){ force: true }一起使用可能会导致多数提交的写入回滚。使用此选项时请谨慎。

使用rs.reconfig()删除副本集节点不会自动删除从其他副本集节点到已删除节点的打开传出连接。

默认情况下,副本集节点等待 5 分钟,然后再删除到删除的节点的连接。在分片副本集中,您可以使用 ShardingTaskExecutorPoolHostTimeoutMS 服务器参数修改该超时。

4.2 版新增功能:要立即删除从副本集到已删除成员的所有传出连接,请对副本集的每个剩余成员运行 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.printSlaveReplicationInfo()

在此页面上