replSetReconfig
定义
replSetReconfig
的
replSetReconfig
管理命令用于修改现有副本集的配置。您可以使用此命令添加和删除成员,以及更改现有成员上设置选项。您必须在admin 数据库的主 副本集成员上运行此命令。提示
在
mongosh
中,此命令也可以通过rs.reconfig()
辅助方法运行.辅助方法对
mongosh
用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。
兼容性
此命令可在以下环境中托管的部署中使用
MongoDB Atlas:适用于云中MongoDB部署的全托管服务
重要
此命令在M0、M2、M5和M10+集群中不受支持。有关更多信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的MongoDB自管理版本
MongoDB Community:源代码可用、免费使用且自管理的MongoDB版本
语法
该命令具有以下语法
db.adminCommand( { replSetReconfig: <new_config_document>, force: <boolean>, maxTimeMS: <int> } )
命令字段
该命令接受以下可选字段
字段 | 描述 |
---|---|
默认为 强制重新配置可能会导致意外或不希望的行为,包括回滚已提交的 | |
可选。指定处理 replSetReconfig 的累计时间限制(毫秒)。默认情况下,replSetReconfig 将无限期等待副本配置传播到大多数副本集成员。设置maxTimeMS 可能会导致操作在应用新配置之前失败。有关更多信息,请参阅重新配置等待大多数成员安装副本配置。 |
您还可以使用shell的rs.reconfig()
方法运行replSetReconfig
。
行为
全局写关注
从MongoDB 5.0开始,在尝试重新配置具有将隐式默认写关注更改为其他设置的副本集之前,必须显式设置全局默认写关注。要设置全局默认写关注,请使用setDefaultRWConcern
命令。
term
副本配置字段
term
字段由主副本集成员设置。如果主副本集在replSetReconfig
操作中显式设置了该字段,则主副本集忽略term
字段。
重新配置一次只能添加或删除不超过一个投票成员
replSetReconfig
默认允许每次最多添加或删除一个投票
成员。例如,新的配置可以对集群的成员资格
进行以下更改:
添加新的投票副本集成员。
删除现有的投票副本集成员。
修改现有副本集成员的
投票数
。
要添加或删除多个投票成员,逐个执行一系列replSetReconfig
操作来添加或删除一个成员。
强制执行重新配置会立即安装新的配置,即使它添加或删除了多个投票成员。强制重新配置可能会导致意外的行为,例如回滚"majority"
已提交的写操作。
重新配置等待多数成员安装副本配置
replSetReconfig
等待直到大多数投票副本集成员安装了新的副本配置后才会返回成功。投票成员是指任何其 members[n].votes
为 1
的副本集成员,包括仲裁者。
副本集成员通过 心跳 来传播它们的副本配置。每当一个成员得知有一个更高版本的配置,并且版本和 term
,它就会安装新的配置。重新配置过程有两个不同的“等待”阶段
- 1) 在安装新配置之前等待当前配置被 提交。
“当前”配置是指在
replSetReconfig
被发出时,由主节点使用的副本配置。配置被提交的条件是
大多数投票副本集成员已安装当前配置,并且
在前一个配置中已提交的
"majority"
写入也已复制到当前配置的多数副本中。
通常,当前配置已经安装在大多数投票副本集成员上。然而,前一个配置中提交的多数写入可能并非全部在当前配置中得到提交。
延迟
成员或落后于主节点的成员可以增加此阶段所需的时间。如果操作带有 maxTimeMS 限制,并且操作在等待时超过限制,则操作返回错误并丢弃新配置。该限制是 累积的,在进入下一阶段后不会重置。
- 2) 等待新配置中的大多数投票成员安装新配置。
“新”配置是指
replSetReconfig
中指定的副本配置。主节点在将配置传播到其他副本集成员之前安装并开始使用新的副本配置。该操作只需等待大多数投票成员安装新配置,而不需要等待新配置被 提交。
如果操作带有 maxTimeMS 限制,并且操作在等待时超过限制,则操作返回错误,但会继续使用和传播新配置。
立即发出一个强制重新配置,将新配置立即安装,而不管前一个配置的提交状态如何。强制重新配置可能会导致意外的行为,例如回滚"majority"
已提交的写操作。
要检查当前副本配置的提交状态,请在副本集主节点上发出带有commitmentStatus参数的replSetGetConfig
。
新投票副本集成员的自动重新配置
从MongoDB 5.0开始,新添加的辅助节点不计为投票成员,直到它达到SECONDARY
状态,才能被选举。
当向副本集添加新的投票节点时,replSetReconfig
将在节点配置中内部添加一个newlyAdded
字段。具有newlyAdded
字段的节点不计入当前投票节点数。当初始同步完成且节点达到SECONDARY
状态时,newlyAdded
字段将自动删除。
注意
尝试添加名为
newlyAdded
的字段的配置将出错,即使运行时带有{ force: true }
。如果现有节点具有
newlyAdded
字段,使用rs.reconfig()
更改配置不会删除newlyAdded
字段。newlyAdded
字段将被追加到用户提供的配置中。replSetGetConfig
将从其输出中删除任何newlyAdded
字段。如果您想查看任何newlyAdded
字段,可以直接查询local.system.replset
集合。
访问控制
要在强制执行访问控制的部署上运行命令,用户必须在集群资源上具有replSetConfigure
权限操作。在admin
数据库中可用的内置角色clusterManager
提供了此命令所需的权限。
锁定行为
replSetReconfig
获取一个特殊的互斥锁,以防止同时发生多个 replSetReconfig
操作。
混合版本副本集
警告
请避免重新配置包含不同MongoDB版本成员的副本集,因为验证规则可能在MongoDB版本之间有所不同。
可用性
大多数集成员必须处于运行状态,才能正确传播更改。
replSetReconfig
在某些情况下可以触发当前主节点降级。主节点降级会触发一个 选举,以选择一个新的 主节点:
当新主节点就任时,它将
term
字段递增,以区分在新主节点上做出的配置更改与在先前主节点上做出的更改。当主节点降级时,它不再关闭所有客户端连接;然而,正在进行的写入操作将被终止。有关详细信息,请参阅 行为。
在集群选举新主节点之前的中位数时间通常不应超过12秒,假设默认 replica configuration settings
。这包括将主节点标记为 不可用 并调用并完成一个 选举 所需的时间。您可以通过修改 settings.electionTimeoutMillis
复制配置选项来调整此时间段。网络延迟等因素可能会延长复制集选举完成所需的时间,这反过来又影响集群在没有主节点的情况下可能运行的时间。这些因素取决于您的特定集群架构。
在选举过程中,集群在选举新主节点之前无法接受写操作。
您的应用程序连接逻辑应包括对自动故障转移和随后选举的容错。
兼容的驱动器默认启用可重试的写入。
为了进一步减少对生产集群的潜在影响,仅在计划维护期间重新配置。
{ force: true }
警告
MongoDB不会在集群中的副本集之间同步强制副本集重新配置。使用{ force: true }
可能会导致回滚多数已提交的写操作以及一个不一致的分区集群。使用此选项时请谨慎。
在移除成员后断开出站连接
使用replSetReconfig
移除副本集成员时,不会自动断开其他副本集成员与被移除成员的开放出站连接。
默认情况下,副本集成员会在断开与被移除成员的连接之前等待5分钟。在分片副本集中,您可以使用ShardingTaskExecutorPoolHostTimeoutMS
服务器参数修改此超时。
要立即断开副本集与被移除成员的所有出站连接,请在副本集上每个剩余成员上运行dropConnections
管理命令。
db.adminCommand( { "dropConnections" : 1, "hostAndPort" : [ "<hostname>:<port>" ] } )
将<hostname>
和<port>
替换为被移除成员的主机名和端口号。
警告
从MongoDB 5.0开始,仅配置了IP地址的节点会失败启动验证并报告错误。请参阅disableSplitHorizonIPCheck
。