在專欄前面我講過,,單體應(yīng)用改造成微服務(wù)的一個好處是可以減少故障影響范圍,,故障被局限在一個微服務(wù)系統(tǒng)本身,而不是整個單體應(yīng)用都崩潰,。那么具體到一個微服務(wù)系統(tǒng),,如果出現(xiàn)了故障,應(yīng)該如何處理呢,?首先,,我先來帶你回顧一下微服務(wù)系統(tǒng)可能出現(xiàn)故障的種類,主要有三種故障,。集群故障,。根據(jù)我的經(jīng)驗(yàn),微服務(wù)系統(tǒng)一般都是集群部署的,,根據(jù)業(yè)務(wù)量大小而定,,集群規(guī)模從幾臺到甚至上萬臺都有可能。一旦某些代碼出現(xiàn) bug,,可能整個集群都會發(fā)生故障,,不能提供對外提供服務(wù)。單 IDC 故障?,F(xiàn)在大多數(shù)互聯(lián)網(wǎng)公司為了保證業(yè)務(wù)的高可用性,,往往業(yè)務(wù)部署在不止一個 IDC。然而現(xiàn)實(shí)中時常會發(fā)生某個 IDC 的光纜因?yàn)榈缆肥┕け煌跀?,?dǎo)致整個 IDC 脫網(wǎng),。單機(jī)故障。顧名思義就是集群中的個別機(jī)器出現(xiàn)故障,,這種情況往往對全局沒有太大影響,,但會導(dǎo)致調(diào)用到故障機(jī)器上的請求都失敗,影響整個系統(tǒng)的成功率,。在我的實(shí)踐過程中,,這三種故障都經(jīng)常遇到,因此相應(yīng)的處理手段也可謂駕輕就熟,,下面就把我應(yīng)對故障的實(shí)戰(zhàn)經(jīng)驗(yàn)分享給你,,希望對你有所幫助。集群故障一般而言,,集群故障的產(chǎn)生原因不外乎有兩種:一種是代碼 bug 所導(dǎo)致,比如說某一段 Java 代碼不斷地分配大對象,,但沒有及時回收導(dǎo)致 JVM OOM 退出,;另一種是突發(fā)的流量沖擊,超出了系統(tǒng)的最大承載能力,,比如“雙 11”這種購物活動,,電商系統(tǒng)會在零點(diǎn)一瞬間涌入大量流量,,超出系統(tǒng)的最大承載能力,一下子就把整個系統(tǒng)給壓垮了,。應(yīng)付集群故障的思路,,主要有兩種:限流和降級。1. 限流顧名思義,,限流就是限制流量,,通常情況下,系統(tǒng)能夠承載的流量根據(jù)集群規(guī)模的大小是固定的,,可以稱之為系統(tǒng)的最大容量,。當(dāng)真實(shí)流量超過了系統(tǒng)的最大容量后,就會導(dǎo)致系統(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ù)在同一時刻的請求量也是不同的,很可能出現(xiàn)的一種情況就是,,系統(tǒng)中某個服務(wù)的請求量突增,,占用了系統(tǒng)中大部分資源,導(dǎo)致其他服務(wù)沒有資源可用,。因此,,還要針對系統(tǒng)中每個服務(wù)的請求量也設(shè)置一個閾值,超過這個閾值的請求也要被自動拋棄,,這樣的話不至于因?yàn)橐粋€服務(wù)影響了其他所有服務(wù),。在實(shí)際項目中,可以用兩個指標(biāo)來衡量服務(wù)的請求量,,一個是 QPS 即每秒請求量,,一個是工作線程數(shù)。不過 QPS 因?yàn)椴煌?wù)的響應(yīng)快慢不同,,所以系統(tǒng)能夠承載的 QPS 相差很大,,因此一般選擇工作線程數(shù)來作為限流的指標(biāo),給系統(tǒng)設(shè)置一個總的最大工作線程數(shù)以及單個服務(wù)的最大工作線程數(shù),,這樣的話無論是系統(tǒng)的總請求量過大導(dǎo)致整體工作線程數(shù)量達(dá)到最大工作線程數(shù),,還是某個服務(wù)的請求量超過單個服務(wù)的最大工作線程數(shù),,都會被限流,以起到保護(hù)整個系統(tǒng)的作用,。2. 降級什么是降級呢,?在我看來,降級就是通過停止系統(tǒng)中的某些功能,,來保證系統(tǒng)整體的可用性,。降級可以說是一種被動防御的措施,為什么這么說呢,?因?yàn)樗话闶窍到y(tǒng)已經(jīng)出現(xiàn)故障后所采取的一種止損措施,。那么降級一般是如何實(shí)現(xiàn)的呢?根據(jù)我的實(shí)踐來看,, 一種可行的方案是通過開關(guān)來實(shí)現(xiàn),。具體來講,就是在系統(tǒng)運(yùn)行的內(nèi)存中開辟一塊區(qū)域,,專門用于存儲開關(guān)的狀態(tài),,也就是開啟還是關(guān)閉。并且需要監(jiān)聽某個端口,,通過這個端口可以向系統(tǒng)下發(fā)命令,,來改變內(nèi)存中開關(guān)的狀態(tài)。當(dāng)開關(guān)開啟時,,業(yè)務(wù)的某一段邏輯就不再執(zhí)行,,而正常情況下,開關(guān)是關(guān)閉的狀態(tài),。開關(guān)一般用在兩種地方,,一種是新增的業(yè)務(wù)邏輯,因?yàn)樾略龅臉I(yè)務(wù)邏輯相對來說不成熟,,往往具備一定的風(fēng)險,,所以需要加開關(guān)來控制新業(yè)務(wù)邏輯是否執(zhí)行;另一種是依賴的服務(wù)或資源,,因?yàn)橐蕾嚨姆?wù)或者資源不總是可靠的,,所以最好是有開關(guān)能夠控制是否對依賴服務(wù)或資源發(fā)起調(diào)用,來保證即使依賴出現(xiàn)問題,,也能通過降級來避免影響,。在實(shí)際業(yè)務(wù)應(yīng)用的時候,降級要按照對業(yè)務(wù)的影響程度進(jìn)行分級,,一般分為三級:一級降級是對業(yè)務(wù)影響最小的降級,,在故障的情況下,首先執(zhí)行一級降級,,所以一級降級也可以設(shè)置成自動降級,,不需要人為干預(yù);二級降級是對業(yè)務(wù)有一定影響的降級,,在故障的情況下,,如果一級降級起不到多大作用的時候,可以人為采取措施,,執(zhí)行二級降級,;三級降級是對業(yè)務(wù)有較大影響的降級,這種降級要么是對商業(yè)收入有重大影響,,要么是對用戶體驗(yàn)有重大影響,,所以操作起來要非常謹(jǐn)慎,不在最后時刻一般不予采用,。單 IDC 故障在現(xiàn)實(shí)情況下,,整個 IDC 脫網(wǎng)的事情時有發(fā)生,多半是因?yàn)椴豢煽沽Ρ热鐧C(jī)房著火,、光纜被挖斷等,,如果業(yè)務(wù)全部部署在這個 IDC,那就完全不可訪問了,,所以國內(nèi)大部分的互聯(lián)網(wǎng)業(yè)務(wù)多采用多 IDC 部署,。具體來說,有的采用同城雙活,,也就是在一個城市的兩個 IDC 內(nèi)部署,;有的采用異地多活,一般是在兩個城市的兩個 IDC 內(nèi)部署,;當(dāng)然也有支付寶這種金融級別的應(yīng)用采用了“三地五中心”部署,,這種部署成本顯然高比兩個 IDC 要高得多,但可用性的保障要更高,。采用多 IDC 部署的最大好處就是當(dāng)有一個 IDC 發(fā)生故障時,,可以把原來訪問故障 IDC 的流量切換到正常的 IDC,來保證業(yè)務(wù)的正常訪問,。流量切換的方式一般有兩種,,一種是基于 DNS 解析的流量切換,一種是基于 RPC 分組的流量切換,。1. 基于 DNS 解析的流量切換基于 DNS 解析流量的切換,,一般是通過把請求訪問域名解析的 VIP 從一個 IDC 切換到另外一個 IDC。比如訪問“www.weibo.com”,,正常情況下北方用戶會解析到聯(lián)通機(jī)房的 VIP,,南方用戶會解析到電信機(jī)房的 VIP,如果聯(lián)通機(jī)房發(fā)生故障的話,,會把北方用戶訪問也解析到電信機(jī)房的 VIP,,只不過此時網(wǎng)絡(luò)延遲可能會變長,。2. 基于 RPC 分組的流量切換對于一個服務(wù)來說,如果是部署在多個 IDC 的話,,一般每個 IDC 就是一個分組,。假如一個 IDC 出現(xiàn)故障,那么原先路由到這個分組的流量,,就可以通過向配置中心下發(fā)命令,,把原先路由到這個分組的流量全部切換到別的分組,這樣的話就可以切換故障 IDC 的流量了,。單機(jī)故障單機(jī)故障是發(fā)生概率最高的一種故障了,,尤其對于業(yè)務(wù)量大的互聯(lián)網(wǎng)應(yīng)用來說,上萬臺機(jī)器的規(guī)模也是很常見的,。這種情況下,,發(fā)生單機(jī)故障的概率就很高了,這個時候只靠運(yùn)維人肉處理顯然不可行,,所以就要求有某種手段來自動處理單機(jī)故障,。根據(jù)我的經(jīng)驗(yàn),處理單機(jī)故障一個有效的辦法就是自動重啟,。具體來講,,你可以設(shè)置一個閾值,比如以某個接口的平均耗時為準(zhǔn),,當(dāng)監(jiān)控單機(jī)上某個接口的平均耗時超過一定閾值時,,就認(rèn)為這臺機(jī)器有問題,這個時候就需要把有問題的機(jī)器從線上集群中摘除掉,,然后在重啟服務(wù)后,,重新加入到集群中。不過這里要注意的是,,需要防止網(wǎng)絡(luò)抖動造成的接口超時從而觸發(fā)自動重啟,。一種方法是在收集單機(jī)接口耗時數(shù)據(jù)時,多采集幾個點(diǎn),,比如每 10s 采集一個點(diǎn),,采集 5 個點(diǎn),當(dāng) 5 個點(diǎn)中有超過 3 個點(diǎn)的數(shù)據(jù)都超過設(shè)定的閾值范圍,,才認(rèn)為是真正的單機(jī)問題,,這時會觸發(fā)自動重啟策略。除此之外,,為了防止某些特殊情況下,,短時間內(nèi)被重啟的單機(jī)過多,造成整個服務(wù)池可用節(jié)點(diǎn)數(shù)太少,最好是設(shè)置一個可重啟的單機(jī)數(shù)量占整個集群的最大比例,,一般這個比例不要超過 10%,,因?yàn)檎G闆r下,不大可能有超過 10% 的單機(jī)都出現(xiàn)故障,??偨Y(jié)今天我們探討了微服務(wù)系統(tǒng)可能出現(xiàn)的三種故障:集群故障,、單 IDC 故障,、單機(jī)故障,并且針對這三種故障我給出了分別的解決方案,,包括降級,、限流、流量切換以及自動重啟,。在遇到實(shí)際的故障時,,往往多個手段是并用的,比如在出現(xiàn)單 IDC 故障,,首先要快速切換流量到正常的 IDC,,但此時可能正常 IDC 并不足以支撐兩個 IDC 的流量,所以這個時候首先要降級部分功能,,保證正常的 IDC 順利支撐切換過來的流量,。而且要盡量讓故障處理自動化,這樣可以大大減少故障影響的時間,。因?yàn)橐坏┬枰肴藶楦深A(yù),,往往故障處理的時間都得是 10 分鐘以上,這對大部分用戶敏感型業(yè)務(wù)的影響是巨大的,,如果能做到自動化故障處理的話,,可以將故障處理的時間降低到 1 分鐘以內(nèi)甚至秒級別,這樣的話對于用戶的影響最小,。思考題上面我提到為了避免單 IDC 故障導(dǎo)致服務(wù)不可用情況的發(fā)生,,服務(wù)需要采用多 IDC 部署,這個時候就要求服務(wù)依賴的數(shù)據(jù)也需要存儲在多個 IDC 內(nèi),,這樣勢必會帶來數(shù)據(jù)一致性的問題,,你有什么解決方案嗎? 在服務(wù)過程中發(fā)生異常如何處理如果在服務(wù)過程中發(fā)生了異常的話你一定要想辦法去解決這個異常情況這個只有通過解決了才能夠更好提供 |
6s管理內(nèi)容和標(biāo)準(zhǔn)是什么? |
2022-12-20
|
查看詳情 >> |
大連哪個船廠好 |
2022-08-16
|
查看詳情 >> |
大連出國勞務(wù)公司哪家比較可靠,? |
2022-08-16
|
查看詳情 >> |