成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

沒想到,我們的分布式緩存竟這樣把注冊中心搞垮!

開發 前端 開發工具 分布式
上個月,我們的系統因注冊中心崩塌而引發的一場事故,本是一件稀松平常的事件,可我們猜中了開始卻沒料到原因,始作俑者竟是已在產線運行多年的某分布式緩存系統。

每當有機會寫故障類主題的時候,我都會在開始前靜靜地望著顯示器很久,經過多次煎熬和掙扎之后才敢提起筆來,為什么呢?

[[253487]]

因為這樣的話題很容易招來吐槽,比如 “說了半天,不就是配置沒配好嗎?”,或者 “這代碼是豬寫的嗎?你們團隊有懂性能測試的同學嗎?”,這樣的評論略帶挑釁,而且充滿了鄙視之意。

不過我覺得,在技術的世界里,多數情況都是客觀場景決定了主觀結果,而主觀結果又反映了客觀場景,把場景與結果串起來,用自己的方式寫下來,傳播出去,與有相同經歷的同學聊上一聊,也未嘗不是一件好事。

上個月,我們的系統因注冊中心崩塌而引發的一場事故,本是一件稀松平常的事件,可我們猜中了開始卻沒料到原因,始作俑者竟是已在產線運行多年的某分布式緩存系統。

回顧一下故障過程

這到底是怎么一回事呢?先來回顧一下故障過程。

11 月,某交易日的上午 10 點左右。在中間件監控系統沒有觸發任何報警的情況下,某應用團隊負責人突然跑過來說:“怎么緩存響應這么慢?你們在干什么事嗎?”

由于此正在交易盤中,中間件運維團隊瞬間炸鍋,緊急查看了一系列監控數據,先是通過 Zabbix 查看了如 CPU、內存、網絡及磁盤等基礎預警,一切正常,再查看服務健康狀況,經過一圈折騰之后,也沒發現任何疑點。

懵圈了,沒道理啊。10 點 30 分,收到一通報警信息,內容為 “ZK 集群中的某一個節點故障,端口不通,不能獲取 Node 信息,請迅速處理!”。

這簡單,ZK 服務端口不通,重啟,立即恢復。10 點 40 分,ZK 集群全部癱瘓,無法獲取 Node 數據。

由于應用系統的 Dubbo 服務與分布式緩存使用的是同一套 ZK 集群,而且在此期間應用未重啟過,因此應用服務自身暫時未受到影響。

沒道理啊,無論應用側還是緩存側,近一個月以來都沒有發布過版本,而且分布式緩存除了在 ZK 中存一些節點相關信息之外,基本對 ZK 無依賴。

10 點 50 分,ZK 集群全部重啟,10 分鐘后,再次癱瘓。神奇了,到底哪里出了問題呢?

10 點 55 分,ZK 集群全部重啟,1 分鐘后,發現 Node Count 達到近 22W+,再次崩潰。

10 點 58 分,通過增加監控腳本,查明 Node 源頭來自分布式緩存系統的本地緩存服務。

11 點 00 分,通過控制臺關閉本地緩存服務后,ZK 集群第三次重啟,通過腳本刪除本地化緩存所產生的大量 Node 信息。

11 點 05 分,產線 ZK 集群全部恢復,無異常。一場風波雖說過去了,但每個人的臉上流露出茫然的表情。

邪了門了,這本地緩存為什么能把注冊中心搞崩塌?都上線一年多了,之前為什么不出問題?為什么偏偏今天出事?一堆的問號,充斥著每個人的大腦。

我們本地緩存的工作機制

在這里,我就通過系統流程示意圖的方式,簡要的說明下我們本地緩存系統的一些核心工作機制。

①非本地緩存的工作機制

②本地緩存的工作機制:Key 預加載/更新

分布式緩存

③本地緩存的工作機制:Set/Delete 操作

分布式緩存

④本地緩存的工作機制:Get 操作

分布式緩存

順帶提一句,由于歷史性與資源緊缺的原因,我們部分緩存系統與應用系統的 ZK 集群是混用的,正因如此,給本次事故埋下了隱患。

ZK 集群是怎樣被搞掛的呢?

說到這里,相信對中間件有一定了解的人基本能猜出本事件的全貌。

簡單來說,就是在上線初期,由于流量小,應用系統接入量小,我們本地緩存的消息通知是利用 ZK 來實現的,而且還用到了廣播。

但隨著流量的增加與應用系統接入量的增多,消息發送量成倍增長,最終達到承載能力的上限,ZK 集群崩潰。的確,原因基本猜對了,但消息發送量為什么會成倍的增長呢?

