MongoDB添加仲裁节点报错:"replica set IDs do not match",是指新加入的仲裁节点与当前副本集在复制集标识(replica set ID)上不匹配。下面详细讲解解决该问题的完整流程。
1. 确认副本集的replica set ID
首先需要确认副本集的复制集标识(replica set ID),可以在已有的副本集成员上执行如下命令:
rs.conf()
命令会返回副本集的配置信息,其中包含了复制集标识。例如执行rs.conf()命令返回的结果为:
{
"_id": "test",
"version": 6,
"protocolVersion": 1,
"members": [
{
"_id": 0,
"host": "192.168.1.1:27017",
"arbiterOnly": false,
"buildIndexes": true,
"hidden": false,
"priority": 1,
"tags": {},
"slaveDelay": 0,
"votes": 1
},
{
"_id": 1,
"host": "192.168.1.2:27017",
"arbiterOnly": false,
"buildIndexes": true,
"hidden": false,
"priority": 1,
"tags": {},
"slaveDelay": 0,
"votes": 1
}
],
"settings": {
"chainingAllowed": true,
"heartbeatIntervalMillis": 2000,
"heartbeatTimeoutSecs": 10,
"electionTimeoutMillis": 10000,
"getLastErrorModes": {},
"getLastErrorDefaults": {
"w": 1,
"wtimeout": 0
},
"replicaSetId": ObjectId("5be48c9d64beb5356311f174")
}
}
可以看到副本集的名称为test,复制集标识为ObjectId("5be48c9d64beb5356311f174")。
2. 确认新节点的复制集标识
在将新节点加入副本集之前,需要确认该节点的复制集标识。可以在新节点上执行如下命令:
db.adminCommand({replSetGetStatus: 1})
命令返回新节点的副本集状态,其中packets最后一行包含了新节点的复制集标识。例如执行db.adminCommand({replSetGetStatus: 1})命令返回的结果为:
{
"ok": 1,
"members": [
{
"_id": 0,
"name": "192.168.1.1:27017",
"health": 1,
"state": 1,
"stateStr": "PRIMARY",
"uptime": 126455,
"optime": {
"ts": Timestamp(1541876385, 2),
"t": NumberLong("1")
},
"optimeDate": ISODate("2018-11-10T07:26:25Z"),
"electionTime": Timestamp(1541876458, 1),
"electionDate": ISODate("2018-11-10T07:27:38Z"),
"configVersion": 6,
"self": true
},
{
"_id": 1,
"name": "192.168.1.2:27017",
"health": 1,
"state": 2,
"stateStr": "SECONDARY",
"uptime": 88502,
"optime": {
"ts": Timestamp(1541876385, 2),
"t": NumberLong("1")
},
"optimeDurable": {
"ts": Timestamp(1541876385, 2),
"t": NumberLong("1")
},
"optimeDate": ISODate("2018-11-10T07:26:25Z"),
"optimeDurableDate": ISODate("2018-11-10T07:26:25Z"),
"lastHeartbeat": ISODate("2018-11-11T02:40:09.181Z"),
"lastHeartbeatRecv": ISODate("2018-11-11T02:40:08.219Z"),
"pingMs": NumberLong("0"),
"syncingTo": "192.168.1.1:27017",
"configVersion": 6
},
{
"_id": 2,
"name": "192.168.1.3:27017",
"health": 1,
"state": 7,
"stateStr": "ARBITER",
"uptime": 85392,
"lastHeartbeat": ISODate("2018-11-11T02:40:08.119Z"),
"lastHeartbeatRecv": ISODate("2018-11-11T02:40:07.461Z"),
"pingMs": NumberLong("0"),
"configVersion": 6
}
],
"ok": 1,
"operationTime": Timestamp(1541913608, 1),
"$clusterTime": {
"clusterTime": Timestamp(1541913608, 1),
"signature": {
"hash": BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId": NumberLong("0")
}
},
"myState": 1,
"term": NumberLong("1"),
"maxElectionId": ObjectId("7fffffff0000000000000001"),
"maxCommittedOpTime": {
"ts": Timestamp(1541876385, 2),
"t": NumberLong("1")
},
"members": {...},
"set": "test",
"date": ISODate("2018-11-11T02:41:25.187Z")
}
可以看到新节点的复制集标识为7fffffff0000000000000001。如果新节点的复制集标识与副本集不匹配,则会出现"replica set IDs do not match"错误。
3. 更新新节点的复制集标识
为了让新节点的复制集标识与副本集匹配,我们可以在新节点上使用rs.initiate()命令初始化一个新的副本集,指定和已有的副本集相同的名称和复制集标识。如下所示:
rs.initiate({_id: "test", members: [{_id: 0, host: "192.168.1.3:27017", priority: 0, arbiterOnly: true}]}, {force: true})
其中_id指定副本集名称,members数组指定初始化节点的信息,这里只添加了一个arbiter节点,用来充当仲裁节点,因此priority被设置为0,arbiterOnly被设置为true,其他参数保持默认。
添加完成后,可以使用db.adminCommand({replSetGetStatus: 1})命令再次查看新节点的副本集状态,确认新节点的复制集标识确实被更新成功。
4. 将新节点加入副本集
最后,可以使用rs.add()命令将新节点加入到副本集中。如下所示:
rs.add({host:"192.168.1.3:27017", arbiterOnly:true, priority:0})
其中host指定新节点的地址,arbiterOnly和priority参数和初始化时一样,需要保证新节点和其他节点的参数设置保持一致。
至此,新节点已经成功加入到副本集中作为仲裁节点,"replica set IDs do not match"错误也得到了解决。
示例说明:
- 假设副本集的名称为myrs,复制集标识为ObjectId("5be16b51ba629f4b47a24b02"),新节点IP为192.168.1.4:27017,执行以下命令:
db.adminCommand({replSetGetStatus: 1})
返回的结果中不包含新节点的信息,说明新节点还未加入副本集。
- 在新节点上执行以下命令,确认新节点的复制集标识:
db.adminCommand({replSetGetStatus: 1})
返回的结果中包含新节点的信息,复制集标识为ObjectId("5be16d8fba629f4b47a24b05"),与副本集不匹配。
- 在新节点上执行以下命令,初始化一个新的副本集:
rs.initiate({_id: "myrs", members: [{_id: 0, host: "192.168.1.4:27017", priority: 0, arbiterOnly: true}]}, {force: true})
其中_id指定副本集名称,members数组指定初始化节点的信息,这里只添加了一个arbiter节点,用来充当仲裁节点,因此priority被设置为0,arbiterOnly被设置为true,其他参数保持默认。
- 确认新节点的复制集标识已更新:
db.adminCommand({replSetGetStatus: 1})
返回的结果中新节点的复制集标识为ObjectId("5be16b51ba629f4b47a24b02"),与副本集匹配。
- 将新节点加入副本集:
rs.add({host:"192.168.1.4:27017", arbiterOnly:true, priority:0})
返回的结果中包含了新加入的节点信息,说明新节点已加入副本集,且作为仲裁节点工作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MongoDB添加仲裁节点报错:replica set IDs do not match的解决方法 - Python技术站