索引状态监控接口

索引状态监控接口的输出信息和节点状态监控接口非常类似。一般情况下,这个接口单独监控起来的意义并不大。

不过在 ES 1.6 版开始,加入了对索引分片级别的 commit id 功能。

回忆一下之前原理章节的内容,commit 是在分片内部,对每个 segment 做的。而数据在主分片和副本分片上,是由各自节点自行做 segment merge 操作,所以副本分片和主分片的 segment 的 commit id 是不一致的。这导致 ES 副本恢复时,跟主分片比对 commit id,基本上每个 segment 都不一样,所以才需要从主分片完整重传一份数据。

新加入分片级别的 commit id 后,副本恢复时,先比对跟主分片的分片级 commit id,如果一致,直接本地恢复副本分片内容即可。

查看分片级别 commit id 的命令如下:

  1. # curl 'http://127.0.0.1:9200/logstash-mweibo-2015.06.15/_stats/commit?level=shards&pretty'
  2. ...
  3. "indices" : {
  4. "logstash-2015.06.15" : {
  5. "primaries" : { },
  6. "total" : { },
  7. "shards" : {
  8. "0" : [ {
  9. "routing" : {
  10. "state" : "STARTED",
  11. "primary" : true,
  12. "node" : "AqaYWFQJRIK0ZydvVgASEw",
  13. "relocating_node" : null
  14. },
  15. "commit" : {
  16. "generation" : 726,
  17. "user_data" : {
  18. "translog_id" : "1434297603053",
  19. "sync_id" : "AU4LEh6wnBE6n0qcEXs5"
  20. },
  21. "num_docs" : 36792652
  22. }
  23. } ],
  24. ...

注意:为了节约频繁变更的资源消耗,ES 并不会实时更新分片级 commit id。只有连续 5 分钟没有新数据写入的索引,才会触发给索引各分片更新 commit id 的操作。如果你查看的是一个还在新写入数据的索引,看到的内容应该是下面这样:

  1. "commit" : {
  2. "generation" : 590,
  3. "user_data" : {
  4. "translog_id" : "1434038402801"
  5. },
  6. "num_docs" : 29051938
  7. }