《Elastic Stack 实战手册》——四、应用实践——4.2 可观测性应用场景 ——4.2.2.Elasticsearch智能巡检开发设计实践(2) https://developer.aliyun.com/article/1226094
Index 层面指标分析
replica
所有集群的 index 都应该有副本分片,没有副本分片的 index 在节点 crash 时会丢失数据。
GET index_name/_settings
当 number_of_replicas 为 0 时候异常情况。
动态 mapping
dynamic mapping 设置为 true 会使得 mapping 变得不可维护,且 mapping 源数据由
master 维护、分发,大量变更可能导致 master 压力过大,在高峰情况下,可能会使得积压大量task,引发集群不响应、踢出节点等问题。
GET /*/_mapping?format=json
当 number_of_replicas 为 0 时候异常情况。
动态 mapping
dynamic mapping 设置为 true 会使得 mapping 变得不可维护,且 mapping 源数据由
master 维护、分发,大量变更可能导致 master 压力过大,在高峰情况下,可能会使得积压大量task,引发集群不响应、踢出节点等问题。
GET /*/_mapping?format=json
巡检需要检查出 "dynamic=true(或默认)"的索引的集群,标记为异常。
refresh_interval
索引 refresh 频率是影响性能的一个因素,受到 refresh_interval 参数与 buffer 大小的影响,由于业务场景的差异,对 refresh 的设置可能大不相同,可将集群类型大致分为搜索类型与数据分析类型,根据类型的不同设置差异化的阈值,且集群不应该出现 refresh_interval = -1 的设置。
GET /*/_settings?include_defaults=true
indices.refresh.total
refresh 的频率影响着 segment 的生成速度与大小,而 segment 过多往往影响查询性能,并且需要消耗更多的内存和磁盘空间。由于默认值为 refresh_interval = 1s,不考虑 buffer 的影响可以认为 refresh 频率为 60/min,故巡检阈值可以设置到比默认值稍高,例如:count(refresh) = 80/min。
GET /_nodes/stats/indices,ingest/refresh
max_result_window
max_result_window 为单次请求返回 doc 的最大值,默认为 10000,该默认值的限制可以覆盖到所有正常的业务场景。一般是深度分页、全量查询、job 查询可能导致返回 doc 数大于10000,触发异常,而这些场景可以由 scroll、search after 来完成。故该指标阈值可以设置成该参数默认值。
GET /*/_settings?include_defaults=true
jvm 层面指标分析
jvm heap 使用率
jvm 堆的使用率过高有着 OutOfMemory 的风险,并使得 GC 频率过高,影响请求响应时间。由于使用的 G1 收集器,首次 GC 收集会在预估 GC 时间达到预定值的时候开始触发,则
heap 使用率的稳定值也随着参数设置而产生较大差异。而该参数主要是为了预防 OutOfMemory 异常,所以该指标阈值可以设置一个较大值,例如 heap > 90。
GET /_nodes/stats/indices,jvm
jdk version 一致性
由于 Elasticsearch 的分布式属性,集群存在多节点,每个节点一个单独的实例,需要保证jdk 版本一致。
jvm heap segment memory
segment memory 常驻 heap 内存,所以 segment memory 的增长会压缩其他对象的内存空间。segment memory 是每个 segment 倒排词典上层的一个前缀索引,即 FST 结构,该前缀索引会在 segment 不断的累积下逐渐增多。
为了防止其对 heap 内存过多的占用,需要对该值继续检查限制,由于 FST 结构对前缀索引进行大量压缩,正常状态下对 heap 占用较低,巡检阈值也可以设置较低,例如 20% heap_
size。
GET /_nodes/stats/indices,ingest/segments
full gc
Elasticsearch 7.x 默认使用的 G1 垃圾收集器,所以一般会是 Young GC 或 Mixed GC,如果mixed GC 无法跟上新对象分配内存的速度,导致老年代填满无法继续进行 Mixed GC,于是使用 full GC 来收集整个 heap。G1 不提供 full GC,使用的是 serial old GC。所以该
full GC 是单线程串行的,且 stop the world,这对业务来说是致命的。所以该巡检的阈值为"count(full gc) > 0"。
GET /_nodes/stats/indices,jvm
threadpool 层面指标分析
bulk reject 数量
bulk 出现 reject 意味着线程池中线程被完全占用,且队列也已经占满。该指标阈值可设置为 "count(bulk rejected)>0"。
GET _cat/thread_pool
search reject 数量
search 出现 reject 意味着线程池中线程被完全占用,且队列也已经占满。该指标阈值可设置为 count(search rejected)>0,查询 API 同上。
《Elastic Stack 实战手册》——四、应用实践——4.2 可观测性应用场景 ——4.2.2.Elasticsearch智能巡检开发设计实践(4) https://developer.aliyun.com/article/1226091