微服務(wù)架構(gòu)下服務(wù)故障處理解決方案
? 點擊上方“JavaEdge”,關(guān)注公眾號
微服務(wù)優(yōu)勢之一是可縮小故障影響范圍,局限在某個服務(wù)中。那一個服務(wù)出現(xiàn)故障該如何處理?

1 集群故障

可能整個集群都會故障,無法再對外提供服務(wù)。
1.1 故障原因

代碼bug
比如OOM突發(fā)的流量沖擊,超出了系統(tǒng)的最大承載能力
比如秒殺,會在某個時刻瞬間涌入大量流量,超出系統(tǒng)承載能力
1.2 解決方案


1.2.1 限流

系統(tǒng)所能承載流量根據(jù)集群規(guī)模是固定的,稱為系統(tǒng)最大容量。當真實流量超過系統(tǒng)最大容量,系統(tǒng)響應(yīng)就會變慢,服務(wù)調(diào)用出現(xiàn)大量超時,用戶就會感覺卡頓、無響應(yīng)。所以,應(yīng)根據(jù)系統(tǒng)最大容量,給系統(tǒng)設(shè)置閾值,超過閾值的請求會被自動丟棄,便可保證系統(tǒng)服務(wù)正常。
通常一個微服務(wù)系統(tǒng)會同時提供多個服務(wù),每個服務(wù)在同一時刻的請求量也不同,很可能系統(tǒng)中某服務(wù)的請求量激增,占用系統(tǒng)大部分資源,導(dǎo)致其他服務(wù)無資源可用。
因此,要針對系統(tǒng)中每個服務(wù)的請求量設(shè)置閾值,超過閾值的請求也要丟棄,不至于因為一個服務(wù)影響其他服務(wù)。
可用如下指標衡量服務(wù)的請求量:
QPS
工作線程數(shù)
QPS因不同服務(wù)的響應(yīng)快慢不同,所以系統(tǒng)能承載QPS相差大,所以一般選擇工作線程數(shù)作為限流指標,給系統(tǒng)設(shè)置
總的最大工作線程數(shù)
單個服務(wù)的最大工作線程數(shù)
如此,無論是系統(tǒng)總請求量過大導(dǎo)致整體工作線程數(shù)量達到最大工作線程數(shù),還是某服務(wù)的請求量超過單個服務(wù)的最大工作線程數(shù),都會被限流。

1.2.2 降級

通過停止系統(tǒng)中的某些功能,保證系統(tǒng)整體的可用性,屬一種被動防御方案,因為一般是系統(tǒng)已故障后所采取的一種止損操作。
如何實現(xiàn)

通過開關(guān),在系統(tǒng)運行的內(nèi)存中開辟一塊區(qū)域,專門用于存儲開關(guān)狀態(tài):開啟還是關(guān)閉。并且需監(jiān)聽某端口,通過該端口可向系統(tǒng)下發(fā)命令以改變內(nèi)存中開關(guān)狀態(tài)。當開關(guān)開啟時,業(yè)務(wù)的某段邏輯就不再執(zhí)行,而正常情況下,開關(guān)是關(guān)閉的狀態(tài)。
適用場景

新增的業(yè)務(wù)邏輯
因為新增的業(yè)務(wù)邏輯相對來說不成熟,充滿風險,需加開關(guān)控制新業(yè)務(wù)邏輯是否執(zhí)行依賴的服務(wù)或資源
因依賴的服務(wù)或資源不總是可靠,最好有開關(guān)控制是否對依賴服務(wù)或資源發(fā)起調(diào)用,以保證即使依賴出現(xiàn)問題,也能降級避免影響
分級

一級降級,對業(yè)務(wù)影響最小的
故障時,先執(zhí)行一級降級,所以一級降級也可設(shè)置成自動降級而無需人工
二級降級,對業(yè)務(wù)有一定影響
故障時,若一級降級起不了啥作用,可采取人工
三級降級,對業(yè)務(wù)較大影響
這種降級要么對重大影響金錢交易,要么嚴重影響用戶體驗

