分布式理论:CAP、BASE | 分布式存储与一致性哈希
文章目錄
- 分布式理論
- CAP定理
- BASE理論
- 分布式存儲與一致性哈希
- 簡單哈希
- 一致性哈希
- 虛擬節(jié)點
分布式理論
CAP定理
- 一致性(Consistency): 在分布式系統(tǒng)中的所有數(shù)據(jù)副本,在同一時刻是否一致(所有節(jié)點訪問同一份最新的數(shù)據(jù)副本)。
- 可用性(Availability): 分布式系統(tǒng)在面對各種異常時可以提供正常服務(wù)的能力(非故障的節(jié)點在有限的時間內(nèi)返回合理的響應(yīng))。
- 分區(qū)容錯性(Partition Tolerance): 分布式系統(tǒng)在遇到任何網(wǎng)絡(luò)分區(qū)故障的時候,仍然需要能對外提供一致性和可用性的服務(wù),除非是整個網(wǎng)絡(luò)環(huán)境都發(fā)生了故障。
一個分布式系統(tǒng)不可能同時滿足一致性、可用性、分區(qū)容錯性這三個基本需求,最多只能滿足其中的兩項,不可能三者兼顧。
為什么三者不可兼顧呢?
這跟 網(wǎng)絡(luò)分區(qū) 這一概念有關(guān):在分布式系統(tǒng)中,不同的節(jié)點分布在不同的子網(wǎng)絡(luò)(機房或異地網(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ū)域。
此時,每個區(qū)域內(nèi)部可以通信,但是區(qū)域之間無法通信。
對于一個分布式系統(tǒng)而言,組件必然要被部署到不同的節(jié)點上,因此必然會出現(xiàn)子網(wǎng)絡(luò)。我們無法保證網(wǎng)絡(luò)始終可靠,那么網(wǎng)絡(luò)分區(qū)則是必定會產(chǎn)生的異常情況。當發(fā)生網(wǎng)絡(luò)分區(qū)的時候,如果我們要繼續(xù)提供服務(wù),那么 分區(qū)容錯性P 是必定要滿足的。
那么一致性C和可用性A可以兼顧嗎?
答案是否定的。倘若分布式系統(tǒng)中出現(xiàn)了網(wǎng)絡(luò)分區(qū)的情況,假設(shè)此時某一個節(jié)點在進行寫操作,為了保證一致性,那么就必須要禁止其他節(jié)點的讀寫操作以防止數(shù)據(jù)沖突,而此時就導(dǎo)致其他的節(jié)點無法正常工作,即與可用性發(fā)生沖突。而如果讓其他節(jié)點都正常進行讀寫操作的話,那就無法保證數(shù)據(jù)的一致,影響了數(shù)據(jù)的一致性。
BASE理論
- 基本可用(Basically Available): 基本可用是指分布式系統(tǒng)在出現(xiàn)不可預(yù)知故障的時候,允許損失部分可用性(響應(yīng)時間上的損失、系統(tǒng)功能上的損失)。但是,這絕不等價于系統(tǒng)不可用。
- 軟狀態(tài)(Soft-state): 允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài)(數(shù)據(jù)不一致),并認為該中間狀態(tài)的存在不會影響系統(tǒng)的整體可用性。即允許系統(tǒng)在不同節(jié)點的數(shù)據(jù)副本之間進行數(shù)據(jù)同步時存在延時。
- 最終一致性(Eventually Consistent): 最終一致性強調(diào)的是系統(tǒng)中所有的數(shù)據(jù)副本最終能夠達到一致,而不需要實時保證系統(tǒng)數(shù)據(jù)的強一致性。
BASE理論 是基本可用 、軟狀態(tài)和最終一致性 三個短語的縮寫。是對 CAP 中的一致性和可用性權(quán)衡后的結(jié)果。
總的來說,BASE理論 面向的是大型高可用可擴展的分布式系統(tǒng),它完全不同于 ACID 的強一致性模型,而是提出通過犧牲強一致性來獲得可用性,并允許數(shù)據(jù)在一段時間內(nèi)是不一致的,但最終達到一致狀態(tài)。 但同時,在實際的分布式場景中,ACID特性 與 BASE理論 往往又會結(jié)合在一起使用。
分布式存儲與一致性哈希
如果我們需要存儲QQ號與個人信息,建立起 <QQ號, 個人信息> 的 KV 模型。
假設(shè) QQ 有 10億 用戶,并且每個用戶的個人信息占據(jù)了 100M,如果要存儲這些數(shù)據(jù),所需要的空間就得 (100億* 100M) = 10WT,這么龐大的數(shù)據(jù)是不可能在單機環(huán)境下存儲的,只能采用分布式的方法,用多個機器進行存儲,但是即使使用多機,這些數(shù)據(jù)也至少要 10w 臺機器(假設(shè)每臺服務(wù)器存 1T )才能存儲。那么我們?nèi)绾未_定哪些數(shù)據(jù)應(yīng)該放在哪個機器呢?這時就需要用到哈希算法。
簡單哈希
我們可以采用除留余數(shù)法來完成一個映射:
機器編號 = hash(QQ號) % 機器數(shù)量使用時再根據(jù)機器編號進入對應(yīng)的機器進行增刪查改即可。
但是這個方法存在著一個致命的缺陷,如果后續(xù)用戶信息增加,10w 臺機器就會不夠用,此時就需要將機器數(shù)量擴容至 15w 臺。
當進行擴容后,由于機器數(shù)量發(fā)生變化,數(shù)據(jù)的映射關(guān)系也會變化,我們就需要進行 rehash 來將所有數(shù)據(jù)重新映射到正確的位置上。
但是問題來了,這 10w 臺機器的數(shù)據(jù)如果需要進行重新映射,花費的時間幾乎是不可想象的,我們不可能說為了遷移數(shù)據(jù)而讓服務(wù)器宕機數(shù)月之久,所以這種方法是不可能行得通的。
一致性哈希
為了彌補簡單哈希的缺陷,引入了一致性哈希算法。以避免擴容后 rehash 帶來的所有數(shù)據(jù)遷移問題。一致性哈希將哈希構(gòu)造成一個 0~232-1 的環(huán)形結(jié)構(gòu),并將余數(shù)從原來的機器數(shù)量修改值為整型最大值(也可以是比這個更大的):
機器編號 = hash(QQ號) % 2^32因為這個數(shù)據(jù)足夠大,所以無需擔(dān)心后續(xù)機器數(shù)增加導(dǎo)致的 rehash 問題。我們將環(huán)中的某一區(qū)間映射到某臺服務(wù)器,讓這臺服務(wù)器管理這個區(qū)間,這樣就能讓這 10w 臺服務(wù)器來切分這個閉環(huán)結(jié)構(gòu)。
哈希環(huán)上的數(shù)據(jù)節(jié)點向順時針方向?qū)ふ业降牡谝粋€服務(wù)器就是管理它的服務(wù)器。
當我們要查詢某個數(shù)據(jù)的時候,根據(jù)哈希函數(shù)算出的映射位置來找到包含該位置的區(qū)間所對應(yīng)的服務(wù)器,然后在那個服務(wù)器中進行操作即可。
如果原先的服務(wù)器不夠用了,此時增加 5w 個服務(wù)器,也不需要像之前一樣對所有機器的數(shù)據(jù)進行遷移,我們只需要遷移負載重的機器即可。
同理,如果一個服務(wù)器宕機了,那么該服務(wù)器的上的數(shù)據(jù)就會被順時針方向的下一個服務(wù)器接管:
但是這樣的接管容易引發(fā)雪崩,即C節(jié)點由于承擔(dān)了B節(jié)點的數(shù)據(jù),所以C節(jié)點的負載會變高,C節(jié)點很容易也宕機,這樣依次下去,這樣造成整個集群都掛了。
虛擬節(jié)點
為此,引入了虛擬節(jié)點的概念:即把想象在這個環(huán)上有很多虛擬節(jié)點,數(shù)據(jù)的存儲是沿著環(huán)的順時針方向找一個虛擬節(jié)點,每個虛擬節(jié)點都會關(guān)聯(lián)到一個真實節(jié)點。
圖中的A1、A2、B1、B2、C1、C2、D1、D2都是虛擬節(jié)點,機器A負載存儲A1、A2的數(shù)據(jù),機器B負載存儲B1、B2的數(shù)據(jù),機器C負載存儲C1、C2的數(shù)據(jù)。由于這些虛擬節(jié)點數(shù)量很多,均勻分布,因此不會造成“雪崩”現(xiàn)象。
通過虛擬節(jié)點,我們可以做到不增加真實的服務(wù)器數(shù)量即可解決數(shù)據(jù)分布不均勻。
總結(jié)
以上是生活随笔為你收集整理的分布式理论:CAP、BASE | 分布式存储与一致性哈希的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡逾期每月还点会被起诉吗?真实情况是
- 下一篇: 硬件结构图_那曲地表水电子除垢仪结构图