<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一次線上kafka卡頓事故排查過程!

          共 2630字,需瀏覽 6分鐘

           ·

          2020-11-16 22:18

          原文 | www.cnblogs.com/yougewe/p/8975550.html


          由于一次功能上線后,導(dǎo)致某數(shù)據(jù)量急劇下滑,給我們緊張的呢!排查過程也是個學(xué)習(xí)過程!拋開結(jié)果,方法論可供參考~


          1. 確認(rèn)問題的真實性?

          被數(shù)據(jù)部門告知,某數(shù)據(jù)量下滑嚴(yán)重,當(dāng)時即知道問題的嚴(yán)重性。且該問題是在我的功能上線后產(chǎn)生,第一反應(yīng)就是,我代碼哪里寫錯了?
          但是,還得按流程來,通過各種維度數(shù)據(jù)對比請求量,實際落地量。確認(rèn)問題!

          其實該過程中,我們并沒有確認(rèn)自己的數(shù)據(jù)量下滑。但是這也脫不了數(shù)據(jù)下滑的干系。只能進(jìn)行下一步!

          2. 檢查代碼,找有經(jīng)驗的同學(xué),對比原有功能差異點?

          這個步驟其實,是有點盲目的感覺。因為第一步的排查并沒有找到足夠的證明說明問題出在我們,但是問題在于期間只有我們上過線,所以只能自我反省了。

          不過幸好,這過程還真有用,果真發(fā)現(xiàn)了自己埋的一個坑,此坑確實會導(dǎo)致該數(shù)據(jù)量的下滑。趕緊修掉唄!

          然后松了一口氣,以為搞好了。其實不然,數(shù)據(jù)量依然上不去。這就尷尬了!

          我已經(jīng)開始懷疑人生,難道代碼沒發(fā)上去?難道線上和本地某個地方不一樣?測試環(huán)境反復(fù)測試正確無誤。我真想直接把測試環(huán)境代碼弄到線上去,哎,算了吧,很多東西是不會以人的意志為轉(zhuǎn)移的,咱們還是理性點!別謀出路吧!

          3. 直接坐到dba旁邊去吧,讓我們隨時關(guān)注數(shù)據(jù)量?

          自我排查已經(jīng)救不了自己了,那就上dba那里。麻煩幫我統(tǒng)計下上線后,數(shù)據(jù)量的變化,結(jié)果是沒多大差別。心想有可能是時間太短,看不出變化,等會兒再統(tǒng)計吧。依然沒有變化!我的神吶,定了鍋還在。

          大的數(shù)據(jù)量不行,那我用自己的賬號來測試吧,操作完成后,觀察數(shù)據(jù),發(fā)現(xiàn)有時有有時無!額,說不出啥了。

          4. 本地調(diào)試吧?

          原本以為,是線上問題,緊急處理下就好了。然而事實卻超出了我的預(yù)料,將驗證直接交給線上,是對用戶的不負(fù)責(zé),是對數(shù)據(jù)的不負(fù)責(zé)。咱們還是從本地做起吧。

          本地調(diào)試要走vpn,有點煩,但不管怎么樣,還是跑起來了。沒問題啊!這尷尬了。

          然后,引出下一個議題!

          5. 線上環(huán)境配置與測試環(huán)境不一樣?

          然后我們努力找出其中的不同點,哪怕是多了一個文件,某個文件的更改時間點不一致,我們都想去試一下!當(dāng)然了,為了穩(wěn)妥起見,我們還是不能直接在線上驗證的,除非有足夠的證據(jù)說明線上的配置是有問題的。當(dāng)然我們最終并沒有找到這樣的證據(jù),只是將線上的所有東西都搬到測試環(huán)境來驗證,結(jié)果是暢通無阻!

          還有一個證明此路不通的理由,之前的配置跑得好好的東西,難道會自己壞掉?不可能吧。此路不通!

          6. 實在不行了,只能改代碼線上調(diào)試?

          調(diào)試第一步,各自打日志!把之前請求打印不全的地方,加上完整日志,再發(fā)一版吧!有了日志,就有證據(jù),但是真的是急中生錯啊,日志居然打得不對,將參數(shù)打印為了內(nèi)存地址也真是夠了。

          日志改好后,測試唄,繼續(xù)用自己的賬號。還是一樣,有時能能進(jìn)有時不能(監(jiān)控手段為dba起一個臨時的kafka消費者,然后將數(shù)據(jù)拉出來看)!那咋整呢?

          難道是有的機器壞了?分配到壞的機器上去的請求就失敗,分配到正確機器的上去的請求就正確。然后吭哧吭哧搞了半天的數(shù)據(jù)驗證,曾經(jīng)以為這是方向,結(jié)果又被打回。

          7. 不行咱們就抓包吧?

          tcpdump,一個網(wǎng)絡(luò)流抓包神器,lsof助攻一下。

          抓包只是為了確認(rèn)一個問題,客戶機器有發(fā)送請求到服務(wù)端機器,網(wǎng)絡(luò)流正常運轉(zhuǎn)!然后證明,客戶端機器有大量長連接到服務(wù)器,數(shù)據(jù)流發(fā)送接收正常(syn)。這至少說明了一點,客戶端是沒有問題的!那么就還剩一個問題,那就是服務(wù)端出問題了!我們堅信,當(dāng)然要有證據(jù)嘛。

          同理,我們在服務(wù)端機器上進(jìn)行反向抓包,然后抓到了來自客戶端的包,很流暢嘛!額。。。

          8. 不行,沒有思路了,重啟機器吧?

          不,我說的是重啟服務(wù)。最近不是有改動嘛,按理誰改動重啟誰。然而這是沒有用的,因為之前的幾次發(fā)布早已重啟了n次。那咋整呢。只剩重啟服務(wù)端,kafka服務(wù)了唄,死馬當(dāng)活馬醫(yī)吧!

          重啟后,驗證唄。結(jié)果貌似還是發(fā)現(xiàn)有成功,有失敗!

          9. 改異步請求為同步請求?

          又沒思路了,我不甘心吶,為啥測試環(huán)境好好的,到線上就不行了呢?再想想差別在哪里?

          得出的結(jié)論是,線上并發(fā)大,測試環(huán)境量無。然后發(fā)現(xiàn)這一塊代碼是由異步線程做的,會不會是這里有問題?

          不管了,改成同步請求試試吧。再來一版!

          別說,改為同步后,雖然用戶請求基本都慢死了,但是發(fā)現(xiàn)kafka請求確實存在了。難道真的是因為這個,那我們也不能這么改啊,用戶體驗是第一位的,為了這事改異步為同步,咱得吃不了兜著走啊。改回來繼續(xù)其他的吧!

          10. 再回測試環(huán)境,壓測并發(fā)?

          改還原為異步后,又回到當(dāng)初有成功有失敗境地了。

          既然懷疑線上高并發(fā)導(dǎo)致,那為什么不在測試環(huán)境高并發(fā)壓測一下呢?用shell腳本快速寫了一個循環(huán)請求腳本,大量請求到kafka后,并無一絲異常,到此并發(fā)問題取消。(for,nohup
          a.sh > /dev/null 2&>1 &)n 次即模擬n個并發(fā)請求

          11. 再來細(xì)細(xì)檢查代碼吧?

          都不知道查了幾遍了,但是還是要查啊,不然咋整呢,幾個人一起看代碼唄!

          然而這并沒有什么卵用。

          12. 拋開用戶行為,直接以命令行形式操作請求?

          雖然用戶行為是最真實的驗證,但是也是比較麻煩的驗證。

          我們就拋開各種中間環(huán)節(jié),直接向kafka服務(wù)器發(fā)起請求!

          分兩種方式,1 用現(xiàn)在的代碼去請求,2
          用kafka自帶的請求方式請求。結(jié)果得到兩個不同的結(jié)果,用代碼的方式請求的數(shù)據(jù),沒有成功,用kafka自己的請求方式,則毫秒級響應(yīng)。哎,這是讓我又懷疑代碼?

          13. 已走投無路,讓我們再看一眼數(shù)據(jù)吧?

          真的是沒有思路了,只能再來看看數(shù)據(jù),當(dāng)打發(fā)時間了。

          意外就在你想不到的時候發(fā)生了。數(shù)據(jù)已經(jīng)恢復(fù)正常了!我擦!

          倒推時間,倒推事件,是由于kafka重啟,導(dǎo)致數(shù)據(jù)回升的。

          好吧,問題已經(jīng)定位,kafka卡頓導(dǎo)致。咱們已經(jīng)熬不住了,發(fā)個結(jié)論郵件,就先回去洗洗睡吧!

          14. 為什么kafka會卡頓?

          這才是問題的根本!只是我們當(dāng)時已經(jīng)沒有力氣再往下搞了!

          結(jié)論是由于topic請求量過大,而partition過小,導(dǎo)致吞吐量下降。將partition改大之后,終于真正恢復(fù)正常!

          額,好像做了很多無用功,沒辦法 !


          瀏覽 17
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日日操日日干 | 三级91视频 | 天天舔天天插天天干 | 一区二区三区人妖视频 | 玩弄奶水刚产少妇 |