分布式系統(tǒng)架構(gòu)
分布式系統(tǒng)概念
通常的理解分布式系統(tǒng),就是一個業(yè)務(wù)拆分成多個子業(yè)務(wù),分布在不同的服務(wù)器節(jié)點,共同構(gòu)成的系統(tǒng)稱為分布式系統(tǒng),同一個分布式系統(tǒng)中的服務(wù)器節(jié)點在空間部署上是可以隨意分布的,理論上這些服務(wù)節(jié)點可以存在任意的位置。

分布式與集群的區(qū)別
集群:多個人在一起做同樣事情
分布式:多個人在一起做不同的事
| 特點 | 分布式系統(tǒng) |
|---|---|
| 分布性 | YES |
| 對等性 | YES |
| 并發(fā)性 | YES |
| 缺乏全局時鐘 | YES |
| 故障總會發(fā)生 | YES |

分布式系統(tǒng)的發(fā)展
阿里巴巴發(fā)起的"去 IOE"運動 (IOE 指的是 IBM 小型機、Oracle 數(shù)據(jù)庫、EMC 的高端存儲)。阿里巴巴2009 年“去IOE”戰(zhàn)略技術(shù)總監(jiān)透露,截止到 2013 年 5 月 17 日阿里巴巴最后一臺 IBM 小型機在支付寶下線。 ?為什么要去IOE?
1.升級單機處理能力的性價比越來越低
2.單機處理能力存在瓶頸
3.穩(wěn)定行和可用性指標(biāo)不容易達到
分布式架構(gòu)的演變
- 階段1:單體應(yīng)用架構(gòu):也就是我們在開始使用的一個Tomcat一個服務(wù)器做了所有的事情
- 階段2:應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器分離
- 階段3:應(yīng)用服務(wù)器集群
- 階段4:應(yīng)用服務(wù)器負(fù)載用戶
- 階段5:數(shù)據(jù)庫讀寫分離
- 階段6:添加搜索引擎減少讀庫壓力
- 階段7:添加緩存機制緩解數(shù)據(jù)庫壓力
- 階段8:數(shù)據(jù)庫水平/垂直拆分
- 階段9:應(yīng)用拆分
- 階段10:服務(wù)化/微服務(wù)
分布式系統(tǒng)面臨的問題
-
通信異常
網(wǎng)絡(luò)本身的不可靠性,因此每次網(wǎng)絡(luò)通信都會伴隨著網(wǎng)絡(luò)不可用的風(fēng)險(光纖、路由、DNS等硬件設(shè)備或系統(tǒng)的不可用),都會導(dǎo)致最終分布式系統(tǒng)無法順利進行一次網(wǎng)絡(luò)通信,另外,即使分布式系統(tǒng)各節(jié)點之間的網(wǎng)絡(luò)通信能夠 正常執(zhí)行,其延時也會大于單機操作,存在巨大的延時差別,也會影響消息的收發(fā)過程,因此消息丟失和消息延遲 變的非常普遍。 -
網(wǎng)絡(luò)分區(qū)
網(wǎng)絡(luò)之間出現(xiàn)了網(wǎng)絡(luò)不連通,但各個子網(wǎng)絡(luò)的內(nèi)部網(wǎng)絡(luò)是正常的,從而導(dǎo)致整個系統(tǒng)的網(wǎng)絡(luò)環(huán)境被切分成了若干個孤立的區(qū)域,分布式系統(tǒng)就會出現(xiàn)局部小集群,在極端情況下,這些小集群會獨立完成原本需要整個分布式系統(tǒng)才 能完成的功能,包括數(shù)據(jù)的事務(wù)處理,這就對分布式一致性提出非常大的挑戰(zhàn)。 -
節(jié)點故障
節(jié)點故障是分布式系統(tǒng)下另一個比較常見的問題,指的是組成分布式系統(tǒng)的服務(wù)器節(jié)點出現(xiàn)的宕機或"僵死"現(xiàn)象,根據(jù)經(jīng)驗來說,每個節(jié)點都有可能出現(xiàn)故障,并且經(jīng)常發(fā)生。 -
三態(tài)
分布式系統(tǒng)每一次請求與響應(yīng)存在特有的“三態(tài)”概念,即成功、失敗和超時。 分布式系統(tǒng)中,由于網(wǎng)絡(luò)是不可靠的,雖然絕大部分情況下,網(wǎng)絡(luò)通信能夠接收到成功或失敗的響應(yīng),但當(dāng)網(wǎng)絡(luò)出 現(xiàn)異常的情況下,就會出現(xiàn)超時現(xiàn)象,通常有以下兩種情況:
- 由于網(wǎng)絡(luò)原因,該請求并沒有被成功的發(fā)送到接收方,而是在發(fā)送過程就發(fā)生了丟失現(xiàn)象。
- 該請求成功的被接收方接收后,并進行了處理,但在響應(yīng)反饋給發(fā)送方過程中,發(fā)生了消息丟失現(xiàn)象。
分布式理論
一致性
-
什么是分布式一致性
分布式數(shù)據(jù)一致性,指的是數(shù)據(jù)在多份副本中存儲時,個副本的數(shù)據(jù)是一致的。 -
副本一致性
分布式系統(tǒng)當(dāng)中,數(shù)據(jù)往往存在多個副本。如果是一臺數(shù)據(jù)庫處理所有的數(shù)據(jù)請求。那么通過ACID原則,基本是可以保證數(shù)據(jù)的一致性。而多個副本就涉及到了數(shù)據(jù)的copy,這就帶來了數(shù)據(jù)的同步問題。因為我們沒有辦法保證可是同時更新所有機器當(dāng)中的包括備份的所有數(shù)據(jù)。網(wǎng)絡(luò)延遲,即使我在同一時間給所有機器發(fā)送了更新數(shù)據(jù)的請求,也不能保證這些請求被響應(yīng)的時間保持一致,依然會存在時間差,那么就會存在某些機器數(shù)據(jù)不一致的情況。
總的來說,我們無法找到一種能滿足分布式系統(tǒng)所有系統(tǒng)屬性的分布式一致性解決方案。因此如何既保證數(shù)據(jù)的一致性,又保證系統(tǒng)的運行性能,是每個分布式系統(tǒng)都需要權(quán)衡和考慮的。也正如此,才誕生了數(shù)據(jù)一致性級別。
一致性分類
-
強一致性
這種一致性級別是最符合用戶直覺的,它要求系統(tǒng)寫入什么,讀出來的也會是什么,用戶體驗好,但實現(xiàn)起來往往是對系統(tǒng)的性能影響大。強一致性很難實現(xiàn)。 - 弱一致性:這種一致性級別約束了系統(tǒng)在寫入成功后,不承諾立即可以讀取到寫入的數(shù)據(jù),也不承諾多久后可以達到數(shù)據(jù)的一致,但是會盡可能的保證某個時間級別(比如秒級別)后數(shù)據(jù)可以達到最終一致。
- 讀寫一致性:用戶讀取自己寫入結(jié)果的一致性,保證用戶永遠能夠第一時間看到自己更新的內(nèi)容。 比如我們發(fā)一條朋友圈,朋友圈的內(nèi)容是不是第一時間被朋友看見不重要,但是一定要顯示在自己的列表上。
- 單調(diào)讀一致性: 本次讀到的數(shù)據(jù)不能比上次讀到的舊。 由于主從節(jié)點更新數(shù)據(jù)的時間不一致,導(dǎo)致用戶在不停地刷新的時候,有時候能刷出來,再次刷新之后會發(fā)現(xiàn)數(shù)據(jù)不見 了,再刷新又可能再刷出來,就好像遇見靈異事件一樣
- 因果一致性:指的是:如果節(jié)點 A 在更新完某個數(shù)據(jù)后通知了節(jié)點 B,那么節(jié)點 B 之后對該數(shù)據(jù)的訪問和修改都是基于 A 更新后 的值。于此同時,和節(jié)點 A 無因果關(guān)系的節(jié)點 C 的數(shù)據(jù)訪問則沒有這樣的限制。
- 最終一致性:最終一致性是所有分布式一致性模型當(dāng)中最弱的。可以認(rèn)為是沒有任何優(yōu)化的“最”弱一致性,它的意思是說,我不考慮 所有的中間狀態(tài)的影響,只保證當(dāng)沒有新的更新之后,經(jīng)過一段時間之后,最終系統(tǒng)內(nèi)所有副本的數(shù)據(jù)是正確的。 它最大程度上保證了系統(tǒng)的并發(fā)能力,也因此,在高并發(fā)的場景下,它也是使用最廣的一致性模型。
CAP定理
CAP 理論含義是,一個分布式系統(tǒng)不可能同時滿足一致性(C:Consistency),可用性(A:Availability)和分區(qū)容錯 性(P:Partition tolerance)這三個基本需求,最多只能同時滿足其中的2個。 為什么這么說?我們先看下面的表格。
| 選項 | 描述 |
|---|---|
| C 一致性 | 分布式系統(tǒng)當(dāng)中的一致性指的是所有節(jié)點的數(shù)據(jù)一致,或者說是所有副本的數(shù)據(jù)一致 |
| A 可用性 | Reads and writes always succeed. 也就是說系統(tǒng)一直可用,而且服務(wù)一直保持正常 |
| P 分區(qū)容錯性 | 系統(tǒng)在遇到一些節(jié)點或者網(wǎng)絡(luò)分區(qū)故障的時候,仍然能夠提供滿足一致性和可用性的服務(wù) |

