ElasticSearch 单个节点监控
Elasticsearch • zhisheng 发表了文章 • 1 个评论 • 4816 次浏览 • 2017-11-07 00:39
原文地址:http://www.54tianzhisheng.cn/2 ... rics/

集群健康监控是对集群信息进行高度的概括,节点统计值 API 提供了集群中每个节点的统计值。节点统计值很多,在监控的时候仍需要我们清楚哪些指标是最值得关注的。
集群健康监控可以参考这篇文章:[ElasticSearch 集群监控](http://www.54tianzhisheng.cn/2 ... trics/)
节点信息 Node Info :
<br /> curl -XGET 'http://localhost:9200/_nodes'<br />
执行上述命令可以获取所有 node 的信息
json<br /> _nodes: {<br /> total: 2,<br /> successful: 2,<br /> failed: 0<br /> },<br /> cluster_name: "elasticsearch",<br /> nodes: {<br /> MSQ_CZ7mTNyOSlYIfrvHag: {<br /> name: "node0",<br /> transport_address: "192.168.180.110:9300",<br /> host: "192.168.180.110",<br /> ip: "192.168.180.110",<br /> version: "5.5.0",<br /> build_hash: "260387d",<br /> total_indexing_buffer: 103887667,<br /> roles:{...},<br /> settings: {...},<br /> os: {<br /> refresh_interval_in_millis: 1000,<br /> name: "Linux",<br /> arch: "amd64",<br /> version: "3.10.0-229.el7.x86_64",<br /> available_processors: 4,<br /> allocated_processors: 4<br /> },<br /> process: {<br /> refresh_interval_in_millis: 1000,<br /> id: 3022,<br /> mlockall: false<br /> },<br /> jvm: {<br /> pid: 3022,<br /> version: "1.8.0_121",<br /> vm_name: "Java HotSpot(TM) 64-Bit Server VM",<br /> vm_version: "25.121-b13",<br /> vm_vendor: "Oracle Corporation",<br /> start_time_in_millis: 1507515225302,<br /> mem: {<br /> heap_init_in_bytes: 1073741824,<br /> heap_max_in_bytes: 1038876672,<br /> non_heap_init_in_bytes: 2555904,<br /> non_heap_max_in_bytes: 0,<br /> direct_max_in_bytes: 1038876672<br /> },<br /> gc_collectors: [],<br /> memory_pools: [],<br /> using_compressed_ordinary_object_pointers: "true",<br /> input_arguments:{}<br /> }<br /> thread_pool:{<br /> force_merge: {},<br /> fetch_shard_started: {},<br /> listener: {},<br /> index: {},<br /> refresh: {},<br /> generic: {},<br /> warmer: {},<br /> search: {},<br /> flush: {},<br /> fetch_shard_store: {},<br /> management: {},<br /> get: {},<br /> bulk: {},<br /> snapshot: {}<br /> }<br /> transport: {...},<br /> http: {...},<br /> plugins: [],<br /> modules: [],<br /> ingest: {...}<br /> }<br />
上面是我已经简写了很多数据之后的返回值,但是指标还是很多,有些是一些常规的指标,对于监控来说,没必要拿取。从上面我们可以主要关注以下这些指标:
<br /> os, process, jvm, thread_pool, transport, http, ingest and indices<br />
节点统计 nodes-statistics
节点统计值 API 可通过如下命令获取:
<br /> GET /_nodes/stats<br />
得到:
json<br /> _nodes: {<br /> total: 2,<br /> successful: 2,<br /> failed: 0<br /> },<br /> cluster_name: "elasticsearch",<br /> nodes: {<br /> MSQ_CZ7mTNyOSlYI0yvHag: {<br /> timestamp: 1508312932354,<br /> name: "node0",<br /> transport_address: "192.168.180.110:9300",<br /> host: "192.168.180.110",<br /> ip: "192.168.180.110:9300",<br /> roles: [],<br /> indices: {<br /> docs: {<br /> count: 6163666,<br /> deleted: 0<br /> },<br /> store: {<br /> size_in_bytes: 2301398179,<br /> throttle_time_in_millis: 122850<br /> },<br /> indexing: {},<br /> get: {},<br /> search: {},<br /> merges: {},<br /> refresh: {},<br /> flush: {},<br /> warmer: {},<br /> query_cache: {},<br /> fielddata: {},<br /> completion: {},<br /> segments: {},<br /> translog: {},<br /> request_cache: {},<br /> recovery: {}<br /> },<br /> os: {<br /> timestamp: 1508312932369,<br /> cpu: {<br /> percent: 0,<br /> load_average: {<br /> 1m: 0.09,<br /> 5m: 0.12,<br /> 15m: 0.08<br /> }<br /> },<br /> mem: {<br /> total_in_bytes: 8358301696,<br /> free_in_bytes: 1381613568,<br /> used_in_bytes: 6976688128,<br /> free_percent: 17,<br /> used_percent: 83<br /> },<br /> swap: {<br /> total_in_bytes: 8455712768,<br /> free_in_bytes: 8455299072,<br /> used_in_bytes: 413696<br /> },<br /> cgroup: {<br /> cpuacct: {},<br /> cpu: {<br /> control_group: "/user.slice",<br /> cfs_period_micros: 100000,<br /> cfs_quota_micros: -1,<br /> stat: {}<br /> }<br /> }<br /> },<br /> process: {<br /> timestamp: 1508312932369,<br /> open_file_descriptors: 228,<br /> max_file_descriptors: 65536,<br /> cpu: {<br /> percent: 0,<br /> total_in_millis: 2495040<br /> },<br /> mem: {<br /> total_virtual_in_bytes: 5002465280<br /> }<br /> },<br /> jvm: {<br /> timestamp: 1508312932369,<br /> uptime_in_millis: 797735804,<br /> mem: {<br /> heap_used_in_bytes: 318233768,<br /> heap_used_percent: 30,<br /> heap_committed_in_bytes: 1038876672,<br /> heap_max_in_bytes: 1038876672,<br /> non_heap_used_in_bytes: 102379784,<br /> non_heap_committed_in_bytes: 108773376,<br /> pools: {<br /> young: {<br /> used_in_bytes: 62375176,<br /> max_in_bytes: 279183360,<br /> peak_used_in_bytes: 279183360,<br /> peak_max_in_bytes: 279183360<br /> },<br /> survivor: {<br /> used_in_bytes: 175384,<br /> max_in_bytes: 34865152,<br /> peak_used_in_bytes: 34865152,<br /> peak_max_in_bytes: 34865152<br /> },<br /> old: {<br /> used_in_bytes: 255683208,<br /> max_in_bytes: 724828160,<br /> peak_used_in_bytes: 255683208,<br /> peak_max_in_bytes: 724828160<br /> }<br /> }<br /> },<br /> threads: {},<br /> gc: {},<br /> buffer_pools: {},<br /> classes: {}<br /> },<br /> thread_pool: {<br /> bulk: {},<br /> fetch_shard_started: {},<br /> fetch_shard_store: {},<br /> flush: {},<br /> force_merge: {},<br /> generic: {},<br /> get: {},<br /> index: {<br /> threads: 1,<br /> queue: 0,<br /> active: 0,<br /> rejected: 0,<br /> largest: 1,<br /> completed: 1<br /> }<br /> listener: {},<br /> management: {},<br /> refresh: {},<br /> search: {},<br /> snapshot: {},<br /> warmer: {}<br /> },<br /> fs: {},<br /> transport: {<br /> server_open: 13,<br /> rx_count: 11696,<br /> rx_size_in_bytes: 1525774,<br /> tx_count: 10282,<br /> tx_size_in_bytes: 1440101928<br /> },<br /> http: {<br /> current_open: 4,<br /> total_opened: 23<br /> },<br /> breakers: {},<br /> script: {},<br /> discovery: {},<br /> ingest: {}<br /> }<br />
节点名是一个 UUID,上面列举了很多指标,下面讲解下:
索引部分 indices
这部分列出了这个节点上所有索引的聚合过的统计值 :
docs展示节点内存有多少文档,包括还没有从段里清除的已删除文档数量。
store部分显示节点耗用了多少物理存储。这个指标包括主分片和副本分片在内。如果限流时间很大,那可能表明你的磁盘限流设置得过低。
indexing显示已经索引了多少文档。这个值是一个累加计数器。在文档被删除的时候,数值不会下降。还要注意的是,在发生内部 索引操作的时候,这个值也会增加,比如说文档更新。
还列出了索引操作耗费的时间,正在索引的文档数量,以及删除操作的类似统计值。
get显示通过 ID 获取文档的接口相关的统计值。包括对单个文档的GET和HEAD请求。
search描述在活跃中的搜索(open_contexts)数量、查询的总数量、以及自节点启动以来在查询上消耗的总时间。用query_time_in_millis / query_total计算的比值,可以用来粗略的评价你的查询有多高效。比值越大,每个查询花费的时间越多,你应该要考虑调优了。
fetch 统计值展示了查询处理的后一半流程(query-then-fetch 里的 fetch )。如果 fetch 耗时比 query 还多,说明磁盘较慢,或者获取了太多文档,或者可能搜索请求设置了太大的分页(比如,size: 10000)。
merges包括了 Lucene 段合并相关的信息。它会告诉你目前在运行几个合并,合并涉及的文档数量,正在合并的段的总大小,以及在合并操作上消耗的总时间。
filter_cache展示了已缓存的过滤器位集合所用的内存数量,以及过滤器被驱逐出内存的次数。过多的驱逐数 可能 说明你需要加大过滤器缓存的大小,或者你的过滤器不太适合缓存(比如它们因为高基数而在大量产生,就像是缓存一个now时间表达式)。
不过,驱逐数是一个很难评定的指标。过滤器是在每个段的基础上缓存的,而从一个小的段里驱逐过滤器,代价比从一个大的段里要廉价的多。有可能你有很大的驱逐数,但是它们都发生在小段上,也就意味着这些对查询性能只有很小的影响。
把驱逐数指标作为一个粗略的参考。如果你看到数字很大,检查一下你的过滤器,确保他们都是正常缓存的。不断驱逐着的过滤器,哪怕都发生在很小的段上,效果也比正确缓存住了的过滤器差很多。
field_data显示 fielddata 使用的内存, 用以聚合、排序等等。这里也有一个驱逐计数。和filter_cache不同的是,这里的驱逐计数是很有用的:这个数应该或者至少是接近于 0。因为 fielddata 不是缓存,任何驱逐都消耗巨大,应该避免掉。如果你在这里看到驱逐数,你需要重新评估你的内存情况,fielddata 限制,请求语句,或者这三者。
segments会展示这个节点目前正在服务中的 Lucene 段的数量。 这是一个重要的数字。大多数索引会有大概 50–150 个段,哪怕它们存有 TB 级别的数十亿条文档。段数量过大表明合并出现了问题(比如,合并速度跟不上段的创建)。注意这个统计值是节点上所有索引的汇聚总数。记住这点。
memory统计值展示了 Lucene 段自己用掉的内存大小。 这里包括底层数据结构,比如倒排表,字典,和布隆过滤器等。太大的段数量会增加这些数据结构带来的开销,这个内存使用量就是一个方便用来衡量开销的度量值。
操作系统和进程部分
OS和Process部分基本是自描述的,不会在细节中展开讲解。它们列出来基础的资源统计值,比如 CPU 和负载。OS部分描述了整个操作系统,而Process部分只显示 Elasticsearch 的 JVM 进程使用的资源情况。
这些都是非常有用的指标,不过通常在你的监控技术栈里已经都测量好了。统计值包括下面这些:
- CPU
- 负载
- 内存使用率 (mem.used_percent)
- Swap 使用率
- 打开的文件描述符 (open_file_descriptors)
JVM 部分
jvm部分包括了运行 Elasticsearch 的 JVM 进程一些很关键的信息。 最重要的,它包括了垃圾回收的细节,这对你的 Elasticsearch 集群的稳定性有着重大影响。
json<br /> jvm: {<br /> timestamp: 1508312932369,<br /> uptime_in_millis: 797735804,<br /> mem: {<br /> heap_used_in_bytes: 318233768,<br /> heap_used_percent: 30,<br /> heap_committed_in_bytes: 1038876672,<br /> heap_max_in_bytes: 1038876672,<br /> non_heap_used_in_bytes: 102379784,<br /> non_heap_committed_in_bytes: 108773376,<br /> }<br /> }<br />
jvm部分首先列出一些和 heap 内存使用有关的常见统计值。你可以看到有多少 heap 被使用了,多少被指派了(当前被分配给进程的),以及 heap 被允许分配的最大值。理想情况下,heap_committed_in_bytes应该等于heap_max_in_bytes。如果指派的大小更小,JVM 最终会被迫调整 heap 大小——这是一个非常昂贵的操作。如果你的数字不相等,阅读 [堆内存:大小和交换](https://www.elastic.co/guide/c ... g.html) 学习如何正确的配置它。
heap_used_percent指标是值得关注的一个数字。Elasticsearch 被配置为当 heap 达到 75% 的时候开始 GC。如果你的节点一直 >= 75%,你的节点正处于 内存压力 状态。这是个危险信号,不远的未来可能就有慢 GC 要出现了。
如果 heap 使用率一直 >=85%,你就麻烦了。Heap 在 90–95% 之间,则面临可怕的性能风险,此时最好的情况是长达 10–30s 的 GC,最差的情况就是内存溢出(OOM)异常。
线程池部分
Elasticsearch 在内部维护了线程池。 这些线程池相互协作完成任务,有必要的话相互间还会传递任务。通常来说,你不需要配置或者调优线程池,不过查看它们的统计值有时候还是有用的,可以洞察你的集群表现如何。
每个线程池会列出已配置的线程数量(threads),当前在处理任务的线程数量(active),以及在队列中等待处理的任务单元数量(queue)。
如果队列中任务单元数达到了极限,新的任务单元会开始被拒绝,你会在rejected统计值上看到它反映出来。这通常是你的集群在某些资源上碰到瓶颈的信号。因为队列满意味着你的节点或集群在用最高速度运行,但依然跟不上工作的蜂拥而入。
这里的一系列的线程池,大多数你可以忽略,但是有一小部分还是值得关注的:
indexing普通的索引请求的线程池bulk批量请求,和单条的索引请求不同的线程池getGet-by-ID 操作search所有的搜索和查询请求merging专用于管理 Lucene 合并的线程池
网络部分
transport显示和 传输地址 相关的一些基础统计值。包括节点间的通信(通常是 9300 端口)以及任意传输客户端或者节点客户端的连接。如果看到这里有很多连接数不要担心;Elasticsearch 在节点之间维护了大量的连接。http显示 HTTP 端口(通常是 9200)的统计值。如果你看到total_opened数很大而且还在一直上涨,这是一个明确信号,说明你的 HTTP 客户端里有没启用 keep-alive 长连接的。持续的 keep-alive 长连接对性能很重要,因为连接、断开套接字是很昂贵的(而且浪费文件描述符)。请确认你的客户端都配置正确。
参考资料
1、[nodes-info](https://www.elastic.co/guide/e ... o.html)
2、[nodes-stats](https://www.elastic.co/guide/e ... s.html)
3、[ES监控指标](http://www.oneapm.com/ci/elasticsearch.html)
最后:
转载请注明地址:http://www.54tianzhisheng.cn/2 ... rics/
ui settings Elasticsearch plugin is red
回复Kibana • huangyingchun 回复了问题 • 1 人关注 • 1 个回复 • 13669 次浏览 • 2017-11-07 08:51
kopf安装在数据节点还是master节点啊?
回复Elasticsearch • redhat 发起了问题 • 1 人关注 • 0 个回复 • 2273 次浏览 • 2017-11-06 16:35
ES内存使用过高
Elasticsearch • redhat 回复了问题 • 8 人关注 • 3 个回复 • 21331 次浏览 • 2017-11-14 08:50
Caught exception while handling client http traffic
Elasticsearch • medcl 回复了问题 • 2 人关注 • 1 个回复 • 6090 次浏览 • 2017-11-16 10:14
使用es事大家都是如何清除历史数据的
Elasticsearch • truman.p.du 回复了问题 • 5 人关注 • 2 个回复 • 21548 次浏览 • 2017-11-07 08:26
logstash在同步数据数据到es报错
Logstash • novia 回复了问题 • 3 人关注 • 2 个回复 • 4757 次浏览 • 2017-11-09 13:53
es5.2只能根据id来更新doc?
Elasticsearch • laoyang360 回复了问题 • 4 人关注 • 3 个回复 • 5111 次浏览 • 2017-11-08 12:45
ELK性能测试及优化
Elasticsearch • yushun 回复了问题 • 4 人关注 • 3 个回复 • 11489 次浏览 • 2017-11-29 15:25
通过httpclient访问es集群查询数据
回复Elasticsearch • zhangpan 发起了问题 • 1 人关注 • 0 个回复 • 4197 次浏览 • 2017-11-06 11:05
spark streaming 写入 Elasticsearch 报错 Cannot detect ES version
回复Elasticsearch • 夜玉 发起了问题 • 1 人关注 • 0 个回复 • 6165 次浏览 • 2017-11-06 10:42
Elasticsearch 如何在同一个字段内多个must必须同时满足查询
Elasticsearch • rhwayfun 回复了问题 • 3 人关注 • 2 个回复 • 16269 次浏览 • 2017-11-06 13:49
社区日报 第92期 (2017-11-06)
社区日报 • cyberdak 发表了文章 • 0 个评论 • 2301 次浏览 • 2017-11-06 09:58
http://t.cn/Rl6ZoRX
2.在vscode中调试es查询语句。
http://t.cn/Rlio50B
3.全面介绍韩语分词器。
http://t.cn/Rli9inA
编辑:cybredak
归档:https://elasticsearch.cn/article/354
订阅:https://tinyletter.com/elastic-daily

