mongodb4.0 replica set(副本集) 切換主節點 手動配置主從

解決思路

  1. 爲了保證數據的一致性,需要先停止應用對數據庫的讀寫
  2. 修改要切換爲主節點Primary的Secondary節點的優先級
  3. 重新配置config

解決方式

數據庫通過shell登錄Primary節點,這是因爲修改必須要Primary節點纔可以。通過rs.status()查看當前副本集狀態,找到members需要切換爲Primary節點的數組下標,將其優先級priority設置成members中最大的值,rs.conf()獲取到當前配置,重新配置rs.reconfig(config)就修改成功了。
執行命令:

mongos:PRIMARY> config = rs.conf()
mongos:PRIMARY> config.members[1].priority=2
mongos:PRIMARY> rs.reconfig(config)

以下是詳細的過程輸出:

mongos:PRIMARY> config = rs.conf()
{
	"_id" : "mongos",
	"version" : 1,
	"protocolVersion" : NumberLong(1),
	"writeConcernMajorityJournalDefault" : true,
	"members" : [
		{
			"_id" : 0,
			"host" : "172.21.0.1:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 1,
			"host" : "172.21.0.1:27018",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 2,
			"host" : "172.21.0.1:27019",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		}
	],
	"settings" : {
		"chainingAllowed" : true,
		"heartbeatIntervalMillis" : 2000,
		"heartbeatTimeoutSecs" : 10,
		"electionTimeoutMillis" : 10000,
		"catchUpTimeoutMillis" : -1,
		"catchUpTakeoverDelayMillis" : 30000,
		"getLastErrorModes" : {
			
		},
		"getLastErrorDefaults" : {
			"w" : 1,
			"wtimeout" : 0
		},
		"replicaSetId" : ObjectId("5cf69637809c46464bcd13cc")
	}
}
mongos:PRIMARY> config.members[0].priority=2
2
mongos:PRIMARY> rs.reconfig(config)
{
	"ok" : 1,
	"operationTime" : Timestamp(1562597866, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1562597866, 1),
		"signature" : {
			"hash" : BinData(0,"pS59GbmLjln3v8nK+1Gc4ToQDSE="),
			"keyId" : NumberLong("6698706710267166722")
		}
	}
}
mongos:PRIMARY> 
mongos:PRIMARY> rs.status()
2019-07-08T14:58:17.111+0000 E QUERY    [js] Error: error doing query: failed: network error while attempting to run command 'replSetGetStatus' on host '172.21.0.1:27018'  :
DB.prototype.runCommand@src/mongo/shell/db.js:168:1
DB.prototype.adminCommand@src/mongo/shell/db.js:186:16
rs.status@src/mongo/shell/utils.js:1360:12
@(shell):1:1
2019-07-08T14:58:17.113+0000 I NETWORK  [js] trying reconnect to 172.21.0.1:27018 failed
2019-07-08T14:58:17.116+0000 I NETWORK  [js] reconnect 172.21.0.1:27018 ok
mongos:SECONDARY> 
mongos:SECONDARY> rs.status()
{
	"set" : "mongos",
	"date" : ISODate("2019-07-08T14:58:20.646Z"),
	"myState" : 2,
	"term" : NumberLong(6),
	"syncingTo" : "172.21.0.1:27017",
	"syncSourceHost" : "172.21.0.1:27017",
	"syncSourceId" : 0,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1562597898, 1),
			"t" : NumberLong(6)
		},
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1562597898, 1),
			"t" : NumberLong(6)
		},
		"appliedOpTime" : {
			"ts" : Timestamp(1562597898, 1),
			"t" : NumberLong(6)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1562597898, 1),
			"t" : NumberLong(6)
		}
	},
	"lastStableCheckpointTimestamp" : Timestamp(1562597878, 1),
	"members" : [
		{
			"_id" : 0,
			"name" : "172.21.0.1:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 9562,
			"optime" : {
				"ts" : Timestamp(1562597898, 1),
				"t" : NumberLong(6)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1562597898, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2019-07-08T14:58:18Z"),
			"optimeDurableDate" : ISODate("2019-07-08T14:58:18Z"),
			"lastHeartbeat" : ISODate("2019-07-08T14:58:19.244Z"),
			"lastHeartbeatRecv" : ISODate("2019-07-08T14:58:18.820Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1562597876, 1),
			"electionDate" : ISODate("2019-07-08T14:57:56Z"),
			"configVersion" : 2
		},
		{
			"_id" : 1,
			"name" : "172.21.0.1:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 9567,
			"optime" : {
				"ts" : Timestamp(1562597898, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2019-07-08T14:58:18Z"),
			"syncingTo" : "172.21.0.1:27017",
			"syncSourceHost" : "172.21.0.1:27017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 2,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 2,
			"name" : "172.21.0.1:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 9562,
			"optime" : {
				"ts" : Timestamp(1562597898, 1),
				"t" : NumberLong(6)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1562597898, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2019-07-08T14:58:18Z"),
			"optimeDurableDate" : ISODate("2019-07-08T14:58:18Z"),
			"lastHeartbeat" : ISODate("2019-07-08T14:58:19.244Z"),
			"lastHeartbeatRecv" : ISODate("2019-07-08T14:58:19.289Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "172.21.0.1:27017",
			"syncSourceHost" : "172.21.0.1:27017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 2
		}
	],
	"ok" : 1,
	"operationTime" : Timestamp(1562597898, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1562597898, 1),
		"signature" : {
			"hash" : BinData(0,"g+x+Tlz22VNUuyNvHQztuxkE6J0="),
			"keyId" : NumberLong("6698706710267166722")
		}
	}
}
mongos:SECONDARY> 

執行查看rs.status()過程中出現這個報錯,是因爲修改配置後正在重啓,稍等一會就切換成功,再次回車會發現當前節點已經變成了Secondary節點

mongos:PRIMARY> rs.status()
2019-07-08T14:58:17.111+0000 E QUERY    [js] Error: error doing query: failed: network error while attempting to run command 'replSetGetStatus' on host '172.21.0.1:27018'  :
DB.prototype.runCommand@src/mongo/shell/db.js:168:1
DB.prototype.adminCommand@src/mongo/shell/db.js:186:16
rs.status@src/mongo/shell/utils.js:1360:12
@(shell):1:1
2019-07-08T14:58:17.113+0000 I NETWORK  [js] trying reconnect to 172.21.0.1:27018 failed
2019-07-08T14:58:17.116+0000 I NETWORK  [js] reconnect 172.21.0.1:27018 ok
mongos:SECONDARY> 

至此,手動切換Primary節點就完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章