1. 概述
MongoDB是目前比较流行的一种非关系型数据库,它的分布式架构提供了很好的扩展性。关于MongoDB分片集群的状态监控,这里就来一步一步深入研究。
2. MongoDB分片集群的状态
在MongoDB中,分片集群是由多个分片组成的。每个分片都会有一个状态,表示当前分片的工作状态。如果要监控分片集群的状态,我们需要查看每个分片的状态。除此之外,还需要了解分片集群的整体状态、路由状态等。下面分别介绍这些状态。
2.1 分片集群整体状态
分片集群整体状态反映的是整个分片集群当前的状态。我们可以通过以下命令查看分片集群整体状态:
db.runCommand({whatsmyuri:1})
该命令将返回MongoDB实例的IP及端口号,如果我们在config server中执行该命令,它将返回config server的IP及端口号。通过该命令,我们可以了解当前所有的分片和config server的状态。
2.2 分片状态
每个分片都有一个状态,表示分片的工作状态。下面介绍一些常见的分片状态信息:
2.2.1 分片状态(shard status)
分片状态信息可以通过rs.status()命令获得,该命令将返回当前分片组的状态信息。可以通过db.printShardingStatus()命令查看当前集群的分片情况。
2.2.2 分片复制状态
分片复制状态信息可以通过sh.status()命令获得,该命令将返回复制状态信息,包括复制集的成员、状态等信息。
2.2.3 分片状态命令
下面列出一些常用的分片状态命令:
rs.status():查看当前分片组的状态信息。
sh.status():查看分片集群的状态信息。
db.printShardingStatus():打印分片集群的状态信息,包括chunk、分片等信息。
2.3 路由状态
路由状态反映的是MongoDB路由器的状态。在MongoDB分片集群中,路由器是一个独立的进程,用于管理客户端的连接。我们可以通过以下命令查看路由器的状态:
sh.isBalancerRunning()
该命令将会返回true或者false,表示当前路由器是否处于工作状态。
3. 如何查看分片状态
在MongoDB中,我们可以使用以下命令查看分片状态:
rs.status()
该命令将返回当前分片组的状态信息,其中包括了每个分片的状态及配置服务的状态。也可以通过db.printShardingStatus()命令查看更详细的分片信息。
3.1 rs.status()命令
rs.status()命令将返回当前分片组的状态信息,该信息中包括每个分片的状态及配置服务的状态。除此之外,还包括了MongoDB的版本号、IP地址、运行时长等信息。下面是rs.status()命令的示例:
rs.status()
示例结果如下:
{
"set" : "shard1",
"date" : ISODate("2019-12-05T10:01:38.751Z"),
"myState" : 1,
"term" : NumberLong(8),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.1.1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 162719,
"optime" : {
"ts" : Timestamp(1575510078, 1),
"t" : NumberLong(8)
},
"optimeDate" : ISODate("2019-12-05T09:41:18Z"),
"syncingTo" : "",
"configVersion" : 39861,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1
}
从上面的信息中可以看出,当前分片组的描述就是"set"属性,date表示了当前时间戳,myState表示成员当前的状态,members属性表示了当前分片组的成员。
3.2 db.printShardingStatus()命令
db.printShardingStatus()命令将返回分片集群的状态信息,该信息中包括chunk、分片等信息。下面是db.printShardingStatus()命令的示例:
db.printShardingStatus()
示例结果如下:
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("572337c6d04a51f8b63a9587")
}
shards:
{ "_id" : "shard0000", "host" : "localhost:30000", "state" : 1 }
{ "_id" : "shard0001", "host" : "localhost:30001", "state" : 1 }
active mongoses:
"3.2.0" : 2
balancer:
Currently enabled: yes
Currently running: yes
Busy target: 4
Balancer lock taken at Mon May 09 2016 14:39:03 GMT-0400 (EDT) by ConfigServer:Balancer
collections:
test.col1
shard key: { "name" : 1 }
unique: false
balancing: true
chunks:
shard0001 5
shard0000 5
{ "name" : { "$minKey" : 1 } } -->> { "name" : "b" } on : shard0001 Timestamp(2, 0)
{ "name" : "b" } -->> { "name" : "c" } on : shard0000 Timestamp(2, 1)
{ "name" : "c" } -->> { "name" : "d" } on : shard0000 Timestamp(2, 2)
{ "name" : "d" } -->> { "name" : "e" } on : shard0000 Timestamp(2, 3)
{ "name" : "e" } -->> { "name" : "f" } on : shard0000 Timestamp(2, 4)
...
从上面的结果中可以看出,该命令输出了当前MongoDB集群的状态信息,包括了分片的状态、active mongose的状态等。
4. 总结
在MongoDB分片集群中,我们需要了解分片组的状态、分片的状态、路由状态等,以便更好地监控MongoDB分片集群的运行状态。我们可以使用rs.status()命令、db.printShardingStatus()命令等进行分片状态的监控。