ElasticSearch突然采集不到日志問題解決分析
0-前言
組內(nèi)同學(xué)反饋,kibana上最新的k8s日志看不到了。由于我們是采用elk(elastic search+logstash+kibana)的方式下部署日志采集系統(tǒng),其中l(wèi)ogstash以Deamonset方式部署到k8s的每一個node節(jié)點上,先去查看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;"
可以看到,出錯關(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)過測試,kibana上可以重新展示最新的log信息。
2-延展
雖然現(xiàn)象問題解決了,但是本質(zhì)問題依舊存在。
思考幾個問題:
- shard能達(dá)到1000,那未來是不是會到達(dá)10000,導(dǎo)致出現(xiàn)同樣的問題?
- 為了避免這樣的問題再次出現(xiàn),那就要控制shard的數(shù)量,那么shard的數(shù)量和什么有關(guān)系?
- 如何控制shard的數(shù)量?
首先,回答第一個問題,先要搞清楚,什么是shard?
- 分片是 Elasticsearch 在集群中分發(fā)數(shù)據(jù)的關(guān)鍵。
- 把分片想象成數(shù)據(jù)的容器。文檔存儲在分片中,然后分片分配到集群中的節(jié)點上。當(dāng)集群擴(kuò)容或縮小,Elasticsearch 將會自動在節(jié)點間遷移分片,以使集群保持平衡。
- 一個分片(shard)是一個最小級別“工作單元(worker unit)”,它只是保存了索引中所有數(shù)據(jù)的一部分。
- 這類似于 MySql 的分庫分表,只不過 Mysql 分庫分表需要借助第三方組件而 ES 內(nèi)部自身實現(xiàn)了此功能。
- 默認(rèn)情況下,一個索引被分配 5 個主分片
可以看到,分片的數(shù)量和索引的數(shù)量是成正比的,也就是說索引越多,分片越多;再結(jié)合我們ES的實際配置,索引命名方式:環(huán)境+日期,環(huán)境是固定的,但是日期是每天增加的,那么索引每天都會增加,也就是說分片的數(shù)量也會隨著時間推移,逐日增加,直到達(dá)到最大索引。
所以,針對第一個問題,即使最大分片數(shù)是10000,也會出現(xiàn)同樣的問題。
那么如何控制shard數(shù)量呢?
其實控制shard數(shù)量,就是控制索引的數(shù)量,控制索引的數(shù)量,就是控制保存的log的數(shù)量,而log的數(shù)量可以通過控制保存的日志有效期天數(shù)來決定。
那么,問題轉(zhuǎn)換為:ES如何只保存固定時間段內(nèi)的日志數(shù)據(jù)?
兩個方案:
- 通過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)的時間來作為查詢的時 間字段,也可以是自定義的, 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-后面的時間的格式
加入到crontab定時器即可。
以上就是ElasticSearch突然采集不到日志問題解決分析的詳細(xì)內(nèi)容,更多關(guān)于ElasticSearch采集不到日志的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實現(xiàn)學(xué)生成績輸出到磁盤文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Java實現(xiàn)將學(xué)生成績輸出到磁盤文件的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-11-11詳解spring boot實現(xiàn)多數(shù)據(jù)源代碼實戰(zhàn)
本篇文章主要介紹了詳解spring boot實現(xiàn)多數(shù)據(jù)源代碼實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07一次線上websocket返回400問題排查的實戰(zhàn)記錄
最近項目中有端對端通信場景,實時性要求較高,考慮后選用了websocket 這一通信協(xié)議,下面這篇文章主要給大家介紹了一次線上websocket返回400問題排查的實戰(zhàn)記錄,需要的朋友可以參考下2022-04-04SpringCloud Gateway的路由,過濾器和限流解讀
這篇文章主要介紹了SpringCloud Gateway的路由,過濾器和限流解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02java?數(shù)組實現(xiàn)學(xué)生成績統(tǒng)計教程
這篇文章主要介紹了java?數(shù)組實現(xiàn)學(xué)生成績統(tǒng)計教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Java和c語言隨機(jī)數(shù)Random代碼詳細(xì)
這篇文章主要介紹Java和c語言得隨機(jī)數(shù)Random,隨機(jī)數(shù)的用處在生活中比較少見,但是用處并不少,比如一些小游戲的制作等等。下面我們就一起來學(xué)習(xí)這篇關(guān)于Java和c隨機(jī)數(shù)Random得文章吧2021-10-10Spring Boot2中如何優(yōu)雅地個性化定制Jackson實現(xiàn)示例
這篇文章主要為大家介紹了Spring Boot2中如何優(yōu)雅地個性化定制Jackson實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05