Elasticsearch Node API主要包括Nodes stats API和Nodes Info API,前者用于查看节点的统计信息,例如CPU、内存使用情况,后者则主要是查看节点本身的一些信息,例如主机名、IP地址等。
其实Node API是属于Cluster API的一部分,但针对单个节点又显得相对独立,所以单独进行分析。
01
查看节点统计信息(Nodes stats API)
API的访问格式如下代码块所示,其中<node_id>、<metric>、<index_metric>都是属于可选的选项。
GET /_nodes/<node_id>/stats/<metric>/<index_metric>
当不指定<node_id>时默认查询所有的节点,<metric>指定需要查询的相关指标的信息,多个指标使用逗号分开,如果不指定则返回全部指标信息。
metric支持选项
当指定了<metric>可选项为indices或者不指定<metric>的时候,可以指定<index_metric>可选项,限制返回的响应内容,index_metric支持选项:
- completion
- docs
- fielddata
- flush
- get
- indexing
- merge
- query_cache
- recovery
- refresh
- request_cache
- search
- segments
- store
- translog
- warmer
获取所有节点的统计信息
$ curl -X GET "http://127.0.0.1:9200/_nodes/stats?pretty"
获取指定节点的统计信息
$ curl -X GET "http://127.0.0.1:9200/_nodes/nodeId1,nodeId2/stats?pretty"
详细的API信息可以参考官方文档。
特别关注docs、store、merges、refresh、flush、segments、fielddata、translog、os这些段,以下是案例:
"indices": { "docs": { "count": 5, "deleted": 0 }, "store": { "size_in_bytes": 20471, "reserved_in_bytes": 0 } }
"merges": { "current": 0, "current_docs": 0, "current_size_in_bytes": 0, "total": 0, "total_time_in_millis": 0, "total_docs": 0, "total_size_in_bytes": 0, "total_stopped_time_in_millis": 0, "total_throttled_time_in_millis": 0, "total_auto_throttle_in_bytes": 188743680 }
docs段指明了文档的数量,特别是deleted字段指明的是未被merge的document。在elasticsearch中,segment是不可变的,删除document的操作实际上不会立刻从分段中删除文档,而是记录下删除的动作,等待merge操作的时候清除这些文档生成新的segment,这个值如果很大的话则需要进行介入进行分段的合并,这能够一定程度上提升性能。
store段指明了文档的大小。
merges展示了当前进行segments merge操作的情况,包括了当前在进行merge的document数量和内存使用情况,由于merge对于内存、IO都会有一定的损耗,特别是IO,对写入会有一定的影响,同理的,flush和refresh段的内容与translog flush和indexing buffer refresh有关,故这几个指标也是需要比较重点关注的,他们都提供了total和total_time,两者相除可以知道平均的操作执行时间,用于判断当前操作是否存在耗时过长的问题。
其他的分段都有各自的参考作用,例如os、mem、jvm等,完全可以通过获取相关的信息掌握节点操作系统或者JVM层面的情况,进而为监控提供数据来源或者是协助排查生产问题,如下,可以看到cpu使用率,内存使用率、内存交换情况等。
"cpu": { "percent": 24, "load_average": { "1m": 5.2470703125 } }, "mem": { "total_in_bytes": 8589934592, "free_in_bytes": 19509248, "used_in_bytes": 8570425344, "free_percent": 0, "used_percent": 100 }, "swap": { "total_in_bytes": 5368709120, "free_in_bytes": 1934884864, "used_in_bytes": 3433824256 } }
02
查看节点信息(Nodes Info API)
API的访问格式如下代码块所示,其中<node_id>、<metric>都是属于可选的选项。
GET /_nodes/<node_id>/<metric>
当不指定<node_id>时默认查询所有的节点,<metric>指定需要查询的相关指标的信息,多个指标使用逗号分开,如果不指定则返回全部指标信息。
metric支持选项
response body中重要的字段如下:
通过以上可以看到Node Info API与Node stats API有部分功能重合,Node Info API更侧重于提供节点本身相关的属性信息,两者的搭配可以查看到关于节点整体运行的情况,特别是可以使用Node stats API统计相关的指标,加入到集群的监控中。
03
查看热线程信息(Hot threads API)
检索有关集群中每个节点上当前热线程的信息,这个对于生产问题排查非常有用,例如节点CPU使用率高等问题。
curl -X GET http://127.0.0.1:9200/_nodes/hot_threads
结果如下,可以看到结果标注了cpu usage,可以明确看到线程cpu占用率。
::: {FantuanTech-Node-1}{ixSLP9-ERGaksd8-QX-LQQ}{4ZIEPzigRYKqbagah1I65g}{127.0.0.1}{127.0.0.1:9300}{dilmrt}{ml.machine_memory=8589934592, xpack.installed=true, transform.node=true, ml.max_open_jobs=20} Hot threads at 2021-01-04T09:27:58.777Z, interval=500ms, busiestThreads=3, ignoreIdleThreads=true: 0.0% (60micros out of 500ms) cpu usage by thread 'ticker-schedule-trigger-engine' 10/10 snapshots sharing following 2 elements java.base@15/java.lang.Thread.sleep(Native Method) org.elasticsearch.xpack.watcher.trigger.schedule.engine.TickerScheduleTrig