系統(tǒng)復(fù)雜度之【高可用】

接著,我們聊聊復(fù)雜度的第二個要求高可用矾睦。

參考維基百科,先來看看高可用的定義炎功。

系統(tǒng)無中斷地執(zhí)行其功能的能力枚冗,代表系統(tǒng)的可用性程度,是進行系統(tǒng)設(shè)計時的準(zhǔn)則之一蛇损。

這個定義的關(guān)鍵在于“ 無中斷”赁温,但恰好難點也在“無中斷”上面,因為無論是單個硬件還是單個軟件州藕,都不可能做到無中斷束世,硬件會出故障,軟件會有bug床玻;硬件會逐漸老化毁涉,軟件會越來越復(fù)雜和龐大……

除了硬件和軟件本質(zhì)上無法做到“無中斷”,外部環(huán)境導(dǎo)致的不可用更加不可避免锈死、不受控制贫堰。例如,斷電待牵、水災(zāi)其屏、地震,這些事故或者災(zāi)難也會導(dǎo)致系統(tǒng)不可用缨该,而且影響程度更加嚴(yán)重偎行,更加難以預(yù)測和規(guī)避。

高可用性是指系統(tǒng)在沒有中斷的情況下能夠持續(xù)執(zhí)行其功能的能力贰拿,是進行系統(tǒng)設(shè)計時的重要準(zhǔn)則之一蛤袒。然而,要實現(xiàn)無中斷是非常困難的膨更,因為單個硬件或軟件都有可能出現(xiàn)故障或錯誤妙真,且硬件隨著時間的推移會逐漸老化,軟件也會變得越來越復(fù)雜和龐大荚守。此外珍德,外部環(huán)境因素如斷電练般、水災(zāi)、地震等災(zāi)難也可能導(dǎo)致系統(tǒng)不可用锈候,而且其影響程度更加嚴(yán)重薄料,更難以預(yù)測和規(guī)避。

因此晴及,實現(xiàn)高可用性的方案是通過增加冗余性來提高系統(tǒng)的可用性都办。簡單來說,就是增加更多的機器或部署多個機房來解決單點故障問題虑稼。這樣做的目的是為了增強系統(tǒng)的冗余性琳钉,從而實現(xiàn)高可用性。需要注意的是蛛倦,實現(xiàn)高性能和高可用性都需要增加機器歌懒,但它們的目的不同,前者是為了“擴展”處理性能溯壶,而后者是為了“冗余”處理單元及皂。

雖然通過冗余增強了系統(tǒng)的可用性,但同時也帶來了復(fù)雜性且改。因此验烧,在實際應(yīng)用中需要根據(jù)不同的場景逐一分析,采取不同的高可用方案又跛。

計算高可用

在這里碍拆,“計算”指的是業(yè)務(wù)邏輯處理。與計算相關(guān)的高可用性的復(fù)雜性在于慨蓝,無論在哪臺機器上執(zhí)行計算感混,只要算法和輸入數(shù)據(jù)相同,計算結(jié)果就應(yīng)該是相同的礼烈。因此弧满,將計算從一臺機器轉(zhuǎn)移到另一臺機器,對業(yè)務(wù)邏輯沒有任何影響此熬。

以最簡單的單機變雙機架構(gòu)為例庭呜,我們可以看到以下幾個方面的復(fù)雜性:先來看一個單機變雙機的簡單架構(gòu)示意圖。

你可能會發(fā)現(xiàn)犀忱,這個雙機的架構(gòu)圖和上期“高性能”講到的雙機架構(gòu)圖是一樣的募谎,因此復(fù)雜度也是類似的,具體表現(xiàn)為:

  • 需要增加任務(wù)分配器峡碉,選擇合適的任務(wù)分配器也是一個復(fù)雜的過程,需要考慮各種因素驮审,例如性能鲫寄、成本吉执、可維護性和可用性等等。

  • 任務(wù)分配器與真正的業(yè)務(wù)服務(wù)器之間需要進行連接和交互地来。因此戳玫,需要選擇合適的連接方式,并且對連接進行管理未斑。例如咕宿,建立連接、檢測連接蜡秽、處理連接中斷等等府阀。

  • 任務(wù)分配器需要增加分配算法。常見的雙機算法有主備芽突、主主试浙,主備方案又可以細分為冷備、溫備寞蚌、熱備等等田巴。

上面這個示意圖只是簡單的雙機架構(gòu),我們再看一個復(fù)雜一點的高可用集群架構(gòu)挟秤。

