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

翻車現場:一次JVM FullGC引發的宕機事故

開發 架構
這篇文章給大家聊一次線上生產系統事故的解決經歷,其背后代表的是線上生產系統的 JVM FullGC 可能引發的嚴重故障。

這篇文章給大家聊一次線上生產系統事故的解決經歷,其背后代表的是線上生產系統的 JVM FullGC 可能引發的嚴重故障。

業務場景介紹

先簡單說說線上生產系統的一個背景,因為僅僅是文章作為案例來講,所以弱化大量的業務背景。

簡單來說,這是一套分布式系統,系統 A 需要將一個非常核心以及關鍵的數據通過網絡請求,傳輸給另外一個系統 B。

這里其實就考慮到了一個問題,如果系統 A 剛剛將核心數據傳遞給了系統 B,結果系統 B 莫名其妙宕機了,豈不是會導致數據丟失?

所以在這個分布式系統的架構設計中,采取了非常經典的一個 Quorum 算法。

這個算法簡單來說,就是系統 B 必須要部署奇數個節點,比如說至少部署 3 臺機器,或者是 5 臺機器,7 臺機器,類似這樣子。

然后系統 A 每次傳輸一個數據給系統,都必須要對系統 B 部署的全部機器都發送請求,將一份數據傳輸給系統B部署的所有機器。

要判定系統 A 對系統 B 的一次數據寫是成功的,要求系統 A 必須在指定時間范圍內對超過 Quorum 數量的系統 B 所在機器傳輸成功。

舉個例子,假設系統 B 部署了 3 臺機器,那么他的 Quorum 數量就是:3 / 2 + 1 = 2,也就是說系統 B 的 Quorum 數量就是:所有機器數量 / 2 + 1。

所以系統 A 要判定一個核心數據是否寫成功,如果系統 B 一共部署了 3 臺機器的話,那么系統 A 必須在指定時間內收到 2 臺系統 B 所在機器返回的寫成功的響應。

此時系統 A 才能認為這條數據對系統 B 是寫成功了。這個就是所謂的 Quorum 機制。

也就是說,分布式架構下,系統之間傳輸數據,一個系統要確保自己給另外一個系統傳輸的數據不會丟失,必須要在指定時間內,收到另外一個系統 Quorum(大多數)數量的機器響應說寫成功。

這套機制實際上在很多分布式系統、中間件系統中都有非常廣泛的使用,我們線上的分布式系統也是采用了這個 Quorum 機制在兩個系統之間傳輸數據。

給大家上一張圖,一起來看一下這套架構長啥樣:

 

 

如上圖所示,圖中很清晰的展示了系統 A 和系統 B 之間傳輸一份數據時的 Quorum 機制。

接下來,我們用代碼給大家展示一下,上面的 Quorum 寫機制在代碼層面大概是什么樣子的。

PS:因為實際這套機制涉及大量的底層網絡傳輸、通信、容錯、優化的東西,所以下面代碼經過了大幅度簡化,僅僅表達出了一個核心的意思。

 

 

 

 

上面就是經過大幅精簡后的代碼,不過核心的意思是表達清晰了。大家可以仔細看兩遍,其實還是很容易弄懂的。

這段代碼含義很簡單,說白了就是異步開啟線程發送數據給系統 B 所有的機器,同時進入一個 while 循環等待系統 B 的 Quorum 數量的機器返回響應結果。

如果超過指定超時時間還沒收到預期數量的機器返回結果,那么就判定系統 B 部署的集群出現故障,接著讓系統 A 直接退出,相當于系統 A 宕機。

整個代碼,就是這么個意思!

問題凸現

光是看代碼其實沒啥難的,但是問題就在于線上運行的時候,可不是跟你寫代碼的時候想的一樣簡單。

有一次線上生產系統運行的過程中,整體系統負載都很平穩,本來是不應該有什么問題,但是結果突然收到報警,說系統 A 突然宕機了。

然后就開始進行排查,左排查右排查,發現系統 B 集群都好好的,不應該有問題。

然后再查查系統 A,發現系統 A 別的地方也沒什么問題。***結合系統 A 自身的日志,以及系統 A 的 JVM FullGC 進行垃圾回收的日志,我們才算是搞清楚了具體的故障原因。

