記一次生產 Kafka 掛掉的那幾分鐘
本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。
Hello,大家好,我是阿粉,作為一個后端工程師不經歷幾次生產事故怎么能成長!阿粉工作幾年來,大大小小,重要不重要的事故也經歷了不少,有損失幾十萬的,有對業務毫無影響但是不應該發生的,每一次事故都是一次成長,而且從每次的事故中阿粉都能學到很多東西,不單單是解決問題,更重要的是對線上有了更深的敬意!
背景
上周下午兩點多的時候,阿粉正在悠閑的敲著代碼,零星的看到幾條報警機器人發的 Kafka 集群負載高的報警信息,看到是負載高而已就沒怎么在意,更何況這個點還不是高峰期,想著過會應該就好了。誰知道過了一會不見好,而且還越來越多,趕緊拿著電腦跑到運維處去看看是什么情況。不看不知道,一看嚇一跳,集群中某個 topic 的數據寫不進去了!但是生產者端沒有任何報錯,看上去還在正常寫入,集群卻在報錯,而且消費端也沒有消費到數據。
報錯內容如下:
- [2020-10-28 15:12:32,923] ERROR [KafkaApi-2] Error when handling request {replica_id=-1,max_wait_time=500,min_bytes=1,topics=[{topic=xxxx,partitions=[{partition=0,fetch_offset=409292609,max_bytes=1048576}]}]} (kafka.server.KafkaApis)
- java.lang.IllegalArgumentException: Magic v1 does not support record headers
看到這程序肯定是沒有問題的,因為最近沒有升級,嘗試重啟集群和服務但是問題依舊存在, 這個時候為了保證業務的穩定,考慮到這個 topic 可能有問題,決定刪掉這個 topic 然后自動重新創建,雖然會丟失部分數據,但是并不會產生大的影響,但是如果服務長時間寫不進去數據將會更嚴重。
處理
好在我們的服務是基于 Nacos 做的服務配置與發現,修改 Nacos 里面的 Kafka 集群配置臨時切換到另一套集群里面,然后重啟服務,因為我們沒有開啟 Nacos 配置自動生效。切換過后數據正常寫入到新的集群,然后手動將舊集群中的有錯誤的 topic 刪掉,刪掉出錯的 topic 過后集群變得一切正常,沒有出現上面的錯誤。既然沒有錯誤了,通過修改 Nacos 將集群配置切換回來,一切也正常。
整個事故從發現到解決差不多經歷了二十幾分鐘,但是因為剛開始忽略了報警信息,導致差不多影響了一個小時的數據,好在這個數據對線上業務本身不會出現大的影響,而且通過切換到臨時集群以及日志數據,還可以找回來一部分。
事后復盤了一下,主要總結了以下幾點,分享給大家,共勉:
- 敬畏線上!線上環境報警信息第一時間查看確保沒問題!
- 保證線上數據安全,及時備份和切換臨時環境(這塊一定要做好動態配置,別慢慢的還要走發布流程,推薦使用 Nacos);
- 事后復盤,回顧整個處理過程,哪些地方可以優化,哪些地方做的不對浪費了時間,下次再遇到這種情況是否可以快速解決。生產上時間就是金錢,事故多一分鐘就多一分鐘風險,有點時候一分鐘可以改變很多東西。
上面的錯誤網上大部分說的都是版本沖突,但是阿粉這邊并沒有升級過,所以這個問題就比較玄學了。
總結
遇到問題不可怕,沒有人能保證服務不出問題,我們要做的就是在遇到問題的時候沉著泠靜,想到應對策略,在最短的時間的想到最好的解決方案,減少風險和損失才是最重要的。另外我們一定懂得敬畏線上,特別的那些非常重要的業務,不然一旦出現問題后果都是很嚴重的。
最后邀請你加入我們的知識星球,這里有 1800+ 優秀的人與你一起進步,如果你是小白那你是穩賺了,很多業內經驗和干貨分享給你;如果你是大佬,那可以進來我們一起交流分享你的經驗,說不定日后我們還可以有合作,給你的人生多一個可能。