上面這個示意圖只是一個簡單的雙機架構(gòu)壹哺,而復(fù)雜度會隨著集群的規(guī)模和結(jié)構(gòu)的變化而增加。例如艘刚,上圖展示了一個更為復(fù)雜的高可用集群架構(gòu)管宵。這種情況下,分配算法的選擇更加復(fù)雜昔脯,可以是1主3備啄糙、2主2備、3主1備云稚、4主0備等等隧饼。具體應(yīng)該采用哪種方式,需要根據(jù)實際業(yè)務(wù)需求進行分析和判斷静陈,不存在一種算法一定比其他算法更優(yōu)燕雁。例如,ZooKeeper采用的是1主多備鲸拥,而Memcached則采用全主0備拐格。

存儲高可用

對于需要存儲數(shù)據(jù)的系統(tǒng)來說,整個系統(tǒng)的高可用設(shè)計的關(guān)鍵點和難點在于“存儲高可用”刑赶。與計算相比捏浊,存儲有一個本質(zhì)的不同點:將數(shù)據(jù)從一臺機器搬到另一臺機器需要經(jīng)過線路傳輸。線路傳輸?shù)乃俣仁呛撩爰墑e撞叨,同一機房內(nèi)部可以做到幾毫秒金踪,但分布在不同地方的機房浊洞,傳輸耗時需要幾十甚至上百毫秒。例如胡岔,從廣州機房到北京機房法希,穩(wěn)定情況下ping延時大約是50ms,不穩(wěn)定情況下可能達到1秒甚至更長靶瘸。

雖然對人類來說苫亦,毫秒幾乎沒有什么感覺,但對于高可用系統(tǒng)來說怨咪,這是本質(zhì)的不同之處屋剑。這意味著在某個時間點上,整個系統(tǒng)中的數(shù)據(jù)肯定是不一致的惊暴。按照“數(shù)據(jù) + 邏輯 = 業(yè)務(wù)”這個公式來看饼丘,數(shù)據(jù)不一致即使邏輯一致,最終的業(yè)務(wù)表現(xiàn)也會不同辽话。以銀行儲蓄業(yè)務(wù)為例肄鸽,假設(shè)用戶的數(shù)據(jù)存在北京機房,用戶存入1萬塊錢油啤,然后查詢時被路由到了上海機房典徘,而北京機房的數(shù)據(jù)沒有同步到上海機房。用戶會發(fā)現(xiàn)他的余額并沒有增加1萬塊益咬。想象一下逮诲,此時用戶肯定會感到不安,會懷疑自己的錢被盜了幽告,趕緊打客服電話投訴梅鹦,甚至可能打110報警。即使最終發(fā)現(xiàn)只是因為傳輸延遲導(dǎo)致的問題冗锁,從用戶的角度來看齐唆,這個過程的體驗肯定很不好。

除了物理傳輸速度限制冻河,傳輸線路本身也可能出現(xiàn)可用性問題箍邮。傳輸線路可能會中斷、擁塞叨叙、異常(如錯包锭弊、丟包),并且線路故障的恢復(fù)時間通常較長擂错,可能持續(xù)幾分鐘甚至幾小時味滞。例如,2015年支付寶因為光纜被挖斷,業(yè)務(wù)受到了超過4個小時的影響剑鞍;2016年中美海底光纜中斷3小時等刹悴。線路中斷意味著存儲無法同步,這段時間內(nèi)整個系統(tǒng)的數(shù)據(jù)將不一致攒暇。

綜合考慮,在正常情況下的傳輸延遲和異常情況下的傳輸中斷都會導(dǎo)致系統(tǒng)在某個時間點或時間段內(nèi)的數(shù)據(jù)不一致子房,從而影響業(yè)務(wù)形用。然而,如果完全不做冗余证杭,整個系統(tǒng)的高可用性就無法保證田度。因此,存儲高可用的難點不在于如何備份數(shù)據(jù)解愤,而在于如何減少或規(guī)避數(shù)據(jù)不一致對業(yè)務(wù)造成的影響镇饺。

在分布式系統(tǒng)領(lǐng)域,有一個著名的CAP定理送讲,從理論上證明了存儲高可用的復(fù)雜度奸笤。也就是說,存儲高可用不可能同時滿足“一致性哼鬓、可用性监右、分區(qū)容錯性”,最多只能滿足其中兩個异希。因此健盒,在架構(gòu)設(shè)計時,需要根據(jù)實際業(yè)務(wù)需求進行取舍称簿。

高可用狀態(tài)決策

