ElasticSearch突然采集不到日志問題解決分析
0-前言
組內(nèi)同學(xué)反饋,kibana上最新的k8s日志看不到了。由于我們是采用elk(elastic search+logstash+kibana)的方式下部署日志采集系統(tǒng),其中l(wèi)ogstash以Deamonset方式部署到k8s的每一個(gè)node節(jié)點(diǎn)上,先去查看logstash的pod日志,發(fā)現(xiàn):
"reason": "Validation Failed: 1: this action would add [2] shards, but this cluster currently has [999]/[1000] maximum normal shards open;"
可以看到,出錯(cuò)關(guān)鍵詞是:maximum normal shards open.
1-解決
查閱資料發(fā)現(xiàn),ES7版本以上,默認(rèn)的最大分片數(shù)是1000, 所以最直接的解決方案就是增大ES的maximum shards:
PUT /_cluster/settings
{
"transient": {
"cluster": {
"max_shards_per_node":10000 # 這里可以修改
}
}
}
經(jīng)過測(cè)試,kibana上可以重新展示最新的log信息。
2-延展
雖然現(xiàn)象問題解決了,但是本質(zhì)問題依舊存在。
思考幾個(gè)問題:
- shard能達(dá)到1000,那未來是不是會(huì)到達(dá)10000,導(dǎo)致出現(xiàn)同樣的問題?
- 為了避免這樣的問題再次出現(xiàn),那就要控制shard的數(shù)量,那么shard的數(shù)量和什么有關(guān)系?
- 如何控制shard的數(shù)量?
首先,回答第一個(gè)問題,先要搞清楚,什么是shard?
- 分片是 Elasticsearch 在集群中分發(fā)數(shù)據(jù)的關(guān)鍵。
- 把分片想象成數(shù)據(jù)的容器。文檔存儲(chǔ)在分片中,然后分片分配到集群中的節(jié)點(diǎn)上。當(dāng)集群擴(kuò)容或縮小,Elasticsearch 將會(huì)自動(dòng)在節(jié)點(diǎn)間遷移分片,以使集群保持平衡。
- 一個(gè)分片(shard)是一個(gè)最小級(jí)別“工作單元(worker unit)”,它只是保存了索引中所有數(shù)據(jù)的一部分。
- 這類似于 MySql 的分庫(kù)分表,只不過 Mysql 分庫(kù)分表需要借助第三方組件而 ES 內(nèi)部自身實(shí)現(xiàn)了此功能。
- 默認(rèn)情況下,一個(gè)索引被分配 5 個(gè)主分片
可以看到,分片的數(shù)量和索引的數(shù)量是成正比的,也就是說索引越多,分片越多;再結(jié)合我們ES的實(shí)際配置,索引命名方式:環(huán)境+日期,環(huán)境是固定的,但是日期是每天增加的,那么索引每天都會(huì)增加,也就是說分片的數(shù)量也會(huì)隨著時(shí)間推移,逐日增加,直到達(dá)到最大索引。
所以,針對(duì)第一個(gè)問題,即使最大分片數(shù)是10000,也會(huì)出現(xiàn)同樣的問題。
那么如何控制shard數(shù)量呢?
其實(shí)控制shard數(shù)量,就是控制索引的數(shù)量,控制索引的數(shù)量,就是控制保存的log的數(shù)量,而log的數(shù)量可以通過控制保存的日志有效期天數(shù)來決定。
那么,問題轉(zhuǎn)換為:ES如何只保存固定時(shí)間段內(nèi)的日志數(shù)據(jù)?
兩個(gè)方案:
- 通過API接口調(diào)用
curl -H "Content-Type: application/json" -X POST -d '{"query":{"range":{"@timestamp":{"lt":"now-7d","format":"epoch_millis"}}}}' http://localhost:9200/*/_delete_by_query?conflicts=proceed
# 這里根據(jù)默認(rèn)的時(shí)間來作為查詢的時(shí) 間字段,也可以是自定義的, now-7d保留7天的數(shù)據(jù)
- 通過ES官網(wǎng)工具curator
編寫action.yml
actions:
1:
action: delete_indices
description: "delete index expire date"
options:
ignore_empty_list: True
timeout_override:
disable_action: False
filters:
- filtertype: age
source: name
direction: older
unit: days # 可選days,weeks,months
unit_count: 60 #保留最近60天
timestring: '%Y.%m.%d' #這里是跟在索引logstash-后面的時(shí)間的格式
加入到crontab定時(shí)器即可。
以上就是ElasticSearch突然采集不到日志問題解決分析的詳細(xì)內(nèi)容,更多關(guān)于ElasticSearch采集不到日志的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解SimpleDateFormat的線程安全問題與解決方案
這篇文章主要介紹了SimpleDateFormat的線程安全問題與解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
MyBatisPlus唯一索引批量新增或修改的實(shí)現(xiàn)方法
本文主要介紹了MyBatisPlus唯一索引批量新增或修改的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
springboot默認(rèn)日志框架選擇源碼解析(推薦)
這篇文章主要介紹了springboot默認(rèn)日志框架選擇源碼解析(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
詳解java封裝返回結(jié)果與RestControllerAdvice注解
這篇文章主要為大家介紹了java封裝返回結(jié)果與RestControllerAdvice注解實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
使用Mybatis-plus實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表的內(nèi)部字段進(jìn)行比較
這篇文章主要介紹了使用Mybatis-plus實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表的內(nèi)部字段進(jìn)行比較方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