定位問題

其實原因非常的簡單,就是系統 A 在線上運行一段時間后,會偶發性的進行長時間 Stop the World 的 JVM FullGC,也就是大面積垃圾回收。

但是,此時會造成系統 A 內部的工作線程大量的卡頓,不再工作。要等 JVM FullGC 結束之后,工作線程才會恢復運作。

我們來看下面那個代碼片段:

 

 

但是這種系統 A 的莫名宕機是不正確的,因為如果沒有 JVM FullGC,本來上面那個 if 語句是不會成立的。

它會停頓 1 秒鐘進入下一輪 while 循環,接著就可以收到系統 B 返回的 Quorum 數量的結果,這個 while 循環就可以中斷,繼續運行了。

結果因為出現了 JVM FullGC 卡頓了幾十秒,導致莫名其妙就觸發了 if 判斷的執行,系統 A 莫名其妙就退出宕機了。

所以,線上的 JVM FullGC 導致的系統長時間卡頓,真是造成系統不穩定運行的隱形殺手之一啊!

解決問題

至于上述代碼穩定性的優化,也很簡單。我們只要在代碼里加入一些東西,監控一下上述代碼中是否發生了 JVM FullGC。

如果發生了 JVM FullGC,就自動延長 expireTime 就可以了。

比如下面代碼的改進:

 

 

通過上述代碼的改進,就可以有效的優化線上系統的穩定性,保證其在 JVM FullGC 發生的情況下,也不會隨意出現異常宕機退出的情況了。

 

責任編輯:龐桂玉 來源: 51CTO技術棧
相關推薦

2019-11-04 10:37:53

MongoDB宕機日志

2025-03-11 08:48:35

JVMOOM事故

2022-08-01 20:29:48

分布式架構數據

2022-10-25 18:00:00

Redis事務生產事故

2021-11-01 17:29:02

Windows系統Fork

2022-12-17 19:49:37

GCJVM故障

2022-11-03 16:10:29

groovyfullGC

2017-08-24 17:37:18

DNS緩存分析

2024-05-13 08:37:17

炫技H5UI

2023-07-13 09:12:37

CNCF項目云原生

2018-12-27 09:09:35

2021-03-05 22:41:55

CDH集群CDH集群

2020-08-24 07:34:39

網絡超時請求

2022-05-12 09:52:09

網絡架構HTTP跨域保護機制

2022-11-29 21:26:26

跨域配置

2021-03-17 00:17:16

命令應急響應

2021-11-22 08:33:27

微信聊天離婚

2023-01-16 14:49:00

MongoDB數據庫

2020-11-16 12:35:25

線程池Java代碼

2022-06-06 11:31:31

MySQL數據查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久夜夜 | 亚洲午夜电影 | 欧美精品一区二区三区一线天视频 | 日本午夜免费福利视频 | 久久在看| 久久精品一区 | 国产精品久久久久久久久久 | 日韩在线精品 | 99精品亚洲国产精品久久不卡 | 欧美操操操 | 成人h视频在线 | 自拍偷拍亚洲欧美 | 日韩在线视频免费观看 | 在线国产一区二区三区 | 欧美日韩电影一区二区 | 日韩一区二区三区在线播放 | 久久精品av麻豆的观看方式 | 亚洲乱码一区二区三区在线观看 | 黄页网址在线观看 | 91超碰caoporn97人人 | 久久99精品久久久久久国产越南 | 中文字幕精品一区二区三区精品 | 色噜噜色综合 | 91在线成人| 亚洲高清视频一区二区 | 久久合久久 | 精品国产乱码久久久久久影片 | 影音先锋中文在线 | www.天天操| 成人国产精品久久久 | 欧美白人做受xxxx视频 | 夜夜摸夜夜操 | 亚洲精品黄色 | 一级毛片视频 | 亚洲一区久久 | www.一区二区三区 | 亚洲 一区 | 97精品一区二区 | 夜夜爽99久久国产综合精品女不卡 | 日韩有码在线观看 | 国产精品一区二区三区久久久 |