更新時間:2022-06-01 10:40:34 來源:動力節(jié)點 瀏覽1369次
動力節(jié)點小編對Java高級特性進行了總結(jié)。
在分布式系統(tǒng)要滿足CAP原則,一個提供數(shù)據(jù)服務(wù)的存儲系統(tǒng)無法同時滿足:數(shù)據(jù)一致性、數(shù)據(jù)可用性、分區(qū)耐受性。
C數(shù)據(jù)一致性:所有應(yīng)用程序都能訪問到相同的數(shù)據(jù)。 A數(shù)據(jù)可用性:任何時候,任何應(yīng)用程序都可以讀寫訪問。 P分區(qū)耐受性:系統(tǒng)可以跨網(wǎng)絡(luò)分區(qū)線性伸縮。(通俗來說就是數(shù)據(jù)的規(guī)模可擴展) 在大型網(wǎng)站中通常都是犧牲C,選擇AP。為了可能減小數(shù)據(jù)不一致帶來的影響,都會采取各種手段保證數(shù)據(jù)最終一致。
數(shù)據(jù)強一致:各個副本的數(shù)據(jù)在物理存儲中總是一致的。
數(shù)據(jù)用戶一致:數(shù)據(jù)在物理存儲的各個副本可能是不一致的,但是通過糾錯和校驗機制,會確定一個一致的且正確的數(shù)據(jù)返回給用戶。
數(shù)據(jù)最終一致:物理存儲的數(shù)據(jù)可能不一致,終端用戶訪問也可能不一致,但是一段時間內(nèi)數(shù)據(jù)會達成一致。
使一組服務(wù)器在一個值上達成一致,所以活躍的特征在于最終每個服務(wù)器都可以決定一個值。
通過值的一致能夠?qū)崿F(xiàn)對同一個數(shù)據(jù)的請求會讓同一個服務(wù)器來處理。
Paxos和Raft都是通過選取master來實現(xiàn)多節(jié)點下值的一致性,從而借助一致性hash算法來分配請求。
一致性Hash算法 一致性Hash算法可以根據(jù)不同的屬性參數(shù)(通常是IP和端口號),生成一串不相同的Hash值,并將Hash值轉(zhuǎn)換成0-2^32-1的整數(shù), 不同范圍的值由不同服務(wù)器進行處理。(B-C之間的由B處理)。
Raft算法是在Paxos算法的基礎(chǔ)上的進行優(yōu)化。 Raft在Paxos的基礎(chǔ)上主要做了兩個方向的優(yōu)化: 1.將復(fù)雜的分布式共識問題拆分成領(lǐng)導(dǎo)選舉、日志復(fù)制和安全性三個問題 2.壓縮狀態(tài)空間:相對于Paxos施加了更合理的限制,減少了系統(tǒng)狀態(tài)過多而產(chǎn)生的不確定因素。
領(lǐng)導(dǎo)選舉(具體以zookeeper舉例) 其基本的特性有:
zookeeper在配置集群時節(jié)點數(shù)不可小于3
節(jié)點只有獲得半數(shù)以上的投票才能當(dāng)選Leader
zookeeper在啟動時會通過廣播機制來把投票結(jié)果告訴其他的節(jié)點
zookeeper在啟動時首先會給自己投票,然后與其他已啟動的節(jié)點進行通信,通過比較id從而判斷是否能獲取其他節(jié)點的投票
zookeeper在選舉過程中的角色:領(lǐng)導(dǎo)者、跟隨者、觀察者、競選者
日志復(fù)制 在共識算法中,所有服務(wù)器節(jié)點都會包含一個有限狀態(tài)自動機,名為復(fù)制狀態(tài)機(replicated state machine)。每個節(jié)點都維護著一個復(fù)制日志(replicated logs)的隊列,復(fù)制狀態(tài)機會按序輸入并執(zhí)行該隊列中的請求,執(zhí)行狀態(tài)轉(zhuǎn)換并輸出結(jié)果。可見,如果能保證各個節(jié)點中日志的一致性,那么所有節(jié)點狀態(tài)機的狀態(tài)轉(zhuǎn)換和輸出也就都一致。
可見,日志由一個個按序排列的entry組成。每個entry內(nèi)包含有請求的數(shù)據(jù),還有該entry產(chǎn)生時的領(lǐng)導(dǎo)任期值。每個節(jié)點上的日志隊列用一個數(shù)組log[]表示。
領(lǐng)導(dǎo)節(jié)點選舉出來后,集群就可以開始處理客戶端請求了。當(dāng)客戶端發(fā)來請求時,領(lǐng)導(dǎo)節(jié)點首先將其加入自己的日志隊列,再并行地發(fā)送AppendEntries RPC消息給所有跟隨節(jié)點。最終實現(xiàn)節(jié)點數(shù)據(jù)的一致性。
安全性 Raft安全保障機制有5種:
選舉安全性:節(jié)點要3個以上,避免“腦裂”的方式
領(lǐng)導(dǎo)者只追加:客戶端發(fā)出的請求都是插入領(lǐng)導(dǎo)者日志隊列的尾部,沒有修改或刪除的操作。
日志匹配:每條AppendEntries都會包含最新entry之前那個entry的下標(biāo)與任期值,如果跟隨節(jié)點在對應(yīng)下標(biāo)找不到對應(yīng)任期的日志,就會拒絕接受并告知領(lǐng)導(dǎo)節(jié)點。(避免追隨者故障,導(dǎo)致數(shù)據(jù)不一致)
領(lǐng)導(dǎo)者完全性:如果有一條日志在某個任期被提交了,那么它一定會出現(xiàn)在所有任期更大的領(lǐng)導(dǎo)者日志里。(master會優(yōu)先獲取日志的更新)
狀態(tài)機安全性:如果一個節(jié)點已經(jīng)向其復(fù)制狀態(tài)機應(yīng)用了一條日志中的請求,那么對于其他節(jié)點的同一下標(biāo)的日志,不能應(yīng)用不同的請求。(避免master宕機時,重新選舉,導(dǎo)致部分節(jié)點數(shù)據(jù)不一致)
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743