安全地修改自管理 PSA 副本集
概述
当重新配置主从仲裁器(PSA)副本集或转换为PSA架构时,需要特别注意以下情况
您希望将现有具有PSA架构的三成员副本集中的一个从节点重新配置为具有非零优先级的投票和承载数据的节点。
您希望向包含一个主节点和一个仲裁器的现有两成员副本集添加一个具有非零优先级的投票和承载数据的节点。
警告
如果您要添加的从节点存在延迟,并且结果副本集为PSA配置,则第一次配置更改将更改需要提交更改的节点数,该数为"majority"
。在这种情况下,您的提交点将落后,直到从节点赶上。
本文档概述了在这些特定情况下重新配置副本集的流程,但不使用指定的辅助方法 rs.reconfigForPSASet()
。
步骤
如果您正在进行上述操作之一,则必须分两步重新配置副本集
使用
{ votes: 1, priority: 0 }
添加或修改副本集中的一个从节点。一旦添加或修改的从节点赶上所有已提交的写入,将重新配置从节点,使其具有非零优先级
{ votes: 1, priority: <num> }
。
两步法可以避免在新次要节点在从之前主要节点接收所有已提交写操作之前进行故障转移时回滚已提交写操作的可能性。
要运行 rs.reconfigForPSASet()
方法,您必须连接到复制集的 主要节点。
添加或修改一个具有1票但优先级为0的次要节点
为了避免在添加或更改投票数据节点时回滚未提交的写操作,您必须首先以 { priority: 0 }
添加节点。
在mongosh
中,修改复制集配置。要重新配置现有的复制集,首先使用 rs.conf()
获取当前配置,根据需要修改配置文档,然后将修改后的文档传递给 rs.reconfig()
:
cfg = rs.conf(); cfg["members"] = [ { // existing member or members }, { "_id" : <num>, // The array position of the new member in the // ``members`` array. "host" : <host>, "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : { <tags> }, "secondaryDelaySecs" : <num>, "votes" : 1 }, { // existing member or members } ] rs.reconfig(cfg);
将次要节点重新配置为具有非零优先级
一旦次要节点追上,将优先级设置为所需数值。在此重新配置成功之前,次要节点必须复制当它有0票时提交的所有写操作。在您发出 rs.reconfig()
命令时,这会自动检查。
cfg = rs.conf(); cfg["members"] = [ { // existing member or members }, { "_id" : <num>, // The array position of the new member in the // ``members`` array. "host" : <host>, "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : <num>, "tags" : { <tags> }, "secondaryDelaySecs" : <num>, "votes" : 1 }, { // existing member or members } ] rs.reconfig(cfg);