索引状态

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

不过在 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
          }

Last updated