2 單IDC故障

為保證業(yè)務(wù)的高可用,部署在不止一個IDC。整個IDC脫網(wǎng)的事情時有發(fā)生,多半是因為不可抗力比如機房著火、光纜被挖斷。
如果業(yè)務(wù)全部部署在這個IDC,那就完全不可訪問,所以采用多IDC部署。
有的采用同城雙活,也就是在一個城市的兩個IDC內(nèi)部署
有的采用異地多活,一般是在兩個城市的兩個IDC內(nèi)部署
支付寶這種金融級別的應(yīng)用采用“三地五中心”部署,這種部署成本顯然高比兩個IDC要高得多,但可用性的保障要更高
采用多IDC部署的最大好處就是當有一個IDC發(fā)生故障時,可以把原來訪問故障IDC的流量切換到正常的IDC,來保證業(yè)務(wù)的正常訪問。
流量切換方案


基于DNS解析的流量切換

通過把請求訪問域名解析的VIP從一個IDC切換到另外一個IDC。
比如訪問“www.baidu.com”,正常情況下北方用戶會解析到聯(lián)通機房的VIP,南方用戶會解析到電信機房的VIP,如果聯(lián)通機房發(fā)生故障的話,會把北方用戶訪問也解析到電信機房的VIP,只不過此時網(wǎng)絡(luò)延遲可能會變長。

基于RPC分組的流量切換

對于一個服務(wù),如果是部署在多個IDC的話,一般每個IDC就是一個分組。假如一個IDC出現(xiàn)故障,那么原先路由到這個分組的流量,就可以通過向配置中心下發(fā)命令,把原先路由到這個分組的流量全部切換到別的分組,這樣的話就可以切換故障IDC的流量了。

3 單機故障

集群中的個別機器出現(xiàn)故障,這種情況往往對全局沒有太大影響,但會導(dǎo)致調(diào)用到故障機器上的請求都失敗,影響整個系統(tǒng)的成功率。
發(fā)生概率最高的一種故障,尤其對于業(yè)務(wù)量大的互聯(lián)網(wǎng)應(yīng)用來說,上萬臺機器的規(guī)模也是很常見的。這種情況下,發(fā)生單機故障的概率就很高了,這個時候只靠運維人肉處理顯然不可行,所以就要求有某種手段來自動處理單機故障。
處理單機故障一個有效的辦法就是自動重啟。
你可以設(shè)置一個閾值,比如以某個接口的平均耗時為準,當監(jiān)控單機上某個接口的平均耗時超過一定閾值時,就認為這臺機器有問題,這個時候就需要把有問題的機器從線上集群中摘除掉,然后在重啟服務(wù)后,重新加入到集群中。
注意,需要防止網(wǎng)絡(luò)抖動造成的接口超時從而觸發(fā)自動重啟。一種方法是在收集單機接口耗時數(shù)據(jù)時,多采集幾個點,比如每10s采集一個點,采集5個點,當5個點中有超過3個點的數(shù)據(jù)都超過設(shè)定的閾值范圍,才認為是真正的單機問題,這時會觸發(fā)自動重啟策略。
為了防止某些特殊情況下,短時間內(nèi)被重啟的單機過多,造成整個服務(wù)池可用節(jié)點數(shù)太少,最好是設(shè)置一個可重啟的單機數(shù)量占整個集群的最大比例,一般這個比例不要超過10%,因為正常情況下,不大可能有超過10%的單機都出現(xiàn)故障。

總結(jié)

故障時,往往多手段并用,比如單IDC故障,先要快速切換流量到正常IDC,但此時可能正常IDC不足以支撐兩IDC流量,所以先要降級部分功能,保證正常的IDC順利支撐切換過來的流量。
要盡量讓故障處理自動化,可大大減少故障影響時間。
往期推薦

目前交流群已有?800+人,旨在促進技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進群
喜歡文章,點個“在看、點贊、分享”素質(zhì)三連支持一下~
