在分布式系統(tǒng)中,經(jīng)常會(huì)碰到的技術(shù)名詞一般有多副本、數(shù)據(jù)分區(qū)、一致性算法、事務(wù)等,這些技術(shù)在分布式系統(tǒng)設(shè)計(jì)中都是非常重要的,CEOPA想通過本文對(duì)分布式系統(tǒng)的可靠性、可擴(kuò)展性和可維護(hù)性特性的討論,描述這些技術(shù)解決的問題,希望能夠幫到大家。
可靠性
指的是在任何情況下,系統(tǒng)正常工作的能力。如果一個(gè)系統(tǒng)在發(fā)生任何異常時(shí),都能正常的工作,那么系統(tǒng)是完全可靠的?,F(xiàn)實(shí)中,異常種類很多,有的往往難以事先避免,因此,了解可能的異常并分析如何在異常發(fā)生時(shí)快速恢復(fù)是非常重要的。一般地,異常包括硬件異常,軟件異常和人為異常。
硬件異常
硬件異常種類很多,硬盤,電源等任意一個(gè)部件的損壞,都可能導(dǎo)致服務(wù)器不能正常的工作。通常這類異常難以避免,但是,我們可以通過一些技術(shù)手段來實(shí)現(xiàn)異常發(fā)生后的快速恢復(fù),不管是從軟件角度還是硬件角度,基本的解決思路都是冗余。從硬件角度來講,我們可以通過單機(jī)冗余多份硬件,當(dāng)其中某個(gè)硬件發(fā)生異常時(shí),可以快速地用好的硬件替換掉故障的硬件,這種方式的硬件冗余對(duì)于數(shù)據(jù)中心級(jí)的故障是沒有作用的;
從軟件角度來講,我們可以通過多副本(Replication)來實(shí)現(xiàn)快速恢復(fù),當(dāng)某臺(tái)服務(wù)器硬件異常時(shí),可以在軟件層面將流量導(dǎo)入到新的副本上(實(shí)際上也有硬件冗余,但這種方式更為靈活)。
除了Replication之外,有時(shí)候?yàn)榱藴p少單臺(tái)服務(wù)器故障對(duì)所有用戶的影響,可以對(duì)用戶數(shù)據(jù)做分區(qū)(Partition)。單臺(tái)服務(wù)器只存某一部分用戶的數(shù)據(jù),這樣單機(jī)故障就只會(huì)影響一部分用戶了。引入多副本(Replication)后,如何保證多副本的數(shù)據(jù)的一致性又成了一個(gè)問題。Paxos和Raft算法就是為了解決這類問題。
軟件異常
軟件異常一般指的是系統(tǒng)的bug,這里面不僅包括自己寫的系統(tǒng)的bug,也包括依賴的服務(wù)系統(tǒng)的bug。軟件異常同樣也是不能完全避免的,因此,在發(fā)生軟件異常時(shí),也需要有快速恢復(fù)的手段,通常有三種方法:1. 通過調(diào)整軟件已有的配置參數(shù),規(guī)避問題
2. 重啟軟件或者依賴的服務(wù),消除異常狀態(tài)
3. 直接修復(fù)bug,并升級(jí)版本
人為異常
不管是軟件本身,還是軟件所運(yùn)行的服務(wù)器,都是由人來管理的,但人是會(huì)犯錯(cuò)誤的,有時(shí)候會(huì)執(zhí)行錯(cuò)誤的命令導(dǎo)致系統(tǒng)不能正常工作,其中比較致命的錯(cuò)誤可能就是刪掉某臺(tái)服務(wù)器的數(shù)據(jù)了。在這種情況下為了能快速地恢復(fù),通常也是采用多副本(Replication)的思路,來避免問題。
擴(kuò)展性
系統(tǒng)的工作負(fù)載通常不是一成不變的,當(dāng)工作負(fù)載增加時(shí),往往可以通過增加機(jī)器資源來保持性能不變。需要增加機(jī)器數(shù)量的多少是由系統(tǒng)的擴(kuò)展性來決定的,擴(kuò)展性越好的系統(tǒng),需要增加的機(jī)器資源越少。最完美的擴(kuò)展性是線性擴(kuò)展性,即工作負(fù)載擴(kuò)大為原來N倍的時(shí)候,只需要加N倍的機(jī)器,就能夠保持性能不變,最差的擴(kuò)展性則是沒有擴(kuò)展性,即工作負(fù)載擴(kuò)大為原來N倍時(shí),即使加再多的機(jī)器,也無法保持性能和原來一樣。
擴(kuò)展通常是兩種思路,一是垂直擴(kuò)展,即使用更好的機(jī)器替換現(xiàn)有的機(jī)器,二是水平擴(kuò)展,即使用更多的機(jī)器。
對(duì)于垂直擴(kuò)展,其優(yōu)點(diǎn)是對(duì)業(yè)務(wù)是無影響的,缺點(diǎn)是更好的機(jī)器是很貴的。通常是一分錢一分貨,而十分錢只能買到兩分貨,且現(xiàn)實(shí)中總有單機(jī)裝不下的數(shù)據(jù)量,此時(shí)垂直擴(kuò)展自然就無法實(shí)施了。
對(duì)于水平擴(kuò)展,通常需要軟件層面的配合。對(duì)于無狀態(tài)的系統(tǒng),通常只要在新加的機(jī)器上部署上需要擴(kuò)展的系統(tǒng);對(duì)于有狀態(tài)的系統(tǒng),一般指的是存儲(chǔ)系統(tǒng),通常會(huì)將數(shù)據(jù)分區(qū)Partition。這樣新加的機(jī)器才能通過遷移Partition的方式,從老的機(jī)器上遷移數(shù)據(jù)以及對(duì)應(yīng)的工作負(fù)載出來。水平擴(kuò)展的優(yōu)點(diǎn)是使用的都是相對(duì)廉價(jià)的服務(wù)器,能節(jié)約成本,但在軟件層面需要做大量的工作,包括Partition的管理,遷移,負(fù)載均衡等。
可維護(hù)性
可維護(hù)性的好壞決定了系統(tǒng)是否能夠長(zhǎng)久的發(fā)展,一個(gè)可維護(hù)性不好的系統(tǒng),會(huì)給運(yùn)維和開發(fā)人員帶來很多不便。對(duì)于運(yùn)維人員來講,可維護(hù)性指的是系統(tǒng)是否支持常用的運(yùn)維手段,良好的文檔等等。而對(duì)于開發(fā)人員來講,主要分為內(nèi)核開發(fā)以及使用該系統(tǒng)的業(yè)務(wù)開發(fā),對(duì)于業(yè)務(wù)開發(fā),維護(hù)性指的是系統(tǒng)是否有良好的接口,方便業(yè)務(wù)使用。