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