1. 什么是MongoDB副本集
MongoDB副本集是一个容错和高可用的解决方案。它是由一组MongoDB服务器组成的。在该集合中,每个副本集服务器都可以扮演不同的角色:Primary、Secondary和Arbiter。其中Primary服务器负责大多数写操作,Secondary服务器则负责从Primary同步数据并可用于读取。Arbiter服务器通常不存储数据,只用于在选举时决定Primary服务器。
在副本集中,每个Secondary服务器可以当作备份,保证系统在某个Primary出现故障时依然可以正常运作。而且,由于数据备份发生在Secondary服务器上,而不是Primary服务器,因此即使Primary服务器出现故障丢失了数据,也可以通过Secondary服务器恢复。
2. 副本集状态的意义
了解副本集状态对于保证MongoDB系统的高可用和可靠性至关重要。副本集状态指的是主服务器和辅助服务器这两者之间的关系。通过查看副本集状态,可以了解每个数据节点的状态,以及副本集是否正常工作。同时,还可以通过状态信息的变化来判断系统是否出现故障。
副本集状态由一组随时间变化的变量组成,其中最常用的是health、state、stateStr、uptime以及lastHeartbeat等几个属性。其中,Primary服务器的health值始终为1,Secondary服务器的值则会发生变化,当其宕机或者磁盘空间不足时,该值会变为0。
3. 查看副本集状态的方法
3.1 使用rs.status()
rs.status()命令是MongoDB中查看副本集状态的最基本方法。该命令会返回一个JSON文档,包含了副本集的各种状态信息。
rs.status()
该命令所返回的JSON文档格式如下:
{
"set" : "test",//副本集的名称
"date" : ISODate("2017-06-08T02:23:15.491Z"),
"myState" : 1,//表示当前节点的状态,1表示Primary,2表示Secondary,0表示Arbiter
"members" : [//副本集中所有节点的信息
{
"_id" : 0,
"name" : "localhost:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 4730,
"optime" : {
"ts" : Timestamp(1496887448, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-06-08T01:10:48Z"),
"electionTime" : Timestamp(1496885645, 1),
"electionDate" : ISODate("2017-06-08T00:40:45Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 1,
"name" : "localhost:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 4318,
"optime" : {
"ts" : Timestamp(1496887448, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-06-08T01:10:48Z"),
"lastHeartbeat" : ISODate("2017-06-08T02:23:14.563Z"),
"lastHeartbeatRecv" : ISODate("2017-06-08T02:23:14.076Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "localhost:27017",
"configVersion" : 2
}
],
"ok" : 1
}
从返回的JSON文档中,可以看到当前Primary服务器的状态为“PRIMARY”, Secondary服务器的状态为“SECONDARY”。
3.2 使用rs.isMaster()
rs.isMaster()命令是用来判断当前节点是否为Primary服务器的简单方法。该命令返回一个JSON文档,其中包含了该节点的各种状态信息以及是否为Primary服务器。
rs.isMaster()
返回的JSON文档格式如下:
{
"setName" : "rs0",
"setVersion" : 3,
"ismaster" : true,
"secondary" : false,
"hosts" : [
"localhost:27017",
"localhost:27018"
],
"primary" : "localhost:27017",
"me" : "localhost:27017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"majorityOpTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"writeConcern" : {
"w" : "",
"wtimeout" : 0,
"provenance" : "clientSupplied"
},
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastCommittedOpTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1600300850, 1),
"signature" : {
"hash" : { "$binary" : "7xFE3Z0f4d3RRbtvYyOBXm8yjvo=", "$type":"00" },
"keyId" : { "low" : -1, "high" : 0, "unsigned" : true }
}
},
"operationTime" : Timestamp(1600300850, 1)
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2020-09-17T03:07:31.325Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 43,
"minWireVersion" : 0,
"maxWireVersion" : 8,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1600300850, 1),
"signature" : {
"hash" : { "$binary" : "7xFE3Z0f4d3RRbtvYyOBXm8yjvo=", "$type" : "00" },
"keyId" : { "low" : -1, "high" : 0, "unsigned" : true }
}
},
"operationTime" : Timestamp(1600300850, 1)
}
从返回的JSON文档中,可以看到当前节点是Primary服务器,而且其ismeaster属性为true。
4. 总结
了解MongoDB副本集状态对于保证系统高可用和可靠性非常重要。可以通过使用rs.status()和rs.isMaster()命令获取系统的状态信息,从而对系统进行调试和故障诊断。