C
Consistency:一致性是值寫操作后讀操作可以讀到最新的數(shù)據(jù)狀態(tài),當(dāng)數(shù)據(jù)分布在多個節(jié)點上時,從任意節(jié)點讀取到的數(shù)據(jù)都是最新的。
- 商品信息滿足一致性需要實現(xiàn)如下目標(biāo)
- 商品寫入主數(shù)據(jù)庫成功,則想從數(shù)據(jù)庫查詢數(shù)據(jù)也成功
- 商品服務(wù)寫入主數(shù)據(jù)庫失敗,則向從數(shù)據(jù)庫查詢也失敗
- 那么如何實現(xiàn)一致性呢?
- 主庫寫入數(shù)據(jù)要同步到從庫
- 寫入主庫后,在向從庫同步期間要將從庫鎖定。等待同步完成后再釋放鎖,以免在寫入新數(shù)據(jù)后向從庫中查詢到舊的數(shù)據(jù)。
- 分布式一致性特點
- 由于存在數(shù)據(jù)同步,寫操作響應(yīng)會存在一定延時
- 為了保證數(shù)據(jù)一致性對資源暫時鎖定,等待數(shù)據(jù)同步完進行鎖釋放
- 如果請求了同步失敗的數(shù)據(jù)庫節(jié)點,那么該節(jié)點一定不能返回舊數(shù)據(jù),進行錯誤信息提示
A
Availability:可用性是指任何操作都可以得到響應(yīng)的結(jié)果,且不會出現(xiàn)響應(yīng)超時或響應(yīng)錯誤
- 商品信息讀寫滿足可用性需要實現(xiàn)如下目標(biāo)
- 從庫接收到查詢請求一定可以返回查詢結(jié)果
- 數(shù)據(jù)庫不允許出現(xiàn)響應(yīng)超時或者錯誤
- 如何實現(xiàn)可用性
- 寫入主庫要將數(shù)據(jù)同步到從庫
- 要保證數(shù)據(jù)庫的可用性,不能將資源鎖定
- 即使數(shù)據(jù)沒有同步過來,從庫也要返回查詢結(jié)果,哪怕是舊數(shù)據(jù)。但是絕對不允許超時或者出現(xiàn)錯誤
P
Partition tolerance:分布式系統(tǒng)的各個節(jié)點部署在不同的子網(wǎng)中, 不可避免的會出現(xiàn)由于網(wǎng)絡(luò)問題導(dǎo)致節(jié)點之間通信失敗,此時仍可以對外提供服務(wù), 這個就是分區(qū)容錯性 (分區(qū)容忍性)
- 商品信息讀寫要滿足分區(qū)容錯性需要如下目標(biāo)
- 主數(shù)據(jù)庫想從數(shù)據(jù)庫同步數(shù)據(jù)失敗不影響寫操作
- 其中一個節(jié)點掛掉不會影響另一個節(jié)點對外提供服務(wù)
- 如何實現(xiàn)分區(qū)容錯性
- 盡量使用異步取代同步操作,使用異步方式將數(shù)據(jù)從主數(shù)據(jù)庫同步到從數(shù)據(jù)庫,這樣節(jié)點之間能有效的實現(xiàn)松耦合
- 添加數(shù)據(jù)庫節(jié)點,其中一個從節(jié)點掛掉由其他節(jié)點提供服務(wù)
思考:CAP定理為什不能同時滿足?
用戶向N1發(fā)送了請求更改了數(shù)據(jù),將數(shù)據(jù)庫從V0更新成了V1。由于網(wǎng)絡(luò)斷開,所以N2數(shù)據(jù)庫依然是V0,如果這個時候 有一個請求發(fā)給了N2,但是N2并沒有辦法可以直接給出最新的結(jié)果V1,這個時候該怎么辦呢?
這個時候有兩種解決辦法:一種是將錯就錯,N2直接將V0返回給用戶。另一種就是等到N1和N2的通信恢復(fù),將更新之后的數(shù)據(jù)返回給用戶。顯然第一種方式犧牲了一致性,第二種方式犧牲了可用性。
我們在對CAP進行取舍的時候一定要對實際的情況進行分析,當(dāng)然P是肯定存在的,沒有P也就意味著沒有了分布式。當(dāng)然看到這里證明你在思考,那么就不能最大限度的滿足這個三個嗎?我們繼續(xù)往下看。
BASE理論
-
什么是BASE理論
全稱:Basically Available(基本可用),Soft state(軟狀態(tài)),和 Eventually consistent(最終一致性)三個 短語的縮寫,來自 ebay 的架構(gòu)師提出
BASE是對CAP中一致性和可用性權(quán)衡的結(jié)果,BASE理論的核心思想是:即使無法做到強一致性,但是每個應(yīng)用可以根據(jù)自身業(yè)務(wù)特點,采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達到最終一致性 -
Basically Available:基本可用
基本可用是指分布式系統(tǒng)在出現(xiàn)不可預(yù)知故障的時候,允許損失部分可用性。但請注意,這絕不等價于系統(tǒng)不可用。
- 響應(yīng)時間損失:例如系統(tǒng)正常狀態(tài)下0.3s將數(shù)據(jù)返回,出現(xiàn)問題后需要1-2s將數(shù)據(jù)進行返回
- 功能上損失:例如淘寶網(wǎng)站在雙11進行大促,或者活動秒殺,當(dāng)你點擊某個功能的時候出現(xiàn)"被擠爆了稍后再試.."等等..都是功能上損失
-
Soft state:軟狀態(tài)
什么是軟狀態(tài)呢?相對于一致性,要求多個節(jié)點的數(shù)據(jù)副本都是一致的,這是一種 “硬狀態(tài)”。軟狀態(tài)指的是:允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并認(rèn)為該狀態(tài)不影響系統(tǒng)的整體可用性,即允許系統(tǒng)在多個不同 節(jié)點的數(shù)據(jù)副本之間進行數(shù)據(jù)同步的過程中存在延遲。 -
Eventually consistent:最終一致性
最終一致性強調(diào)的是系統(tǒng)中所有的數(shù)據(jù)副本,在經(jīng)過一段時間的同步后,最終能夠達到一個一致的狀態(tài)。因此最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達到一致,而不需要實時保證系統(tǒng)數(shù)據(jù)的強一致性。
結(jié)束語
分布式理論對于我們來說主要是思想,知其然更要知其所以然。“革命先烈”已經(jīng)將成熟的東西交給了我們,那么我們一定要去珍惜。希望這篇文章可以給“干飯人”帶來“干飯魂”。歡迎下方留言討論。