2018/3/31:晚上:21:04
一、基本概念:
異常
1、服務(wù)器宕機(jī):內(nèi)存錯(cuò)誤、服務(wù)器停電等都會(huì)導(dǎo)致服務(wù)器宕機(jī),此時(shí)節(jié)點(diǎn)無(wú)法正常工作,稱為不可用。服務(wù)器宕機(jī)會(huì)導(dǎo)致節(jié)點(diǎn)失去所有內(nèi)存信息,因此需要將內(nèi)存信息保存到持久化介質(zhì)上。
2、網(wǎng)絡(luò)異常:有一種特殊的網(wǎng)絡(luò)異常稱為網(wǎng)絡(luò)分區(qū),即集群的所有節(jié)點(diǎn)被劃分為多個(gè)區(qū)域,每個(gè)區(qū)域內(nèi)部可以通信,但是區(qū)域之間無(wú)法通信
3、磁盤(pán)故障:磁盤(pán)故障是一種發(fā)生概率很高的異常。使用冗余機(jī)制,將數(shù)據(jù)存儲(chǔ)到多臺(tái)服務(wù)器
超時(shí):在分布式系統(tǒng)中,一個(gè)請(qǐng)求除了成功和失敗兩種狀態(tài),還存在超時(shí)狀態(tài)??梢詫⒎?wù)器的操作設(shè)計(jì)為具有冪等性,即執(zhí)行多次的結(jié)果與執(zhí)行一次的結(jié)果相同。如果使用這種方式,當(dāng)出現(xiàn)超時(shí)的時(shí)候,可以不斷地重新請(qǐng)求直到成功
冪等性:系統(tǒng)的接口對(duì)外一種承諾(不是實(shí)現(xiàn)),承諾只要調(diào)用接口成功,多部多次調(diào)用對(duì)系統(tǒng)的影響是一致的,聲明為 冪等的接口會(huì)認(rèn)為外部調(diào)用失敗是常態(tài),并且失敗之后必然會(huì)有重試
衡量指標(biāo):
1、性能:常見(jiàn)的性能指標(biāo)有:吞吐量、響應(yīng)時(shí)間
- 吞吐量:指系統(tǒng)在某一段時(shí)間可以處理的請(qǐng)求總數(shù),通常為每秒的讀操作或者寫(xiě)操作數(shù)
- 響應(yīng)時(shí)間:指從某個(gè)請(qǐng)求發(fā)出到接收到返回結(jié)果消耗的時(shí)間
這兩個(gè)指標(biāo)往往是矛盾的,追求高吞吐的系統(tǒng),往往很難做到低響應(yīng)時(shí)間,解釋如下:
- 在無(wú)并發(fā)的系統(tǒng)中,吞吐量為響應(yīng)時(shí)間的倒數(shù),例如響應(yīng)時(shí)間為 10 ms,那么吞吐量為 100 req/s,因此高吞吐也就意味著低響應(yīng)時(shí)間。
- 但是在并發(fā)的系統(tǒng)中,由于一個(gè)請(qǐng)求在調(diào)用 I/O 資源的時(shí)候,需要進(jìn)行等待。服務(wù)器端一般使用的是異步等待方式,即等待的請(qǐng)求被阻塞之后不需要一直占用 CPU 資源。這種方式能大大提高 CPU 資源的利用率,例如上面的例子中,單個(gè)請(qǐng)求在無(wú)并發(fā)的系統(tǒng)中響應(yīng)時(shí)間為 10 ms,如果在并發(fā)的系統(tǒng)中,那么吞吐量將大于 100 req/s。因此為了追求高吞吐量,通常會(huì)提高并發(fā)程度。但是并發(fā)程度的增加,會(huì)導(dǎo)致請(qǐng)求的平均響應(yīng)時(shí)間也增加,因?yàn)檎?qǐng)求不能馬上被處理,需要和其它請(qǐng)求一起進(jìn)行并發(fā)處理,響應(yīng)時(shí)間自然就會(huì)增高。
2、可用性:指系統(tǒng)在面對(duì)各種異常時(shí)可以提供正常服務(wù)的能力??梢杂孟到y(tǒng)可用時(shí)間占總時(shí)間的比值來(lái)衡量,4個(gè)9的可用性表示系統(tǒng)99.99%的時(shí)間是可用的。
3、一致性:可以從兩個(gè)角度理解一致性:
從客戶端的角度:讀寫(xiě)操作是否滿足某種特性
從服務(wù)器的角度:多個(gè)數(shù)據(jù)副本之間是否一致
一致性模型如下:
- 強(qiáng)一致性:新數(shù)據(jù)寫(xiě)入之后,在任何數(shù)據(jù)副本上都能讀取到最新值
- 弱一致性:新數(shù)據(jù)寫(xiě)入之后,不能保證在數(shù)據(jù)副本上能讀取到最新值
- 最終一致性:新數(shù)據(jù)寫(xiě)入之后,只能保證過(guò)了一個(gè)時(shí)間窗口后才能在數(shù)據(jù)副本上讀取到最新值
4、可擴(kuò)展性:指系統(tǒng)通過(guò)擴(kuò)展集群服務(wù)器規(guī)模來(lái)提高性能的能力。理想的分布式系統(tǒng)需要實(shí)現(xiàn)“線性可擴(kuò)展”,即隨著集群規(guī)模的增加,系統(tǒng)的整體性能也會(huì)線程增加。
二、數(shù)據(jù)分布:分布式系統(tǒng)的數(shù)據(jù)分布在多個(gè)節(jié)點(diǎn)中,常用的數(shù)據(jù)分布式有哈希分布和順序分布
哈希分布:哈希分布就是將數(shù)據(jù)計(jì)算哈希值之后,按照哈希值分配到不同的節(jié)點(diǎn)上。例如有 N 個(gè)節(jié)點(diǎn),數(shù)據(jù)的主鍵為 key,則將該數(shù)據(jù)分配的節(jié)點(diǎn)序號(hào)為:hash(key)%N。
傳統(tǒng)的哈希分布算法存在一個(gè)問(wèn)題:當(dāng)節(jié)點(diǎn)數(shù)量變化時(shí),也就是 N 值變化,那么幾乎所有的數(shù)據(jù)都需要重新分布,將導(dǎo)致大量的數(shù)據(jù)遷移。
一致性哈希:
Distributed Hash Table(DHT):對(duì)于哈??臻g 0~2n,將該哈希空間看成一個(gè)哈希環(huán),將每個(gè)節(jié)點(diǎn)都配置到哈希環(huán)上。每個(gè)數(shù)據(jù)對(duì)象通過(guò)哈希取模得到哈希值之后,存放到哈希環(huán)中順時(shí)針?lè)较虻谝粋€(gè)大于等于該哈希值的節(jié)點(diǎn)上。