無論是計算高可用還是存儲高可用扣癣,其基礎(chǔ)都是“狀態(tài)決策”,即系統(tǒng)需要能夠判斷當(dāng)前的狀態(tài)是正常還是異常憨降,如果出現(xiàn)異常就需要采取行動來保證高可用父虑。如果狀態(tài)決策本身存在錯誤或偏差,那么后續(xù)的任何行動和處理都將失去意義和價值券册。然而频轿,在具體實踐中,存在一個本質(zhì)的矛盾:通過冗余實現(xiàn)的高可用系統(tǒng)烁焙,狀態(tài)決策本質(zhì)上不可能做到完全正確航邢。以下是對幾種常見的決策方式的詳細分析:

1.獨裁式

獨裁式?jīng)Q策指的是存在一個獨立的決策主體,我們稱之為“決策者”骄蝇,其負責(zé)收集信息并做出決策膳殷。所有冗余的個體,我們稱之為“上報者”,將狀態(tài)信息發(fā)送給決策者赚窃。

獨裁式的決策方式不會出現(xiàn)決策混亂的問題册招,因為只有一個決策者,但問題也正是在于只有一個決策者勒极。當(dāng)決策者本身故障時是掰,整個系統(tǒng)就無法實現(xiàn)準(zhǔn)確的狀態(tài)決策。如果決策者本身又做一套狀態(tài)決策辱匿,那就陷入一個遞歸的死循環(huán)了键痛。

2.協(xié)商式

協(xié)商式?jīng)Q策指的是兩個獨立的個體通過交流信息,然后根據(jù)規(guī)則進行決策匾七, 最常用的協(xié)商式?jīng)Q策就是主備決策絮短。

這個架構(gòu)的基本協(xié)商規(guī)則可以設(shè)計成:

  • 2臺服務(wù)器啟動時都是備機。
  • 2臺服務(wù)器建立連接昨忆。
  • 2臺服務(wù)器交換狀態(tài)信息丁频。
  • 某1臺服務(wù)器做出決策,成為主機邑贴;另一臺服務(wù)器繼續(xù)保持備機身份席里。

協(xié)商式?jīng)Q策的架構(gòu)不復(fù)雜,規(guī)則也不復(fù)雜拢驾,其難點在于胁勺,如果兩者的信息交換出現(xiàn)問題(比如主備連接中斷),此時狀態(tài)決策應(yīng)該怎么做独旷。

  • 如果備機在連接中斷的情況下認為主機故障署穗,那么備機需要升級為主機,但實際上此時主機并沒有故障嵌洼,那么系統(tǒng)就出現(xiàn)了兩個主機案疲,這與設(shè)計初衷(1主1備)是不符合的。
  • 如果備機在連接中斷的情況下不認為主機故障麻养,則此時如果主機真的發(fā)生故障褐啡,那么系統(tǒng)就沒有主機了,這同樣與設(shè)計初衷(1主1備)是不符合的鳖昌。
  • 如果為了規(guī)避連接中斷對狀態(tài)決策帶來的影響备畦,可以增加更多的連接。例如许昨,雙連接懂盐、三連接。這樣雖然能夠降低連接中斷對狀態(tài)帶來的影響(注意:只能降低糕档,不能徹底解決)莉恼,但同時又引入了這幾條連接之間信息取舍的問題,即如果不同連接傳遞的信息不同,應(yīng)該以哪個連接為準(zhǔn)俐银?實際上這也是一個無解的答案尿背,無論以哪個連接為準(zhǔn),在特定場景下都可能存在問題捶惜。

綜合分析田藐,協(xié)商式狀態(tài)決策在某些場景總是存在一些問題的。

3.民主式

民主式?jīng)Q策指的是多個獨立的個體通過投票的方式來進行狀態(tài)決策吱七。例如坞淮,ZooKeeper集群在選舉leader時就是采用這種方式。

民主式?jīng)Q策和協(xié)商式?jīng)Q策比較類似陪捷,其基礎(chǔ)都是獨立的個體之間交換信息,每個個體做出自己的決策诺擅,然后按照“ 多數(shù)取勝”的規(guī)則來確定最終的狀態(tài)市袖。不同點在于民主式?jīng)Q策比協(xié)商式?jīng)Q策要復(fù)雜得多,ZooKeeper的選舉算法ZAB烁涌,絕大部分人都看得云里霧里苍碟,更不用說用代碼來實現(xiàn)這套算法了。

除了算法復(fù)雜撮执,民主式?jīng)Q策還有一個固有的缺陷:腦裂微峰。這個詞來源于醫(yī)學(xué),指人體左右大腦半球的連接被切斷后抒钱,左右腦因為無法交換信息蜓肆,導(dǎo)致各自做出決策,然后身體受到兩個大腦分別控制谋币,會做出各種奇怪的動作仗扬。例如:當(dāng)一個腦裂患者更衣時,他有時會一只手將褲子拉起蕾额,另一只手卻將褲子往下脫早芭。腦裂的根本原因是,原來統(tǒng)一的集群因為連接中斷诅蝶,造成了兩個獨立分隔的子集群退个,每個子集群單獨進行選舉,于是選出了2個主機调炬,相當(dāng)于人體有兩個大腦了语盈。

