rs.reconfigForPSASet()
rs.reconfigForPSASet( memberIndex, config, { options } )
版本 5.0 中的新增功能。
在主-辅助-仲裁节点 (PSA) 副本集或正在转换为 PSA 架构的副本集上,安全地执行一些配置变更。仅在以下任一情况下,您才可以使用此方法:
您想要将具有从节点(secondary node from replica set)架构的现有三成员副本集的从节点重新配置为具有非零
priority
的投票、数据承载节点。您要向包含一个投票、数据承载节点和一个仲裁节点的现有双节点副本集添加一个具有非零优先级的新投票、数据承载节点。
警告
如果您添加的从节点滞后,并且生成的副本集是 PSA 配置,则第一个配置更改将使用
"majority"
更改提交更改需要的节点数。在这种情况下,您的提交点将滞后,直到从节点赶上。有关此方法行为的详细信息,请参阅行为。
语法
rs.reconfigForPSASet()
方法使用的语法如下:
rs.reconfigForPSASet( memberIndex: <num>, config: <configuration>, { "force" : <boolean>, "maxTimeMS" : <int> } )
Parameter | 类型 | 说明 |
---|---|---|
memberIndex | 整型 | 正在添加或修改的从节点的索引。 |
config | 文档 | 用于指定副本集新配置的文档。 |
force | 布尔 | Optional 警告:不建议使用 指定 强制重新配置可能导致意外或不希望发生的行为,包括回滚 |
maxTimeMS | 整型 | Optional 指定在 |
行为
rs.reconfigForPSASet()
方法分两步重新配置副本集:
该方法重新配置您的副本集,以使用
{ votes: 1, priority: 0 }
添加或修改从节点。一旦已添加或已修改的从节点赶上了所有已提交的写入操作,该方法就会将从节点重新配置为具有在
rs.reconfigForPSASet()
命令({ votes: 1, priority: <num> }
)中指定的priority
。
两步方法避免了在故障转移到新从节点的情况下,在新从节点还没有先前配置中的所有已提交写入时,已提交写入回滚的可能性。
例子
名为 rs0
的副本集配置如下:
{ "_id" : "rs0", "version" : 1, "term": 1, "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : {}, "secondaryDelaySecs" : Long("0"), "votes" : 1 }, { "_id" : 2, "host" : "mongodb1.example.net:27017", "arbiterOnly" : true, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : {}, "secondaryDelaySecs" : Long("0"), "votes" : 1 } ], "protocolVersion" : Long("1"), "writeConcernMajorityJournalDefault": true, "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : 2000, "getLastErrorModes" : {}, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("60e6f83923193faa336889d2") } }
以下操作序列会在副本集中添加新的从节点。这些操作是在连接到主节点时在 mongosh
Shell 中发出的。
cfg = rs.conf(); cfg["members"] = [ { "_id" : 0, "host" : "mongodb0.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : {}, "secondaryDelaySecs" : Long("0"), "votes" : 1 }, { "_id" : 1, "host" : "mongodb1.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 2, "tags" : {}, "secondaryDelaySecs" : Long("0"), "votes" : 1 }, { "_id" : 2, "host" : "mongodb2.example.net:27017", "arbiterOnly" : true, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : {}, "secondaryDelaySecs" : Long("0"), "votes" : 1 } ] rs.reconfigForPSASet(1, cfg);
第二条语句将新的从节点添加到
members
数组中。在此配置中,新的从节点被添加到memberIndex
1
处。memberIndex
与数组索引相同。有关其他设置,请参阅副本集配置设置。最后一条语句使用
memberIndex
1
和修改后的cfg
调用rs.reconfigForPSASet()
方法。memberIndex
是新节点在members
数组中的数组位置。成功重新配置后,副本集配置如下所示:{ "_id" : "rs0", "version" : 1, "term": 1, "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : {}, "secondaryDelaySecs" : Long("0"), "votes" : 1 }, { "_id" : 1, "host" : "mongodb1.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 2, "tags" : {}, "secondaryDelaySecs" : Long("0"), "votes" : 1 }, { "_id" : 2, "host" : "mongodb2.example.net:27017", "arbiterOnly" : true, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : {}, "secondaryDelaySecs" : Long("0"), "votes" : 1 } ], "protocolVersion" : Long("1"), "writeConcernMajorityJournalDefault": true, "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : 2000, "getLastErrorModes" : {}, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("60e6f83923193faa336889d2") } }