一致性哈希的優(yōu)點(diǎn)是在加入或者刪除節(jié)點(diǎn)時(shí)只會(huì)影響到哈希環(huán)中相鄰的節(jié)點(diǎn),例如下圖中新增節(jié)點(diǎn) X,只需要將數(shù)據(jù)對(duì)象 C 重新存放到節(jié)點(diǎn) X 上即可,對(duì)于節(jié)點(diǎn) A、B、D 都沒(méi)有影響。

順序分布:
哈希分布式破壞了數(shù)據(jù)的有序性,順序分布則不會(huì)。
順序分布的數(shù)據(jù)劃分為多個(gè)連續(xù)的部分,按一定策略分布到不同節(jié)點(diǎn)上。例如下圖中,User 表的主鍵范圍為 1 ~ 7000,使用順序分布可以將其劃分成多個(gè)子表,對(duì)應(yīng)的主鍵范圍為 1 ~ 1000,1001 ~ 2000,...,6001 ~ 7000。
引入 Meta 表是為了支持更大的集群規(guī)模,它將原來(lái)的一層索引結(jié)分成兩層,Meta 維護(hù)著 User 子表所在的節(jié)點(diǎn),從而減輕 Root 節(jié)點(diǎn)的負(fù)擔(dān)。

三、負(fù)載均衡:
衡量負(fù)載的因素很多,如CPU、內(nèi)存、磁盤(pán)等資源使用情況、讀寫(xiě)請(qǐng)求數(shù)等。分布式系統(tǒng)應(yīng)當(dāng)能夠自動(dòng)負(fù)載均衡當(dāng)某個(gè)節(jié)點(diǎn)的負(fù)載較高時(shí),將它的部分?jǐn)?shù)據(jù)遷移到其他節(jié)點(diǎn)
每個(gè)集群都有一個(gè)總控節(jié)點(diǎn),其他節(jié)點(diǎn)為工作節(jié)點(diǎn),由總控節(jié)點(diǎn)根據(jù)全局負(fù)載信息進(jìn)行整體調(diào)度,工作節(jié)點(diǎn)定時(shí)發(fā)送心跳包(Hearbeat)將節(jié)點(diǎn)負(fù)載相關(guān)的信息發(fā)送給總控節(jié)點(diǎn)
一個(gè)新上線的工作節(jié)點(diǎn),由于其負(fù)載較低,如果不加控制,總控節(jié)點(diǎn)會(huì)將大量數(shù)據(jù)同時(shí)遷移到該節(jié)點(diǎn)上,造成該節(jié)點(diǎn)一段時(shí)間內(nèi)無(wú)法工作。因此負(fù)載均衡操作需要平滑進(jìn)行,新加入的節(jié)點(diǎn)需要較長(zhǎng)的一段時(shí)間來(lái)達(dá)到比較均衡的狀態(tài)。
四、復(fù)制:
復(fù)制是保證分布式系統(tǒng)高可用的基礎(chǔ),讓一個(gè)數(shù)據(jù)存儲(chǔ)多個(gè)副本,當(dāng)某個(gè)副本所在節(jié)點(diǎn)出現(xiàn)故障時(shí),能夠自動(dòng)切換到其他副本上,從而實(shí)現(xiàn)故障恢復(fù)
多個(gè)副本通常有一個(gè)為主副本,其他為備副本。主副本用來(lái)處理寫(xiě)請(qǐng)求,備副本主要用來(lái)處理讀請(qǐng)求,實(shí)現(xiàn)讀寫(xiě)分離。主副本將同步操作日志發(fā)送給備副本,備副本通過(guò)回放操作日志獲取最新修改

