一、简述 ES监控的最主要作用是用于监控ES的服务是否正常运行,以及在出现问题时为提供解决问题提供依据。目前ES监控主要针对三个级别分别是:集群级别、节点级别和索引级别。 集群级别的监控主要是针对整个ES集群来说,包括集群的健康状况、集群的状态等。 节点级别的监控主要是针对每个ES实例的监控,其中包括每个实例的查询索引指标和物理资源使用指标。 索引级别的监控主要是针对每个索引来说,主要包括每个索引的性能指标,由于是针对每个索引的监控,因此一般含有多个索引的ES集群其索引级别的监控数据是非常多的。
针对这三类指标,首先集群级别的指标其性能指标较少,但是其每个指标都非常重要,可以查看集群级别指标获取ES集群的运行状态。其次,节点级别的指标更多的用于问题的排查,当发现集群出现问题时更可能多的时候会直接定位到具体的ES实例,通过查看单台实例的资源使用情况或者其他指标进行问题排查。最后,索引级别的监控的应用场景主要是为应用提供监控,例如某个应用使用到的索引其查询速度变慢就可以通过索引级别的监控判断是否是由于索引创建时一些不合理设置引起的。
二、集群的监控 集群的监控包括二个方面:集群的健康状况和集群的运行状况 1、集群的健康状态,通过api获取:GET _cluster/health?pretty
GET _cluster/health?pretty
{
"cluster_name" : "lqbyz-es",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 8,
"number_of_data_nodes" : 4,
"active_primary_shards" : 120,
"active_shards" : 240,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
关键指标说明:
status:集群状态,分为green、yellow和red。
number_of_nodes/number_of_data_nodes:集群的节点数和数据节点数。
active_primary_shards:集群中所有活跃的主分片数。
active_shards:集群中所有活跃的分片数。
relocating_shards:当前节点迁往其他节点的分片数量,通常为0,当有节点加入或者退出时该值会增加。
initializing_shards:正在初始化的分片。
unassigned_shards:未分配的分片数,通常为0,当有某个节点的副本分片丢失该值就会增加。
number_of_pending_tasks:是指主节点创建索引并分配shards等任务,如果该指标数值一直未减小代表集群存在不稳定因素
active_shards_percent_as_number:集群分片健康度,活跃分片数占总分片数比例。
number_of_pending_tasks:pending task只能由主节点来进行处理,这些任务包括创建索引并将shards分配给节点
2、集群的状况信息 集群状态信息主要包含整个集群的一些统计信息,例如文档数、分片数、资源使用情况等。集群状态信息可以由以下api获取:GET _cluster/stats?pretty
GET _cluster/stats?pretty
{
"_nodes" : {
"total" : 8,
"successful" : 8,
"failed" : 0
},
"cluster_name" : "lqbyz-es",
"cluster_uuid" : "nRAbFt8eS9m0VYO6YKEo4w",
"timestamp" : 1601217640020,
"status" : "green",
"indices" : {
"count" : 33,
"shards" : {
"total" : 240,
"primaries" : 120,
"replication" : 1.0,
"index" : {
"shards" : {
"min" : 2,
"max" : 44,
"avg" : 7.2727272727272725
},
"primaries" : {
"min" : 1,
"max" : 22,
"avg" : 3.6363636363636362
},
"replication" : {
"min" : 1.0,
"max" : 1.0,
"avg" : 1.0
}
}
},
"docs" : {
"count" : 12509216,
"deleted" : 791784
},
"store" : {
"size_in_bytes" : 11514579278
},
"fielddata" : {
"memory_size_in_bytes" : 13464,
"evictions" : 0
},
"query_cache" : {
"memory_size_in_bytes" : 92728,
"total_count" : 19768667,
"hit_count" : 9227143,
"miss_count" : 10541524,
"cache_size" : 10,
"cache_count" : 1509487,
"evictions" : 1509477
},
"completion" : {
"size_in_bytes" : 0
},
"segments" : {
"count" : 986,
"memory_in_bytes" : 48584598,
"terms_memory_in_bytes" : 40039845,
"stored_fields_memory_in_bytes" : 4349408,
"term_vectors_memory_in_bytes" : 0,
"norms_memory_in_bytes" : 1975936,
"points_memory_in_bytes" : 1458889,
"doc_values_memory_in_bytes" : 760520,
"index_writer_memory_in_bytes" : 115607304,
"version_map_memory_in_bytes" : 5522714,
"fixed_bit_set_memory_in_bytes" : 744936,
"max_unsafe_auto_id_timestamp" : 1601164805126,
"file_sizes" : { }
}
},
"nodes" : {
"count" : {
"total" : 8,
"data" : 4,
"coordinating_only" : 1,
"master" : 3,
"ingest" : 1
},
"versions" : [
"7.2.1"
],
"os" : {
"available_processors" : 32,
"allocated_processors" : 32,
"names" : [
{
"name" : "Linux",
"count" : 8
}
],
"pretty_names" : [
{
"pretty_name" : "CentOS Linux 7 (Core)",
"count" : 8
}
],
"mem" : {
"total_in_bytes" : 64806584320,
"free_in_bytes" : 1384660992,
"used_in_bytes" : 63421923328,
"free_percent" : 2,
"used_percent" : 98
}
},
"process" : {
"cpu" : {
"percent" : 0
},
"open_file_descriptors" : {
"min" : 393,
"max" : 1069,
"avg" : 608
}
},
"jvm" : {
"max_uptime_in_millis" : 7668445988,
"versions" : [
{
"version" : "12.0.1",
"vm_name" : "OpenJDK 64-Bit Server VM",
"vm_version" : "12.0.1+12",
"vm_vendor" : "Oracle Corporation",
"bundled_jdk" : true,
"using_bundled_jdk" : true,
"count" : 8
}
],
"mem" : {
"heap_used_in_bytes" : 8168965296,
"heap_max_in_bytes" : 34080817152
},
"threads" : 447
},
"fs" : {
"total_in_bytes" : 429287014400,
"free_in_bytes" : 371347718144,
"available_in_bytes" : 371347718144
},
"plugins" : [ ],
"network_types" : {
"transport_types" : {
"security4" : 8
},
"http_types" : {
"security4" : 8
}
},
"discovery_types" : {
"zen" : 8
},
"packaging_types" : [
{
"flavor" : "default",
"type" : "rpm",
"count" : 8
}
]
}
}
关键指标说明:
indices.count:索引总数。
indices.shards.total:分片总数。
indices.shards.primaries:主分片数量。
docs.count:文档总数。
store.size_in_bytes:数据总存储容量。
segments.count:段总数。
nodes.count.total:总节点数。
nodes.count.data:数据节点数。
nodes. process. cpu.percent:节点CPU使用率。
fs.total_in_bytes:文件系统使用总容量。
fs.free_in_bytes:文件系统剩余总容量。
三、节点监控 节点监控主要针对各个节点,有很多指标对于保证ES集群的稳定运行非常重要。下面对节点监控指标进行介绍。节点指标可以通过以下api获取:GET /_nodes/stats?pretty
GET /_nodes/stats?pretty
{
"_nodes" : {
"total" : 8,
"successful" : 8,
"failed" : 0
},
"cluster_name" : "lqbyz-es",
"nodes" : {
}
}
关键指标说明:
name:节点名。
roles:节点角色。
indices.docs.count:索引文档数。
segments.count:段总数。
jvm.heap_used_percent:内存使用百分比。
thread_pool.{bulk, index, get, search}.{active, queue, rejected}:线程池的一些信息,包括bulk、index、get和search线程池,主要指标有active(激活)线程数,线程queue(队列)数和rejected(拒绝)线程数量。
以下一些指标是一个累加值,当节点重启之后会清零。
indices.indexing.index_total:索引文档数。
indices.indexing.index_time_in_millis:索引总耗时。
indices.get.total:get请求数。
indices.get.time_in_millis:get请求总耗时。
indices.search.query_total:search总请求数。
indices.search.query_time_in_millis:search请求总耗时。indices.search.fetch_total:fetch操作总数量。
indices.search.fetch_time_in_millis:fetch请求总耗时。
jvm.gc.collectors.young.collection_count:年轻代垃圾回收次数。
jvm.gc.collectors.young.collection_time_in_millis:年轻代垃圾回收总耗时。
jvm.gc.collectors.old.collection_count:老年代垃圾回收次数。
jvm.gc.collectors.old.collection_time_in_millis:老年代垃圾回收总耗时。
备注:需要计算的指标分为两类,分别为请求速率指标和请求处理延迟指标。
1、index_per_min:每分钟索引请求数量。计算公式如下:
索引请求率=(index_total两次采集差值)/(系统时间差值(ms))×60000 (公式1)
2、indexAverge_per_min:索引请求处理延迟。计算公式如下:
索引延迟=(index_time_in_millis两次采集差值)/(index_total两次采集差值) (公式2)
get_per_min:每分钟get请求数量,计算公式如(公式1),更改相应参数。
getAverage_per_min:get请求处理延迟,计算公式如(公式2) ,更改相应参数。
merge_per_min:每分钟merge请求数量,计算公式如(公式1),更改相应参数。
mergeAverage_per_min:merge请求处理延迟,计算公式如(公式2) ,更改相应参数。
searchQuery_per_min:每分钟query请求数量,计算公式如(公式1),更改相应参数。
searchQueryAverage_per_min:query请求延迟,计算公式如(公式2) ,更改相应参数。
searchFetch_per_min:每分钟fetch请求数量,计算公式如(公式1),更改相应参数。
searchFetchAverage_per_min:fetch请求延迟,计算公式如(公式2) ,更改相应参数。
youngGc_per_min:每分钟young gc数量,计算公式如(公式1),更改相应参数。
youngGcAverage_per_min:young gc请求延迟,计算公式如(公式2) ,更改相应参数。
oldGc_per_min:每分钟old gc数量,计算公式如(公式1),更改相应参数。
oldGcAverage_per_min:old gc请求延迟,计算公式如(公式2) ,更改相应参数。
四、索引监控 索引监控指标注意针对单个索引,不过也可以通过"_all"对集群种所有索引进行监控,节点指标可以通过以下api获取:GET /_stats?pretty
GET /_stats?pretty
{
"_shards" : {
"total" : 240,
"successful" : 240,
"failed" : 0
},
"_all" : {
"primaries" : {
"docs" : {
"count" : 12509216,
"deleted" : 791784
},
"store" : {
"size_in_bytes" : 5757248526
},
"indexing" : {
"index_total" : 30588566,
"index_time_in_millis" : 5143570,
"index_current" : 0,
"index_failed" : 0,
"delete_total" : 12,
"delete_time_in_millis" : 45,
"delete_current" : 0,
"noop_update_total" : 0,
"is_throttled" : false,
"throttle_time_in_millis" : 0
},
"get" : {
"total" : 3243159,
"time_in_millis" : 183757,
"exists_total" : 3242977,
"exists_time_in_millis" : 183751,
"missing_total" : 182,
"missing_time_in_millis" : 6,
"current" : 0
},
"search" : {
"open_contexts" : 0,
"query_total" : 5597307,
"query_time_in_millis" : 2410418,
"query_current" : 0,
"fetch_total" : 5596851,
"fetch_time_in_millis" : 174601,
"fetch_current" : 0,
"scroll_total" : 473136,
"scroll_time_in_millis" : 622565,
"scroll_current" : 0,
"suggest_total" : 0,
"suggest_time_in_millis" : 0,
"suggest_current" : 0
},
"merges" : {
"current" : 0,
"current_docs" : 0,
"current_size_in_bytes" : 0,
"total" : 373794,
"total_time_in_millis" : 21892509,
"total_docs" : 3054500557,
"total_size_in_bytes" : 256727351490,
"total_stopped_time_in_millis" : 0,
"total_throttled_time_in_millis" : 130284,
"total_auto_throttle_in_bytes" : 2465217352
},
"refresh" : {
"total" : 3568062,
"total_time_in_millis" : 42011140,
"external_total" : 3567653,
"external_total_time_in_millis" : 45420312,
"listeners" : 0
},
"flush" : {
"total" : 330,
"periodic" : 35,
"total_time_in_millis" : 303046
},
"warmer" : {
"current" : 0,
"total" : 3565888,
"total_time_in_millis" : 109062
},
"query_cache" : {
"memory_size_in_bytes" : 73942,
"total_count" : 9882484,
"hit_count" : 4610437,
"miss_count" : 5272047,
"cache_size" : 6,
"cache_count" : 754539,
"evictions" : 754533
},
"fielddata" : {
"memory_size_in_bytes" : 6708,
"evictions" : 0
},
"completion" : {
"size_in_bytes" : 0
},
"segments" : {
"count" : 490,
"memory_in_bytes" : 24181791,
"terms_memory_in_bytes" : 19931435,
"stored_fields_memory_in_bytes" : 2162808,
"term_vectors_memory_in_bytes" : 0,
"norms_memory_in_bytes" : 981376,
"points_memory_in_bytes" : 727948,
"doc_values_memory_in_bytes" : 378224,
"index_writer_memory_in_bytes" : 85756016,
"version_map_memory_in_bytes" : 4231529,
"fixed_bit_set_memory_in_bytes" : 367488,
"max_unsafe_auto_id_timestamp" : -1,
"file_sizes" : { }
},
"translog" : {
"operations" : 1137857,
"size_in_bytes" : 1020867543,
"uncommitted_operations" : 212059,
"uncommitted_size_in_bytes" : 191463796,
"earliest_last_modified_age" : 0
},
"request_cache" : {
"memory_size_in_bytes" : 27059,
"evictions" : 0,
"hit_count" : 1469699,
"miss_count" : 129
},
"recovery" : {
"current_as_source" : 0,
"current_as_target" : 0,
"throttle_time_in_millis" : 161
}
},
"total" : {
"docs" : {
"count" : 25020996,
"deleted" : 1662102
},
"store" : {
"size_in_bytes" : 11526213319
},
"indexing" : {
"index_total" : 61246128,
"index_time_in_millis" : 10347974,
"index_current" : 0,
"index_failed" : 0,
"delete_total" : 30,
"delete_time_in_millis" : 87,
"delete_current" : 0,
"noop_update_total" : 0,
"is_throttled" : false,
"throttle_time_in_millis" : 0
},
"get" : {
"total" : 3695973,
"time_in_millis" : 224666,
"exists_total" : 3695608,
"exists_time_in_millis" : 224652,
"missing_total" : 365,
"missing_time_in_millis" : 14,
"current" : 0
},
"search" : {
"open_contexts" : 0,
"query_total" : 11235854,
"query_time_in_millis" : 4807875,
"query_current" : 0,
"fetch_total" : 11234938,
"fetch_time_in_millis" : 354414,
"fetch_current" : 0,
"scroll_total" : 946306,
"scroll_time_in_millis" : 1219776,
"scroll_current" : 0,
"suggest_total" : 0,
"suggest_time_in_millis" : 0,
"suggest_current" : 0
},
"merges" : {
"current" : 0,
"current_docs" : 0,
"current_size_in_bytes" : 0,
"total" : 749454,
"total_time_in_millis" : 42373556,
"total_docs" : 6120472237,
"total_size_in_bytes" : 514338185876,
"total_stopped_time_in_millis" : 0,
"total_throttled_time_in_millis" : 258535,
"total_auto_throttle_in_bytes" : 4930765585
},
"refresh" : {
"total" : 7151040,
"total_time_in_millis" : 81040105,
"external_total" : 7150190,
"external_total_time_in_millis" : 87847532,
"listeners" : 0
},
"flush" : {
"total" : 693,
"periodic" : 70,
"total_time_in_millis" : 588990
},
"warmer" : {
"current" : 0,
"total" : 7146843,
"total_time_in_millis" : 220830
},
"query_cache" : {
"memory_size_in_bytes" : 92728,
"total_count" : 19774666,
"hit_count" : 9229714,
"miss_count" : 10544952,
"cache_size" : 10,
"cache_count" : 1509487,
"evictions" : 1509477
},
"fielddata" : {
"memory_size_in_bytes" : 13464,
"evictions" : 0
},
"completion" : {
"size_in_bytes" : 0
},
"segments" : {
"count" : 986,
"memory_in_bytes" : 48584598,
"terms_memory_in_bytes" : 40039845,
"stored_fields_memory_in_bytes" : 4349408,
"term_vectors_memory_in_bytes" : 0,
"norms_memory_in_bytes" : 1975936,
"points_memory_in_bytes" : 1458889,
"doc_values_memory_in_bytes" : 760520,
"index_writer_memory_in_bytes" : 170601028,
"version_map_memory_in_bytes" : 8463058,
"fixed_bit_set_memory_in_bytes" : 744936,
"max_unsafe_auto_id_timestamp" : 1601164805126,
"file_sizes" : { }
},
"translog" : {
"operations" : 2275712,
"size_in_bytes" : 2041733134,
"uncommitted_operations" : 424117,
"uncommitted_size_in_bytes" : 382926616,
"earliest_last_modified_age" : 0
},
"request_cache" : {
"memory_size_in_bytes" : 47574,
"evictions" : 0,
"hit_count" : 2939404,
"miss_count" : 256
},
"recovery" : {
"current_as_source" : 0,
"current_as_target" : 0,
"throttle_time_in_millis" : 244
}
}
}
关键指标说明(indexname泛指索引名称):
indexname.primaries.docs.count:索引文档数量。
以下一些指标是一个累加值,当节点重启之后会清零。
indexname.primaries.indexing.index_total:索引文档数。
indexname.primaries.indexing.index_time_in_millis:索引总耗时。
indexname.primaries.get.total:get请求数。
indexname.primaries.get.time_in_millis:get请求总耗时。
indexname.primaries.search.query_total:search总请求数。
indexname.primaries.search.query_time_in_millis:search请求总耗时。indices.search.fetch_total:fetch操作总数量。
indexname.primaries.search.fetch_time_in_millis:fetch请求总耗时。
indexname.primaries.refresh.total:refresh请求总量。
indexname.primaries.refresh.total_time_in_millis:refresh请求总耗时。
indexname.primaries.flush.total:flush请求总量。
indexname.primaries.flush.total_time_in_millis:flush请求总耗时。
计算指标:
索引计算指标和节点监控的计算指标一样分为两类,分别为请求速率指标和请求处理延迟指标并且计算方式一样
```
备注
在节点监控和索引监控时可以获取到一些操作数据,例如index、search、get等。对于这些指标参数有一些需要注意的地方:
search.query
query_total:查询总数,指的每个分片上的查询次数,一般如果有五个分片的话进行一次查询query_total = 5。注意在统计指标的时候应该统计的是total分片的,不应该只统计主分片的值,因为查询请求不一定全部分发到主分片。
get
total:get请求数,一般get都需要指定文档id。同样get也应该统计total分片的值,如果只统计主分片会造成数据变少,因为有时候的get请求不是从主分片取的数据。
indexing
index_total和index_time_in_millis指标是根据索引的文档数来记录,同样需要统计total分片的数据,total分片包括副本的索引请求,一般1个副本的话index_total会乘以2。
search.fetch
一个查询分为两个阶段,一是query另一个是fetch,fetch的情况与get相似,fetch.total指fetch请求数,fetch有可能从主分片拉取数据,也有可能从副本拉取数据。如果只统计主分片的数据会丢失数据。