根據本地緩存的工作機制,我們一般會在里面存些什么呢?

  • 更新頻率較低,但訪問卻很頻繁,比如系統參數或業務參數。
  • 單個 Key/Value 較大,網絡消耗比較大,性能下降明顯。
  • 服務端資源匱乏或不穩定(如 I/O),但對穩定性要求極高。

懵圈了,就放些參數類信息,而且更新頻率極低,這樣就把五個節點的 ZK 集群打爆了?

為了找到真相,我們立即進行了代碼走讀,最終發現了蹊蹺。

根據設計,在 “本地緩存的工作機制 - Set/Delete 操作” 的工作機制中,當一個 Key 完成服務端緩存操作后,如果沒有被加到本地緩存規則列表中的 Key,是不可能被觸發消息通知的。

但這里明顯存在 Bug,導致把所有的 Key 都發到了 ZK 中。

這樣就很好理解了,雖然應用系統近期沒有發布版本,但卻通過緩存控制臺,悄悄地把分布式鎖加到了這套緩存分片中,所以交易一開盤,只需幾十分鐘,立馬打爆。

另外,除了發現 Bug 之外,通過事后測試驗證,我們還得出了以下幾點結論:

  • 利用 ZK 進行消息同步,ZK 本身的負載能力較弱,是否切換到 MQ?
  • 監控手段的單一,監控的薄弱。
  • 系統部署結構不合理,基礎架構的 ZK 不應該與應用的 ZK 混用。

說到這里,這個故事也該結束了。

講在***

看完這個故事,一些愛好懟人的小伙伴也許會忍不住發問。你們自己設計的架構,你們自己編寫的代碼,難道不知道其中的邏輯嗎?這么低級的錯誤,居然還有臉拿出來說?

那可未必,對每個技術團隊而言,核心成員的離職與業務形態的變化,都或多或少會引發技術團隊對現有系統形成 “知其然,而不知其所以然” 的情況,雖說每個團隊都在想方設法進行避免,但想完全杜絕,絕非易事。

作為技術管理者,具備良好的心態,把每次故障都看成是一次蟬變的過程,從中得到總結與經驗,并加以傳承,今后不再犯,那就是好樣的。

不過,萬一哪天失手,給系統來了個徹底癱瘓,該怎么辦呢?祝大家一切順利吧。

作者:王曄倞

編輯:陶家龍、孫淑娟

出處:轉載自吃草的羅漢(ID:kidd_wyl)微信公眾號。

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2019-01-22 14:19:04

2018-01-26 23:23:23

JDBC MySQL數據庫

2019-03-08 10:08:41

網絡程序猿代碼

2023-02-26 00:00:02

字符串分割String

2022-11-02 07:46:31

GoFrameGcache緩存

2018-06-27 14:23:38

機器學習人工智能入門方法

2018-05-02 09:38:02

程序員代碼互聯網

2021-01-27 18:13:35

日志nginx信息

2017-12-26 15:41:26

2019-08-19 09:21:36

程序員Bug代碼

2024-03-18 08:50:20

分布式系統機制

2022-03-21 08:55:53

RocketMQ客戶端過濾機制

2017-02-09 17:00:00

iOSSwiftKVC

2012-12-28 13:47:36

Raspberry PGeek

2022-01-05 17:13:28

監控HTTPS網站

2021-01-25 20:08:36

Pandas數據處理數據分析

2023-05-26 07:25:46

微服務架構Dubbo

2021-11-29 05:37:24

Windows Def操作系統微軟

2009-04-28 07:48:29

蓋茨打工基金會

2020-08-14 08:19:25

Shell命令行數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品成人一区二区三区 | 日韩在线观看一区 | 欧美日韩不卡在线 | 九色在线视频 | 91影院 | 久久精品亚洲精品国产欧美kt∨ | 久久久99国产精品免费 | 人人九九精 | 国产精品一区三区 | 国产精品久久久久久久久久妇女 | 毛片综合 | 成人a在线| jdav视频在线观看免费 | 日韩精品在线看 | 免费黄色a视频 | 欧美成人激情视频 | 美国av毛片| 在线观看亚洲专区 | 久久一区视频 | 日韩av免费在线电影 | 免费观看一级黄色录像 | 久久免费资源 | 国产免费一区二区三区免费视频 | 国产2区| 亚洲成人在线视频播放 | 国产美女在线免费观看 | 欧美一区二区综合 | 亚洲a视频| 久久久精品网 | 午夜tv免费观看 | 国产羞羞视频在线观看 | 草久久免费视频 | 日韩在线国产 | 日韩中文在线观看 | 国产在线中文字幕 | 国产一区二区三区在线看 | 中文字幕a√ | 亚洲男人天堂av | 国产精品久久久久久久免费大片 | 国产美女精品视频 | avhd101在线成人播放 |