主備副本之間有兩種復(fù)制協(xié)議:強(qiáng)同步復(fù)制協(xié)議與異步復(fù)制協(xié)議
強(qiáng)同步復(fù)制協(xié)議
要求主副本將同步操作日志發(fā)給備副本之后進(jìn)行等待,要求至少一個(gè)備副本返回成功后,才開(kāi)始修改主副本,修改完成之后通知客戶端操作成功。
優(yōu)點(diǎn):至少有一個(gè)備副本擁有完整的數(shù)據(jù),出現(xiàn)故障時(shí)可以安全地切換到該備副本,因此一致性好。
缺點(diǎn):可用性差,因?yàn)橹鞲北拘枰却?,那么整個(gè)分布式系統(tǒng)的可用時(shí)間就會(huì)降低。
異步復(fù)制協(xié)議
主副本將同步操作日志發(fā)給備副本之后不需要進(jìn)行等待,直接修改主副本并通知客戶端操作成功。
優(yōu)點(diǎn):可用性好。
缺點(diǎn):一致性差。
五、CAP:分布式系統(tǒng)不可能同時(shí)滿足一致性(C:Consistency)、可用性(A:Availability)和分區(qū)容忍性(P:partition tolerance),最多能同時(shí)滿足其中兩項(xiàng)。
1、一致性:可以從兩個(gè)角度理解一致性:
- 從客戶端的角度:讀寫(xiě)操作是否滿足某種特性
- 從服務(wù)器的角度:多個(gè)數(shù)據(jù)副本之間是否一致
一致性模型如下:
- 強(qiáng)一致性:新數(shù)據(jù)寫(xiě)入之后,在任何數(shù)據(jù)副本上都能讀取到最新值
- 弱一致性:新數(shù)據(jù)寫(xiě)入之后,不能保證在數(shù)據(jù)副本上能讀取到最新值
- 最終一致性:新數(shù)據(jù)寫(xiě)入之后,只能保證過(guò)了一個(gè)時(shí)間窗口后才能在數(shù)據(jù)副本上讀取到最新值
2、可用性:指系統(tǒng)在面對(duì)各種異常時(shí)可以提供正常服務(wù)的能力??梢杂孟到y(tǒng)可用時(shí)間占總時(shí)間的比值來(lái)衡量,4個(gè)9的可用性表示系統(tǒng)99.99%的時(shí)間是可用的。
3、分區(qū)容忍性:系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作(系統(tǒng)中有部分服務(wù)或模塊掛掉或失效的時(shí)候,不影響系統(tǒng)正常服務(wù))以實(shí)際效果而言,分區(qū)相當(dāng)于對(duì)通信的時(shí)限要求。系統(tǒng)如果不能在時(shí)限內(nèi)達(dá)成數(shù)據(jù)一致性,就意味著發(fā)生了分區(qū)的情況,必須就當(dāng)前操作在C和A之間做出選擇。
分區(qū)容忍性必不可少,因?yàn)樾枰偸羌僭O(shè)網(wǎng)絡(luò)是不可靠的。因此實(shí)際上設(shè)計(jì)分布式系統(tǒng)需要在一致性和可用性之間做權(quán)衡。
數(shù)據(jù)存在的節(jié)點(diǎn)越多,分區(qū)容忍性越高,但要復(fù)制更新的數(shù)據(jù)就越多,一致性就越難保證。為了保證一致性,更新所有節(jié)點(diǎn)數(shù)據(jù)所需要的時(shí)間就越長(zhǎng),可用性就會(huì)降低
六、BASE:BASE是Basically Available(基本可用)、Soft state(軟狀態(tài))和 Eventually consistent(最終一致性)三個(gè)短語(yǔ)的縮寫(xiě)。BASE 理論是對(duì) CAP 中一致性和可用性權(quán)衡的結(jié)果,是基于 CAP 定理逐步演化而來(lái)的。BASE 理論的核心思想是:即使無(wú)法做到強(qiáng)一致性,但每個(gè)應(yīng)用都可以根據(jù)自身業(yè)務(wù)特點(diǎn),采用適當(dāng)?shù)姆绞絹?lái)使系統(tǒng)達(dá)到最終一致性。
基本可用:指分布式系統(tǒng)在出現(xiàn)故障的時(shí)候,保證核心可用,允許損失部分可用性。
例如,電商在做促銷(xiāo)時(shí),服務(wù)層可能只提供降級(jí)服務(wù),部分用戶可能會(huì)被引導(dǎo)到降級(jí)頁(yè)面上。
軟狀態(tài):指允許系統(tǒng)存在中間狀態(tài),而該中間狀態(tài)不會(huì)影響系統(tǒng)整體可用性,即不同節(jié)點(diǎn)的數(shù)據(jù)副本之間進(jìn)行同步的過(guò)程允許存在延時(shí)。
最終一致性:指所有的數(shù)據(jù)副本,在經(jīng)過(guò)一段時(shí)間的同步之后,最終都能夠達(dá)到一致的狀態(tài)。
強(qiáng)一致性需要保證數(shù)據(jù)副本實(shí)時(shí)一致,而最終一致性只需要保證過(guò)一段時(shí)間是一致的。ACID 是傳統(tǒng)數(shù)據(jù)庫(kù)系統(tǒng)常用的設(shè)計(jì)理論,追求強(qiáng)一致性模型。BASE 常用于大型分布式系統(tǒng),只需要保證最終一致性。在實(shí)際的分布式場(chǎng)景中,不同業(yè)務(wù)單元和組件對(duì)一致性的要求是不同的,因此 ACID 和 BASE 往往會(huì)結(jié)合在一起使用。
七、容錯(cuò):分布式系統(tǒng)故障發(fā)生的概率很大,為了實(shí)現(xiàn)高可用以及減少人工運(yùn)維成本,需要實(shí)現(xiàn)自動(dòng)化容錯(cuò)
故障檢測(cè)
通過(guò) 租約機(jī)制 來(lái)對(duì)故障進(jìn)行檢測(cè)。假設(shè)節(jié)點(diǎn) A 為主控節(jié)點(diǎn),節(jié)點(diǎn) A 向節(jié)點(diǎn) B 發(fā)送租約,節(jié)點(diǎn) B 在租約規(guī)定的期限內(nèi)才能提供服務(wù)。期限快到達(dá)時(shí),節(jié)點(diǎn) B 需要向 A 重新申請(qǐng)租約。
如果過(guò)期,那么 B 不再提供服務(wù),并且 A 也能知道 B 此時(shí)可能發(fā)生故障并已經(jīng)停止服務(wù)。可以看到,通過(guò)這種機(jī)制,A 和 B 都能對(duì) B 發(fā)生故障這一事實(shí)達(dá)成一致。
故障恢復(fù)
當(dāng)某個(gè)節(jié)點(diǎn)故障時(shí),就將它上面的服務(wù)遷移到其它節(jié)點(diǎn)。
八、CDN架構(gòu):
CND 通過(guò)將內(nèi)容發(fā)布到靠近用戶的邊緣節(jié)點(diǎn),使不同地域的用戶在訪問(wèn)相同網(wǎng)頁(yè)時(shí)可以就近獲取。不僅可以減輕服務(wù)器的負(fù)擔(dān),也可以提高用戶的訪問(wèn)速度。
從下圖可以看出,DNS 在對(duì)域名解析時(shí)不再向用戶返回源服務(wù)器的 IP 地址,而是返回邊緣節(jié)點(diǎn)的 IP 地址,所以用戶最終訪問(wèn)的是邊緣節(jié)點(diǎn)。邊緣節(jié)點(diǎn)會(huì)先從源服務(wù)器中獲取用戶所需的數(shù)據(jù),如果請(qǐng)求成功,邊緣節(jié)點(diǎn)會(huì)將頁(yè)面緩存下來(lái),下次用戶訪問(wèn)時(shí)可以直接讀取。

參考資料: