索引状态监控接口
索引状态监控接口的输出信息和节点状态监控接口非常类似。一般情况下,这个接口单独监控起来的意义并不大。
不过在 ES 1.6 版开始,加入了对索引分片级别的 commit id 功能。
回忆一下之前原理章节的内容,commit 是在分片内部,对每个 segment 做的。而数据在主分片和副本分片上,是由各自节点自行做 segment merge 操作,所以副本分片和主分片的 segment 的 commit id 是不一致的。这导致 ES 副本恢复时,跟主分片比对 commit id,基本上每个 segment 都不一样,所以才需要从主分片完整重传一份数据。
新加入分片级别的 commit id 后,副本恢复时,先比对跟主分片的分片级 commit id,如果一致,直接本地恢复副本分片内容即可。
查看分片级别 commit id 的命令如下:
# curl 'http://127.0.0.1:9200/logstash-mweibo-2015.06.15/_stats/commit?level=shards&pretty'
...
"indices" : {
"logstash-2015.06.15" : {
"primaries" : { },
"total" : { },
"shards" : {
"0" : [ {
"routing" : {
"state" : "STARTED",
"primary" : true,
"node" : "AqaYWFQJRIK0ZydvVgASEw",
"relocating_node" : null
},
"commit" : {
"generation" : 726,
"user_data" : {
"translog_id" : "1434297603053",
"sync_id" : "AU4LEh6wnBE6n0qcEXs5"
},
"num_docs" : 36792652
}
} ],
...
注意:为了节约频繁变更的资源消耗,ES 并不会实时更新分片级 commit id。只有连续 5 分钟没有新数据写入的索引,才会触发给索引各分片更新 commit id 的操作。如果你查看的是一个还在新写入数据的索引,看到的内容应该是下面这样:
"commit" : {
"generation" : 590,
"user_data" : {
"translog_id" : "1434038402801"
},
"num_docs" : 29051938
}