記錄一次filebeat日志丟失的問題

在java化項目中,部署到k8s集群后,一度出現(xiàn)無法定位問題的情況始苇。起初懷疑是日志調(diào)用鏈改造導(dǎo)致的,也修復(fù)了一些問題筐喳,但沒有解決根本問題


問題表現(xiàn)

  1. 日志搜集不夠?qū)崟r
    在k8s中執(zhí)行kubectl logs --tail=500 test-6bb5648c4c-4fmrr -n testns隨機取一條記錄催式,在kibana界面無法查詢
  2. 日志沒有被搜集
    上個問題或許過一段時間能查詢到,但有些日志則是完全無法查到避归,就算過了10分鐘也無法查到
  3. 查看近幾天的日志荣月,發(fā)現(xiàn)如下規(guī)律:


    image.png

由上圖可知,日志在某個時間正常梳毙,然后越來越少哺窄。

問題定位

  1. 首先查看elasticsearch
    • 查看索引狀態(tài),一切正常
    get http://localhost :9200/test*
    green  open  test-2020.09.08                         6xRJEYkbRa-EIJRwFvXaow   3   1   37078449            2    205.3gb         97.7gb
    green  open   test-2020.09.07                         RrUCdqUFR26FBKcM91yMiA   3   1   39189071            0    190.2gb         95.1gb
    
    • 查看日志:除了個幾個由于mapping 解析錯誤的日志账锹,沒有異常
  2. 再定位logstash日志
    • 曾發(fā)現(xiàn)有大量的grokFailure日志萌业,這個問題也會導(dǎo)致日志丟失,修正了grok牌废,但依然出現(xiàn)如上問題
    • 也曾發(fā)現(xiàn)由于匹配規(guī)則導(dǎo)致的一些日志遺漏咽白。但同樣沒有解決問題
  3. 再查看kafka是否異常
    • 首先定位消費是否有延后,執(zhí)行如下命令
      ./kafka-consumer-groups.sh --bootstrap-server 10.64.175.183:9092 --describe --group test_k8
      發(fā)現(xiàn)一切正常鸟缕,并沒有阻塞導(dǎo)致日志查不到的現(xiàn)象。
  4. 定位filebeat
    通過以上定位排抬,那基本出問題的可能只能是filebeat了懂从。
    • 查看filebeat日志
      kubectl logs filebeat-7sx7r -n kube-syste
       {"monitoring": {"metrics": {"beat":{"cpu":{"system":{"ticks":660940,"time":{"ms":2108}},"total":{"ticks":7503770,"time":{"ms":25202},"value":7503770},"user":{"ticks":6842830,"time":{"ms":23094}}},"handles":{"limit":{"hard":1048576,"soft":1048576},"open":21},"info":{"ephemeral_id":"3d0c7300-0a5b-405f-8fba-356fc3b3c085","uptime":{"ms":12930017}},"memstats":{"gc_next":131488384,"memory_alloc":74631384,"memory_total":1093590548216},"runtime":{"goroutines":128}},"filebeat":{"events":{"active":145,"added":61940,"done":61795},"harvester":{"open_files":13 1,"running":131,"started":2}},"libbeat":{"config":{"module":{"running":0}},"output":{"events":{"acked":61793,"batches":47,"total":61793}},"outputs":{"kafka":{"bytes_read":51946,"bytes_write":9380778}},"pipeline":{"clients":4,"events":{"active":573,"filtered":2,"published":61938,"total":61940},"queue":{"acked":61793}}},"registrar":{"states":{"current":39,"update":61795},"writes":{"success":49,"total":49}},"system":{"load":{"1":3.62,"15":3.97,"5":4.14,"norm":{"1":0.2263,"15":0.2481,"5":0.2588}}}}}}```  
      
    上面是filebeat自帶的monitoring日志,也就是filbeat的運行狀態(tài)蹲蒲,我們重點關(guān)注:
    "harvester":{"open_files":131,"running":131,"started":2}
    發(fā)現(xiàn)filbeat居然持有這么多文件番甩,也就是說還有131個文件還在搜集的狀態(tài)。
    • 回到對應(yīng)節(jié)點届搁,查看文件狀態(tài)缘薛。lsof |grep deleted

    之所以有這個步驟,1是因為之前cmo發(fā)現(xiàn)k8s報錯了卡睦,大量的文件顯示被刪除宴胧,但實際沒有刪除,仍然被filebeat持有表锻。不過因為當時只發(fā)現(xiàn)只有某個節(jié)點存在這種現(xiàn)象恕齐,不是普遍現(xiàn)象,所以沒有在意瞬逊。2.是filbeat持有這么多文件不正常显歧,現(xiàn)在發(fā)現(xiàn)是只要部署了該應(yīng)用的節(jié)點就有這種現(xiàn)象仪或,也就是filebeat啟動了搜集。

終極原因

定位到上面士骤,其實已經(jīng)差不多了范删,但要想揭開真相,還需要解決以下三個問題:

  1. 為什么持有這么多文件拷肌?
  2. 為什么持有這么多文件會導(dǎo)致上面的一系列問題呢瓶逃?
  3. 還有沒有其他問題呢?
    除了第三個我們可以再解決了前面兩個問題之后觀察就能看出廓块,那么我們重點就是上面兩個問題了厢绝。

出現(xiàn)上述情況,直接原因我們可想而知是在##系統(tǒng)刪除了相關(guān)的日志文件之后带猴,filbeat還持有文件昔汉。

這里可能有兩個原因:

  1. filebeat持有的文件沒有搜集完,所以繼續(xù)持有拴清,也就是那么多文件它都沒有搜集完靶病。
  2. filebeat已經(jīng)搜集完了,但仍然沒有釋放文件口予。

最開始我們懷疑是因為filebeat沒有配置正確娄周,比如close_*配置選項。最后結(jié)合k8s中日志的輪轉(zhuǎn)方式排查沪停,filebeat采取的是默認配置:

  1. close_renamed :這種情況在日志輪轉(zhuǎn)的時候發(fā)生煤辨,默認值是flase。
  2. close_removed: 這個一般發(fā)生在日志真正刪除后木张。 默認值是true众辨。也就是會出現(xiàn)上述情況,日志被刪除了舷礼,filebeat仍繼續(xù)持有文件鹃彻。
  3. close_inactive: 默認值是5分鐘

理論上說這個配置是正確的,因為要保證日志搜集完妻献,且發(fā)生輪轉(zhuǎn)的時候日志依然繼續(xù)搜集蛛株,也能基本上保證搜集完以后關(guān)閉harvest。那么我們暫時排除第二種可能育拨。

filebeat搜集速度過慢

我們繼續(xù)定位第一種可能:filebeat持有的文件沒有搜集完谨履,所以繼續(xù)持有,也就是那么多文件它都沒有搜集完至朗。

  • 如何定位屉符?
    現(xiàn)在單從filebeat的日志已經(jīng)無法看出了。于是想到去看filebeat的注冊表,filebeat的registry文件中存放的是被采集的所有日志的相關(guān)信息矗钟。

    1. 進入到k8s中相應(yīng)的filebeat節(jié)點
      kubectl exec -it filebeat-lh2bq -n kube-system /bin/bash
    2. 查看其中registry文件唆香,截取一條
    {"source":"/data/docker/containers/0eb0397149bcd687a40cd4313b853354ff43e41a6257ccb5ab972d7170881037/0eb0397149bcd687a40cd4313b853354ff43e41a6257ccb5ab972d7170881037-json.log","offset":114912226,"timestamp":"2020-09-08T08:43:41.079295459Z","ttl":-1,"type":"container","meta":null,"FileStateOS":{"inode":8143887,"device":64512}}
    

    重點關(guān)注inode和offset,inode代表某個文件,offset代表filebeat讀到該文件的位置,字節(jié)數(shù)吨艇。

    1. 結(jié)合使用stat查看所在node的真正文件狀態(tài)躬它,持續(xù)觀察(也就是每隔一段更新registry信息):
      發(fā)現(xiàn),當文件被刪除時东涡,inode依然還在冯吓,同時filebeat中的注冊表信息依然在更新,也就是offset持續(xù)增長疮跑,
      114912226->117408238->122393532组贺。最后緩慢增長到198596250,也就是200M祖娘。至此filebeat關(guān)閉這個文件失尖,文件被真正刪除。

docker中的配置:

 "storage-opts":["overlay2.override_kernel_check=true"],
  "log-driver": "json-file",
   "log-opts": {
  "max-size": "200m",
  "max-file": "3"
 }

至此就可以解釋上面兩個問題了渐苏,filebeat沒有搜集完導(dǎo)致一直持有文件掀潮,文件輪轉(zhuǎn)越快,filebeat持有的文件數(shù)越多琼富,搜集性能相應(yīng)的下降仪吧,因此越來越慢,最終導(dǎo)致日志不能實時的查詢鞠眉,以及日志丟失的問題(也許并不會丟失薯鼠,只是長時間查不到)。

解決問題

既然發(fā)現(xiàn)了這個問題就要著手解決
最開始想到兩個解決方案:

  1. 日志輪轉(zhuǎn)文件數(shù)設(shè)置更大
  2. 日志級別設(shè)置設(shè)置高一點凡蚜,之前是debug

讀者可以想一想這兩個方案有沒有問題人断?

顯然是有問題的,這兩個方案并沒有真正解決問題朝蜘,只是延緩了問題的發(fā)生。第一個問題照舊涩金,第二個在并發(fā)量暴增或者日志需要放開是就有問題谱醇。

問題真正的根因所在是filebeat搜集的速度跟不上日志打印的速度。 我們必須找出filebeat慢的原因步做,按理說讀文件應(yīng)該相當快才對副渴,肯定是有哪里的配置不對,導(dǎo)致filebeat的性能如此的低全度。
最終重新審視filebeat部署文檔煮剧,發(fā)現(xiàn)我們部署的時候限制了filebeat的性能:

# filebeat.yaml部分片段 
resources:
  limits:
    memory: 500Mi
    cpu: 200m
  requests:
    cpu: 200m
    memory: 500Mi

這里的200m代表了200*1/1000 個cpu,也就是只有20%的cpu,這樣顯然filebeat在多線程處理的時候性能被大大壓縮勉盅,也就無法跟上我們?nèi)罩据敵龅乃俣扔悠摹6襨8s具有cpu壓縮的問題,它在低cpu的時候仍然能運行草娜,我們無法監(jiān)控到錯誤挑胸,所以很難發(fā)現(xiàn)。
修改配置文件取消限制宰闰,重新部署filebeat 解決
再次查看cpu:

cpu狀態(tài)

再次查看日志茬贵,果然 飛起!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市移袍,隨后出現(xiàn)的幾起案子解藻,更是在濱河造成了極大的恐慌,老刑警劉巖葡盗,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螟左,死亡現(xiàn)場離奇詭異,居然都是意外死亡戳粒,警方通過查閱死者的電腦和手機路狮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔚约,“玉大人奄妨,你說我怎么就攤上這事∑凰睿” “怎么了砸抛?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長树枫。 經(jīng)常有香客問我直焙,道長,這世上最難降的妖魔是什么砂轻? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任奔誓,我火速辦了婚禮,結(jié)果婚禮上搔涝,老公的妹妹穿的比我還像新娘厨喂。我一直安慰自己,他們只是感情好庄呈,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布蜕煌。 她就那樣靜靜地躺著,像睡著了一般诬留。 火紅的嫁衣襯著肌膚如雪斜纪。 梳的紋絲不亂的頭發(fā)上贫母,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音盒刚,去河邊找鬼腺劣。 笑死,一個胖子當著我的面吹牛伪冰,可吹牛的內(nèi)容都是我干的誓酒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贮聂,長吁一口氣:“原來是場噩夢啊……” “哼靠柑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吓懈,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤歼冰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耻警,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隔嫡,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年甘穿,在試婚紗的時候發(fā)現(xiàn)自己被綠了腮恩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡温兼,死狀恐怖秸滴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情募判,我是刑警寧澤荡含,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站届垫,受9級特大地震影響释液,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜装处,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一误债、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妄迁,春花似錦找前、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽项戴。三九已至形帮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辩撑。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工界斜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人合冀。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓各薇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親君躺。 傳聞我的和親對象是個殘疾皇子峭判,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容