程序员修神之路--分布式系统设计理念这么难学?
點擊“藍(lán)字”關(guān)注我們吧
福利:有件小事想和大家說一下
菜菜哥,問你個問題,為什么現(xiàn)在的系統(tǒng)都設(shè)計為分布式系統(tǒng)呢?
這個問題問得好,就像為什么程序員會慢慢脫發(fā)一樣神奇
01
PART
分布式系統(tǒng)
身為二十一世紀(jì)的一名程序員,沒聽說過分布式系統(tǒng)就顯得自己好像沒有女票一樣尷尬。無論是出去面試跟面試官吹水,還是在工作中和同事吹水,分布式系統(tǒng)永遠(yuǎn)是你顯得高人一等的籌碼。分布式系統(tǒng)已經(jīng)誕生了好幾十年,說起來比我們八零后程序員好要老成,隨著現(xiàn)代互聯(lián)網(wǎng)的崛起,對于系統(tǒng)在性能,可靠性上的要求大大提高。
分布式系統(tǒng)的定義其實很簡單,也很抽象:任何由處于不同物理位置的多個進(jìn)程提供相同服務(wù)的系統(tǒng)都可以稱之為分布式系統(tǒng),退一萬步講,同一臺服務(wù)器上的不同進(jìn)程也可以組成分布式系統(tǒng)
分布式系統(tǒng)的首要目標(biāo)是提高系統(tǒng)的整體性能,但不僅限于吞吐量,可靠性,響應(yīng)時間,數(shù)據(jù)一致性等,其中提高性能指標(biāo)是最重要的。如果最終設(shè)計出來的分布式系統(tǒng)占用了更多的資源卻還比不上單機(jī)的性能,那這個分布式系統(tǒng)是失敗的,理論上沒有存在的價值
一個分布式系統(tǒng)的整體性能提高并不是單單依靠擴(kuò)展來實現(xiàn),提高單機(jī)的處理性能仍然很重要,一個把單機(jī)性能發(fā)揮到極致的分布式系統(tǒng),在同等性能的需求下,采用的資源要遠(yuǎn)遠(yuǎn)小于其他系統(tǒng)。
02
PART
分布式系統(tǒng)痛點
一個好的分布式系統(tǒng)在性能方面要遠(yuǎn)超單機(jī)系統(tǒng),但是在數(shù)據(jù)行為方面要表現(xiàn)的和單機(jī)系統(tǒng)一樣優(yōu)秀,其中包括數(shù)據(jù)的一致性,硬件的故障發(fā)生率,網(wǎng)絡(luò)的不穩(wěn)定性等。
無論是單機(jī)系統(tǒng)還是分布式系統(tǒng)都存在無法回避并且無法徹底去除的風(fēng)險,比如:硬盤發(fā)生故障,網(wǎng)絡(luò)發(fā)生癱瘓,光纖被挖.....分布式系統(tǒng)隨著節(jié)點的增加,把這些故障的發(fā)生率也隨之增大,所以分布式系統(tǒng)其中一個目標(biāo)是要盡量降低這些風(fēng)險,也就是所謂的容錯性。
既要快還要不出錯,這在“倫理”上是沖突的。就像我們平時說的分布式鎖,如果要保證對一個資源的修改不會發(fā)生線程安全問題,就要付出降低性能的代價。至于性能和容錯性怎樣選擇,還需要具體到每個業(yè)務(wù)場景中,比如支付場景中,數(shù)據(jù)的正確性可能要比性能指標(biāo)更重要,而那些日志型數(shù)據(jù),比如用戶的登錄日志,這些數(shù)據(jù)的最大特點就是允許小部分丟失,在這樣的日志系統(tǒng)設(shè)計中,可能性能指標(biāo)要大于容錯性。
目前爛大街的CAP原則的講解,是針對分布式系統(tǒng)的一個抽象理論,包括之后BASE理論,也是針對分布式系統(tǒng)的一種指導(dǎo)方案。
分布式系統(tǒng)這么復(fù)雜,那設(shè)計一個分布式系統(tǒng)看來很難了?
什么叫很難?那叫非常難!!
03
PART
設(shè)計分布式系統(tǒng)
分布式系統(tǒng)的特性就決定了它自出生之日起,就有多個節(jié)點如何協(xié)同工作的難題。就像一個團(tuán)隊,如果讓這個團(tuán)隊有條不紊的工作本來就是個難題。一堆節(jié)點為了完成同樣的任務(wù),注定需要一個規(guī)范方圓的規(guī)則。就目前已知的方案中,主要有中心化和去中心化兩種解決方案
中心化
中心化的分布式設(shè)計理念是目前主流的方案,在中心化的設(shè)計方案中,節(jié)點是有角色區(qū)分的:Leader節(jié)點和Work節(jié)點,即:領(lǐng)導(dǎo)和干活的。就和現(xiàn)實中類似,leader只負(fù)責(zé)分發(fā)任務(wù)和監(jiān)督,Work節(jié)點只負(fù)責(zé)領(lǐng)取任務(wù)干活,多說一句,這里Work節(jié)點領(lǐng)取任務(wù),當(dāng)然從通信的角度來說,又可以分為push和pull(推和拉)方式。推方式是指,leader節(jié)點主動將任務(wù)分發(fā)給Work節(jié)點,拉方式是指:Work節(jié)點主動去申請任務(wù)。至于push和pull的優(yōu)缺點,不作為今天的主題展開討論。
在任何系統(tǒng)中,都無可避免的需要考慮節(jié)點down掉的問題,分布式系統(tǒng)也一樣。在中心化分布式設(shè)計中,leader和Work也一樣都存在down掉的可能性。如果leader掉的話,整個系統(tǒng)都陷入癱瘓,按照最簡單的設(shè)計思路,leader節(jié)點需要一個從節(jié)點或者備用節(jié)點,在主節(jié)點down掉之后,從主節(jié)點或者備用主節(jié)點可以手動或者自動實現(xiàn)leader節(jié)點服務(wù)。至于一個Work節(jié)點down掉,一般不會使整個系統(tǒng)陷入癱瘓,除非全部Work節(jié)點同時down掉。一個Work節(jié)點down掉,但是會影響這個節(jié)點當(dāng)前正在執(zhí)行的任務(wù),所以在必要的條件下可以設(shè)計成任務(wù)需要Ack才好,即:一個任務(wù)的完成需要確認(rèn),如果長時間沒有確認(rèn),leader會發(fā)起重新分配任務(wù)的操作。
說到leader的問題,現(xiàn)在目前大多數(shù)分布式系統(tǒng)都具備了自動選舉leader的功能,這還要感謝paxos,raft等選舉算法。在leader不可用的時候,這些系統(tǒng)會自動根據(jù)節(jié)點情況選舉出新的leader節(jié)點來繼續(xù)提供服務(wù),這大大提高了系統(tǒng)可用性。
在所有的中心化設(shè)計中,數(shù)據(jù)的寫操作都發(fā)生在leader節(jié)點,這在某種程度上類似于單機(jī)系統(tǒng),所以這種中心化設(shè)計并不適合那些大量寫的操作。
去中心化
在去中心化分布式系統(tǒng)設(shè)計中,節(jié)點類型并不區(qū)分Leader和Work,所有節(jié)點都是相等的。所以任何一個節(jié)點down掉都不會導(dǎo)致整個系統(tǒng)癱瘓,這是它的優(yōu)勢。但是獲取系統(tǒng)中每個節(jié)點的信息卻比中心化設(shè)計要難很多,在中心化設(shè)計中,leader節(jié)點存儲著系統(tǒng)中所有的節(jié)點信息,并可以實時把這些信息同步到其他節(jié)點,同時可以利用相應(yīng)算法來達(dá)到一致性的要求。去中心化的設(shè)計中,每個節(jié)點只能依靠和其他節(jié)點不斷通信來獲取整個系統(tǒng)的節(jié)點信息,這在技術(shù)難度上要比中心化高出很多。
在網(wǎng)絡(luò)中,網(wǎng)絡(luò)是不可靠的。恰恰是這個原因,又加大了每個節(jié)點互相通信的難度。在極限情況下,去中心化的設(shè)計方案會出現(xiàn)多個小范圍的“團(tuán)伙”,這就是所說的腦裂。比如:現(xiàn)在一個由10個節(jié)點組成的分布式系統(tǒng),有可能由于網(wǎng)絡(luò)原因會劃分為兩個5節(jié)點互相通信的兩個“團(tuán)伙”
如果出現(xiàn)腦裂的情況,目前主流的解決方案和數(shù)據(jù)庫死鎖的處理情況類似,自爆一個對系統(tǒng)影響比較小的。
那我們設(shè)計分布式系統(tǒng)的時候是不是優(yōu)先選擇中心化方案呢?
這個問題就像是選擇型數(shù)據(jù)庫,是選擇關(guān)系型還是非關(guān)系型一個道理,而目前多數(shù)的做法是采用揚長避短互相補(bǔ)充的方案
那就是混用哦?
可以這么說,分布式系統(tǒng)也一個道理
完全中心化和去中心化的系統(tǒng)并不常見,反而現(xiàn)在慢慢出現(xiàn)的是二者的搭配者,表面看似去中心化,設(shè)計理念卻是中心化的思路,在這種架構(gòu)下,leader是程序根據(jù)某種算法選舉出來的,而且在系統(tǒng)leader發(fā)生故障的時候,系統(tǒng)會自動重新選舉leader節(jié)點。
04
PART
寫在最后
對于每個系統(tǒng)來說,可靠性是它要實現(xiàn)的主要目標(biāo)之一,尤其是分布式系統(tǒng)。在網(wǎng)絡(luò)通信,硬件設(shè)備等條件都非100%可靠的情況下,如何提高分布式系統(tǒng)的可用性是一個很深的話題。就算是國內(nèi)頂尖的BAT等大廠,也沒有一個系統(tǒng)能達(dá)到100%的可用性,4個9的可用性已經(jīng)是很巔峰了。
分布式系統(tǒng)本質(zhì)上是多個節(jié)點通過網(wǎng)絡(luò)IO組成的,其中夾雜著一些不可抗拒的元素,所以請記住一句話:
分布式系統(tǒng)是不可靠的,我們只能盡量減小故障發(fā)生率,卻根除不了,如果你的老板要你設(shè)計一套100%可用性的系統(tǒng),要么他是二貨,要么他是二B
●程序員修神之路--為什么我會了SOA,你們還要逼我學(xué)微服務(wù)?
●程序員過關(guān)斬將--數(shù)據(jù)庫的樂觀鎖和悲觀鎖并非真實的鎖
●程序員修神之路--設(shè)計一套RPC框架并非易事
●程序員過關(guān)斬將--要想獲取我的用戶信息,就得按照規(guī)矩來
●程序員過關(guān)斬將--更加優(yōu)雅的Token認(rèn)證方式JWT
●程序員過關(guān)斬將--cookie和session的關(guān)系其實很簡單
●程序員修神之路--用NOSql給高并發(fā)系統(tǒng)加速
●程序員修神之路--高并發(fā)系統(tǒng)設(shè)計負(fù)載均衡架構(gòu)
●程序員過關(guān)斬將--你為什么還在用存儲過程?
●程序員修神之路--問世間異步為何物?
●程序員修神之路--提高網(wǎng)站的吞吐
長按添加菜菜好友
關(guān)注后回復(fù):“大禮包”和“福利”,領(lǐng)取驚喜
總結(jié)
以上是生活随笔為你收集整理的程序员修神之路--分布式系统设计理念这么难学?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core端点路由 作用原
- 下一篇: Abp vNext 二进制大对象系统(B