從圖中可以看到,正常狀態(tài)的時候缰泡,節(jié)點5作為主節(jié)點黎烈,其他節(jié)點作為備節(jié)點;當(dāng)連接發(fā)生故障時,節(jié)點1照棋、節(jié)點2资溃、節(jié)點3形成了一個子集群,節(jié)點4烈炭、節(jié)點5形成了另外一個子集群溶锭,這兩個子集群的連接已經(jīng)中斷,無法進行信息交換符隙。按照民主決策的規(guī)則和算法趴捅,兩個子集群分別選出了節(jié)點2和節(jié)點5作為主節(jié)點,此時整個系統(tǒng)就出現(xiàn)了兩個主節(jié)點霹疫。這個狀態(tài)違背了系統(tǒng)設(shè)計的初衷拱绑,兩個主節(jié)點會各自做出自己的決策,整個系統(tǒng)的狀態(tài)就混亂了丽蝎。

為了解決腦裂問題猎拨,民主式?jīng)Q策的系統(tǒng)一般都采用“投票節(jié)點數(shù)必須超過系統(tǒng)總節(jié)點數(shù)一半”規(guī)則來處理。如圖中那種情況屠阻,節(jié)點4和節(jié)點5形成的子集群總節(jié)點數(shù)只有2個红省,沒有達到總節(jié)點數(shù)5個的一半,因此這個子集群不會進行選舉国觉。這種方式雖然解決了腦裂問題吧恃,但同時降低了系統(tǒng)整體的可用性,即如果系統(tǒng)不是因為腦裂問題導(dǎo)致投票節(jié)點數(shù)過少麻诀,而真的是因為節(jié)點故障(例如痕寓,節(jié)點1、節(jié)點2蝇闭、節(jié)點3真的發(fā)生了故障)厂抽,此時系統(tǒng)也不會選出主節(jié)點,整個系統(tǒng)就相當(dāng)于宕機了丁眼,盡管此時還有節(jié)點4和節(jié)點5是正常的筷凤。

綜合分析,無論采取什么樣的方案苞七,狀態(tài)決策都不可能做到任何場景下都沒有問題藐守,但完全不做高可用方案又會產(chǎn)生更大的問題,如何選取適合系統(tǒng)的高可用方案蹂风,也是一個復(fù)雜的分析卢厂、判斷和選擇的過程。

小結(jié)

綜上所述惠啄,我向你分析了復(fù)雜度之高可用慎恒,分析了計算高可用和存儲高可用兩個場景任内,給出了幾種高可用狀態(tài)決策方式,希望對你有幫助

本文由mdnice多平臺發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末融柬,一起剝皮案震驚了整個濱河市死嗦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粒氧,老刑警劉巖越除,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異外盯,居然都是意外死亡摘盆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門饱苟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孩擂,“玉大人,你說我怎么就攤上這事箱熬±嗫眩” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵坦弟,是天一觀的道長。 經(jīng)常有香客問我官地,道長酿傍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任驱入,我火速辦了婚禮赤炒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亏较。我一直安慰自己莺褒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布雪情。 她就那樣靜靜地躺著遵岩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巡通。 梳的紋絲不亂的頭發(fā)上尘执,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音宴凉,去河邊找鬼誊锭。 笑死,一個胖子當(dāng)著我的面吹牛弥锄,可吹牛的內(nèi)容都是我干的丧靡。 我是一名探鬼主播蟆沫,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼温治!你這毒婦竟也來了饭庞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤罐盔,失蹤者是張志新(化名)和其女友劉穎但绕,沒想到半個月后妨蛹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體症副,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年椿浓,在試婚紗的時候發(fā)現(xiàn)自己被綠了纬黎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幅骄。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖本今,靈堂內(nèi)的尸體忽然破棺而出拆座,到底是詐尸還是另有隱情,我是刑警寧澤冠息,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布挪凑,位于F島的核電站,受9級特大地震影響逛艰,放射性物質(zhì)發(fā)生泄漏躏碳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一散怖、第九天 我趴在偏房一處隱蔽的房頂上張望菇绵。 院中可真熱鬧,春花似錦镇眷、人聲如沸咬最。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽永乌。三九已至,卻和暖如春具伍,著一層夾襖步出監(jiān)牢的瞬間铆遭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工沿猜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枚荣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓啼肩,卻偏偏與公主長得像橄妆,于是被迫代替她去往敵國和親衙伶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容