当集群很卡的时候,/_cat/indices 接口无法快速响应,有可能需要等上几分钟,因为它需要去各个节点捞取一遍索引状态,特别是使用 HDD 存储日志的集群会更加慢。
经过实践证明,/_cluster/state/ 接口可以最快获取集群状态。
但是数据特别多,我们可以做一下过滤:
ES5:
curl 'localhost:9200/_cluster/state/metadata?local=true&filter_path=metadata.indices.*.settings.index.provided_name&pretty'> /tmp/state.log
ES7(加个 expand_wildcards=open 参数):
curl 'localhost:9200/_cluster/state/metadata?local=true&filter_path=metadata.indices.*.settings.index.provided_name&pretty&expand_wildcards=open'> /tmp/state.log
- /metadata:仅获取 metadata 数据
- local=true:仅读取本地节点的 state 版本,这样就不需要捞取所有节点的状态,避免某些节点响应慢,从而导致整个接口变慢
- filter_path=metadata.indices.*.settings.index.provided_name:使用任何 API 接口都支持的 filter_path 来过滤 json 数据,进一步减少 reponse,这里仅获取 indices name
- pretty:把 json 展开成人类易读格式(换行+缩进)
- expand_wildcards=open:仅获取 open 状态的索引数据(仅 ES7+)
返回数据如下:
{
"metadata" : {
"indices" : {
"logstash-test1-2020.10.27" : {
"settings" : {
"index" : {
"provided_name" : "logstash-test1-2020.10.27"
}
}
},
"logstash-test2-2020.10.27" : {
... ...
}
}
}
}
每个节点都有 cluster state 信息,由 elected master 收集,默认每 30s 就会分发一次到所有节点。所以想要最新的数据,就用 elected master 的 ip 访问这个接口,即使用上 local=true,它的数据也是最新的。
更多用法参考官网的 Cluster State API:
网友评论