提升網(wǎng)站的訪問(wèn)速度,持續(xù)的高并發(fā),這是技術(shù)上的必然吞获,也是一種科技的衍進(jìn)方式钝荡。以下是系統(tǒng)設(shè)計(jì)的進(jìn)化之路。
單點(diǎn)集中式
特點(diǎn):App、DB、FileServer都部署在一臺(tái)機(jī)器上。并且訪問(wèn)請(qǐng)求量較少
應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)拆分
特點(diǎn):App位他、DB、FileServer分別部署在獨(dú)立服務(wù)器上产场。并且訪問(wèn)請(qǐng)求量較少
使用緩存改善性能
特點(diǎn):數(shù)據(jù)庫(kù)中頻繁訪問(wèn)的數(shù)據(jù)存儲(chǔ)在緩存服務(wù)器中鹅髓,減少數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù),降低數(shù)據(jù)庫(kù)的壓力
應(yīng)用服務(wù)器集群
特點(diǎn):多臺(tái)應(yīng)用服務(wù)器通過(guò)負(fù)載均衡同時(shí)對(duì)外提供服務(wù)京景,解決單臺(tái)服務(wù)器處理能力上限的問(wèn)題
數(shù)據(jù)庫(kù)讀寫分離
特點(diǎn):數(shù)據(jù)庫(kù)進(jìn)行讀寫分離(主從)設(shè)計(jì)迈勋,解決數(shù)據(jù)庫(kù)的處理壓力
反向代理和CDN加速
特點(diǎn):采用反向代理和CDN加快系統(tǒng)的訪問(wèn)速度
分布式文件系統(tǒng)和分布式數(shù)據(jù)庫(kù)
特點(diǎn):數(shù)據(jù)庫(kù)采用分布式數(shù)據(jù)庫(kù),文件系統(tǒng)采用分布式文件系統(tǒng)
隨著業(yè)務(wù)的發(fā)展醋粟,最終數(shù)據(jù)庫(kù)讀寫分離也將無(wú)法滿足需求靡菇,需要采用分布式數(shù)據(jù)庫(kù)和分布式文件系統(tǒng)來(lái)支撐
分布式數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)拆分后的最后方法重归,只有在單表規(guī)模非常龐大的時(shí)候才使用,更常用的數(shù)據(jù)庫(kù)拆分手段是業(yè)務(wù)分庫(kù)厦凤,將不同業(yè)務(wù)的數(shù)據(jù)庫(kù)部署在不同的機(jī)器上
二鼻吮、 分布式技術(shù)詳解
1. 并發(fā)性
2. 分布性
大任務(wù)拆分成多個(gè)任務(wù)部署到多臺(tái)機(jī)器上對(duì)外提供服務(wù)
3. 缺乏全局時(shí)鐘
時(shí)間要統(tǒng)一
4. 對(duì)等性
一個(gè)服務(wù)部署在多臺(tái)機(jī)器上是一樣的,無(wú)任何差別
5. 故障肯定會(huì)發(fā)生
硬盤壞了 CPU燒了....
三较鼓、分布式事務(wù)
1. ACID
原子性(Atomicity):一個(gè)事務(wù)(transaction)中的所有操作椎木,要么全部完成,要么全部不完成博烂,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)香椎。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被恢復(fù)(Rollback)到事務(wù)開始前的狀態(tài)禽篱,就像這個(gè)事務(wù)從來(lái)沒有執(zhí)行過(guò)一樣畜伐。
一致性(Consistency):在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒有被破壞躺率。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則玛界,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫(kù)可以自發(fā)性地完成預(yù)定的工作悼吱。
比如A有500元慎框,B有300元,A向B轉(zhuǎn)賬100后添,無(wú)論怎么樣笨枯,A和B的總和總是800元
隔離性(Isolation):數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致遇西。事務(wù)隔離分為不同級(jí)別馅精,包括讀未提交(Read uncommitted)、讀提交(read committed)努溃、可重復(fù)讀(repeatable read)和串行化(Serializable)硫嘶。
持久性(Durability):事務(wù)處理結(jié)束后阻问,對(duì)數(shù)據(jù)的修改就是永久的梧税,即便系統(tǒng)故障也不會(huì)丟失。
2. 2P/3P
2P= Two Phase commit 二段提交(RDBMS(關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng))經(jīng)常就是這種機(jī)制称近,保證強(qiáng)一致性)
3P= Three Phase commit 三段提交
說(shuō)明:2P/3P是為了保證事務(wù)的ACID(原子性第队、一致性、隔離性刨秆、持久性)
2.1 2P的兩個(gè)階段
階段1:提交事務(wù)請(qǐng)求(投票階段)詢問(wèn)是否可以提交事務(wù)
階段2:執(zhí)行事務(wù)提交(commit凳谦、rollback) 真正的提交事務(wù)
2.2 3P的三個(gè)階段
階段1:是否提交-詢問(wèn)是否可以做事務(wù)提交
階段2:預(yù)先提交-預(yù)先提交事務(wù)
階段3:執(zhí)行事務(wù)提交(commit、rollback)真正的提交事務(wù)
說(shuō)明:3P把2P的階段一拆分成了前面兩個(gè)階段
3. CAP理論
一致性(Consistency):分布式數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致
可用性(Availability):任何一個(gè)節(jié)點(diǎn)掛了衡未,其他節(jié)點(diǎn)可以繼續(xù)對(duì)外提供服務(wù)
分區(qū)容錯(cuò)性(網(wǎng)絡(luò)分區(qū))Partition tolerance:一個(gè)數(shù)據(jù)庫(kù)所在的機(jī)器壞了尸执,如硬盤壞了家凯,數(shù)據(jù)丟失了,可以新增一臺(tái)機(jī)器如失,然后從其他正常的機(jī)器把備份的數(shù)據(jù)同步過(guò)來(lái)
CAP理論的特點(diǎn):CAP只能滿足其中2條
CA(放棄P):將所有的數(shù)據(jù)放在一個(gè)節(jié)點(diǎn)绊诲。滿足一致性、可用性褪贵。
AP(放棄C):放棄強(qiáng)一致性,用最終一致性來(lái)保證脆丁。
CP(放棄A):一旦系統(tǒng)遇見故障世舰,受到影響的服務(wù)器需要等待一段時(shí)間,在恢復(fù)期間無(wú)法對(duì)外提供服務(wù)槽卫。
舉例說(shuō)明CAP理論:
有3臺(tái)機(jī)器分別有3個(gè)數(shù)據(jù)庫(kù)分別有兩張表,數(shù)據(jù)都是一樣的
Machine1-db1-tbl_person跟压、tbl_order
Machine2-db2-tbl_person、tbl_order
Machine3-db3-tbl_person晒夹、tbl_order
1)當(dāng)向machine1的db1的表tbl_person裆馒、tbl_order插入數(shù)數(shù)據(jù)時(shí),同時(shí)要把插入的數(shù)據(jù)同步到machine2丐怯、machine3喷好,這就是一致性
2)當(dāng)其中的一臺(tái)機(jī)器宕機(jī)了,可以繼續(xù)對(duì)外提供服務(wù)读跷,把宕機(jī)的機(jī)器重新啟動(dòng)起來(lái)可以繼續(xù)服務(wù)梗搅,這就是可用性
3)當(dāng)machine1的機(jī)器壞了,數(shù)據(jù)全部丟失了效览,不會(huì)有任何問(wèn)題无切,因?yàn)閙achine2和machine3上還有數(shù)據(jù),重新加一臺(tái)機(jī)器machine4丐枉,把machine2和machine3其中一臺(tái)機(jī)器的備份數(shù)據(jù)同步過(guò)來(lái)就可以了哆键,這就是分區(qū)容錯(cuò)性
4. BASE理論
基本可用(bascially available)、軟狀態(tài)(soft state)瘦锹、最終一致性(Eventually consistent)
基本可用:在分布式系統(tǒng)出現(xiàn)故障籍嘹,允許損失部分可用性(服務(wù)降級(jí)、頁(yè)面降級(jí))
軟狀態(tài):允許分布式系統(tǒng)出現(xiàn)中間狀態(tài)弯院。而且中間狀態(tài)不影響系統(tǒng)的可用性辱士。
1、這里的中間狀態(tài)是指不同的data replication之間的數(shù)據(jù)更新可以出現(xiàn)延時(shí)的最終一致性
2听绳、如CAP理論里面的示例颂碘,當(dāng)向machine1的db1的表tbl_person、tbl_order插入數(shù)數(shù)據(jù)時(shí)椅挣,同時(shí)要把插入的數(shù)據(jù)同步到machine2头岔、machine3塔拳,當(dāng)machine3的網(wǎng)絡(luò)有問(wèn)題時(shí),同步失敗峡竣,但是過(guò)一會(huì)網(wǎng)絡(luò)恢復(fù)了就同步成功了蝙斜,這個(gè)同步失敗的狀態(tài)就稱為軟狀態(tài),因?yàn)樽罱K還是同步成功了澎胡。
最終一致性:data replications經(jīng)過(guò)一段時(shí)間達(dá)到一致性孕荠。
5. Paxos算法
5.1 介紹Paxos算法之前我們先來(lái)看一個(gè)小故事
拜占庭將軍問(wèn)題
拜占庭帝國(guó)就是5~15世紀(jì)的東羅馬帝國(guó),拜占庭即現(xiàn)在土耳其的伊斯坦布爾攻谁。我們可以想象稚伍,拜占庭軍隊(duì)有許多分支,駐扎在敵人城外戚宦,每一分支由各自的將軍指揮个曙。假設(shè)有11位將軍,將軍們只能靠通訊員進(jìn)行通訊受楼。在觀察敵人以后垦搬,忠誠(chéng)的將軍們必須制訂一個(gè)統(tǒng)一的行動(dòng)計(jì)劃——進(jìn)攻或者撤退。然而艳汽,這些將軍里有叛徒猴贰,他們不希望忠誠(chéng)的將軍們能達(dá)成一致,因而影響統(tǒng)一行動(dòng)計(jì)劃的制訂與傳播河狐。
問(wèn)題是:將軍們必須有一個(gè)協(xié)議米绕,使所有忠誠(chéng)的將軍們能夠達(dá)成一致,而且少數(shù)幾個(gè)叛徒不能使忠誠(chéng)的將軍們作出錯(cuò)誤的計(jì)劃——使有些將軍進(jìn)攻而另一些將軍撤退馋艺。
假設(shè)有9位忠誠(chéng)的將軍栅干,5位判斷進(jìn)攻,4位判斷撤退捐祠,還有2個(gè)間諜惡意判斷撤退碱鳞,雖然結(jié)果是錯(cuò)誤的撤退,但這種情況完全是允許的踱蛀。因?yàn)檫@11位將軍依然保持著狀態(tài)一致性窿给。
總結(jié):
1)11位將軍進(jìn)攻城池
2)同時(shí)進(jìn)攻(議案、決議)星岗、同時(shí)撤退(議案填大、決議)
3)不管撤退還是進(jìn)攻戒洼,必須半數(shù)的將軍統(tǒng)一意見才可以執(zhí)行
4)將軍里面有叛徒俏橘,會(huì)干擾決議生成
5.2 下面就來(lái)介紹一下Paxos算法
Google Chubby的作者M(jìn)ike Burrows說(shuō)過(guò)這個(gè)世界上只有一種一致性算法,那就是Paxos圈浇,其它的算法都是殘次品寥掐。
Paxos:多數(shù)派決議(最終解決一致性問(wèn)題)
Paxos算法有三種角色:Proposer靴寂,Acceptor,Learner
Proposer:提交者(議案提交者)
提交議案(判斷是否過(guò)半)召耘,提交批準(zhǔn)議案(判斷是否過(guò)半)
Acceptor:接收者(議案接收者)
接受議案或者駁回議案百炬,給proposer回應(yīng)(promise)
Learner:學(xué)習(xí)者(打醬油的)
如果議案產(chǎn)生,學(xué)習(xí)議案污它。
設(shè)定1:如果Acceptor沒有接受議案剖踊,那么他必須接受第一個(gè)議案
設(shè)定2:每個(gè)議案必須有一個(gè)編號(hào),并且編號(hào)只能增長(zhǎng)衫贬,不能重復(fù)德澈。越往后越大。
設(shè)定3:接受編號(hào)大的議案固惯,如果小于之前接受議案編號(hào)梆造,那么不接受
設(shè)定4:議案有2種(提交的議案,批準(zhǔn)的議案)
1)Prepare階段(議案提交)
a)Proposer希望議案V葬毫。首先發(fā)出Prepare請(qǐng)求至大多數(shù)Acceptor镇辉。Prepare請(qǐng)求內(nèi)容為序列號(hào)K
b)Acceptor收到Prepare請(qǐng)求為編號(hào)K后,檢查自己手里是否有處理過(guò)Prepare請(qǐng)求贴捡。
c)如果Acceptor沒有接受過(guò)任何Prepare請(qǐng)求忽肛,那么用OK來(lái)回復(fù)Proposer,代表Acceptor必須接受收到的第一個(gè)議案(設(shè)定1)
d)否則烂斋,如果Acceptor之前接受過(guò)任何Prepare請(qǐng)求(如:MaxN)麻裁,那么比較議案編號(hào),如果K<MaxN源祈,則用reject或者error回復(fù)Proposer
e)如果K>=MaxN煎源,那么檢查之前是否有批準(zhǔn)的議案,如果沒有則用OK來(lái)回復(fù)Proposer香缺,并記錄K
f)如果K>=MaxN手销,那么檢查之前是否有批準(zhǔn)的議案,如果有則回復(fù)批準(zhǔn)的議案編號(hào)和議案內(nèi)容(如:<AcceptN, AcceptV>图张, AcceptN為批準(zhǔn)的議案編號(hào)锋拖,AcceptV為批準(zhǔn)的議案內(nèi)容)
2)Accept階段(批準(zhǔn)階段)
a)Proposer收到過(guò)半Acceptor發(fā)來(lái)的回復(fù),回復(fù)都是OK祸轮,且沒有附帶任何批準(zhǔn)過(guò)的議案編號(hào)和議案內(nèi)容兽埃。那么Proposer繼續(xù)提交批準(zhǔn)請(qǐng)求,不過(guò)此時(shí)會(huì)連議案編號(hào)K和議案內(nèi)容V一起提交(<K, V>這種數(shù)據(jù)形式)
b)Proposer收到過(guò)半Acceptor發(fā)來(lái)的回復(fù)适袜,回復(fù)都是OK柄错,且附帶批準(zhǔn)過(guò)的議案編號(hào)和議案內(nèi)容(<pok,議案編號(hào),議案內(nèi)容>)售貌。那么Proposer找到所有回復(fù)中超過(guò)半數(shù)的那個(gè)(假設(shè)為<pok给猾,AcceptNx,AcceptVx>)作為提交批準(zhǔn)請(qǐng)求(請(qǐng)求為<K颂跨,AcceptVx>)發(fā)送給Acceptor敢伸。
c)Proposer沒有收到過(guò)半Acceptor發(fā)來(lái)的回復(fù),則修改議案編號(hào)K為K+1恒削,并將編號(hào)重新發(fā)送給Acceptors(重復(fù)Prepare階段的過(guò)程)
d)Acceptor收到Proposer發(fā)來(lái)的Accept請(qǐng)求池颈,如果編號(hào)K<MaxN則不回應(yīng)或者reject。
e)Acceptor收到Proposer發(fā)來(lái)的Accept請(qǐng)求钓丰,如果編號(hào)K>=MaxN則批準(zhǔn)該議案饶辙,并設(shè)置手里批準(zhǔn)的議案為<K,接受議案的編號(hào)斑粱,接受議案的內(nèi)容>弃揽,回復(fù)Proposer。
f)經(jīng)過(guò)一段時(shí)間Proposer對(duì)比手里收到的Accept回復(fù)则北,如果超過(guò)半數(shù)矿微,則結(jié)束流程(代表議案被批準(zhǔn)),同時(shí)通知Leaner可以學(xué)習(xí)議案尚揣。
g) 經(jīng)過(guò)一段時(shí)間Proposer對(duì)比手里收到的Accept回復(fù)涌矢,如果未超過(guò)半數(shù),則修改議案編號(hào)重新進(jìn)入Prepare階段快骗。
5.3 Paxos示例
示例1:先后提議的場(chǎng)景
角色:
proposer:參謀1娜庇,參謀2
acceptor:將軍1,將軍2方篮,將軍3(決策者)
1)參謀1發(fā)起提議名秀,派通信兵帶信給3個(gè)將軍,內(nèi)容為(編號(hào)1)藕溅;
2)3個(gè)將軍收到參謀1的提議匕得,由于之前還沒有保存任何編號(hào),因此把(編號(hào)1)保存下來(lái)巾表,避免遺忘汁掠;同時(shí)讓通信兵帶信回去,內(nèi)容為(ok)集币;
3)參謀1收到至少2個(gè)將軍的回復(fù)考阱,再次派通信兵帶信給3個(gè)將軍,內(nèi)容為(編號(hào)1鞠苟,進(jìn)攻時(shí)間1)乞榨;
4)3個(gè)將軍收到參謀1的時(shí)間秽之,把(編號(hào)1,進(jìn)攻時(shí)間1)保存下來(lái)姜凄,避免遺忘;同時(shí)讓通信兵帶信回去趾访,內(nèi)容為(Accepted)态秧;
5)參謀1收到至少2個(gè)將軍的(Accepted)內(nèi)容,確認(rèn)進(jìn)攻時(shí)間已經(jīng)被大家接收扼鞋;
6)參謀2發(fā)起提議申鱼,派通信兵帶信給3個(gè)將軍,內(nèi)容為(編號(hào)2)云头;
7)3個(gè)將軍收到參謀2的提議捐友,由于(編號(hào)2)比(編號(hào)1)大,因此把(編號(hào)2)保存下來(lái)溃槐,避免遺忘匣砖;又由于之前已經(jīng)接受參謀1的提議,因此讓通信兵帶信回去昏滴,內(nèi)容為(編 號(hào)1猴鲫,進(jìn)攻時(shí)間1);
8)參謀2收到至少2個(gè)將軍的回復(fù)谣殊,由于回復(fù)中帶來(lái)了已接受的參謀1的提議內(nèi)容拂共,參謀2因此不再提出新的進(jìn)攻時(shí)間,接受參謀1提出的時(shí)間姻几;
示例2:交叉場(chǎng)景
角色:
proposer:參謀1宜狐,參謀2
acceptor:將軍1,將軍2蛇捌,將軍3(決策者)
1)參謀1發(fā)起提議抚恒,派通信兵帶信給3個(gè)將軍,內(nèi)容為(編號(hào)1)络拌;
2)3個(gè)將軍的情況如下
a)將軍1和將軍2收到參謀1的提議柑爸,將軍1和將軍2把(編號(hào)1)記錄下來(lái),如果有其他參謀提出更小的編號(hào)盒音,將被拒絕表鳍;同時(shí)讓通信兵帶信回去,內(nèi)容為(ok)祥诽;
b)負(fù)責(zé)通知將軍3的通信兵被抓譬圣,因此將軍3沒收到參謀1的提議;
3)參謀2在同一時(shí)間也發(fā)起了提議雄坪,派通信兵帶信給3個(gè)將軍厘熟,內(nèi)容為(編號(hào)2);
4)3個(gè)將軍的情況如下
a)將軍2和將軍3收到參謀2的提議,將軍2和將軍3把(編號(hào)2)記錄下來(lái)绳姨,如果有其他參謀提出更小的編號(hào)登澜,將被拒絕;同時(shí)讓通信兵帶信回去飘庄,內(nèi)容為(ok)脑蠕;
b)負(fù)責(zé)通知將軍1的通信兵被抓,因此將軍1沒收到參謀2的提議跪削;
5)參謀1收到至少2個(gè)將軍的回復(fù)谴仙,再次派通信兵帶信給有答復(fù)的2個(gè)將軍,內(nèi)容為(編號(hào)1碾盐,進(jìn)攻時(shí)間1)晃跺;
6)2個(gè)將軍的情況如下
a)將軍1收到了(編號(hào)1,進(jìn)攻時(shí)間1)毫玖,和自己保存的編號(hào)相同掀虎,因此把(編號(hào)1,進(jìn)攻時(shí)間1)保存下來(lái)付枫;同時(shí)讓通信兵帶信回去涩盾,內(nèi)容為(Accepted);
b)將軍2收到了(編號(hào)1励背,進(jìn)攻時(shí)間1)春霍,由于(編號(hào)1)小于已經(jīng)保存的(編號(hào)2),因此讓通信兵帶信回去叶眉,內(nèi)容為(Rejected址儒,編號(hào)2);
7)參謀2收到至少2個(gè)將軍的回復(fù)衅疙,再次派通信兵帶信給有答復(fù)的2個(gè)將軍莲趣,內(nèi)容為(編號(hào)2,進(jìn)攻時(shí)間2)饱溢;
8)將軍2和將軍3收到了(編號(hào)2喧伞,進(jìn)攻時(shí)間2),和自己保存的編號(hào)相同绩郎,因此把(編號(hào)2潘鲫,進(jìn)攻時(shí)間2)保存下來(lái),同時(shí)讓通信兵帶信回去肋杖,內(nèi)容為(Accepted)溉仑;
9)參謀2收到至少2個(gè)將軍的(Accepted)內(nèi)容,確認(rèn)進(jìn)攻時(shí)間已經(jīng)被多數(shù)派接受状植;
10)參謀1只收到了1個(gè)將軍的(Accepted)內(nèi)容浊竟,同時(shí)收到一個(gè)(Rejected怨喘,編號(hào)2);參謀1重新發(fā)起提議振定,派通信兵帶信給3個(gè)將軍必怜,內(nèi)容為(編號(hào)3);
11)3個(gè)將軍的情況如下
a)將軍1收到參謀1的提議后频,由于(編號(hào)3)大于之前保存的(編號(hào)1)梳庆,因此把(編號(hào)3)保存下來(lái);由于將軍1已經(jīng)接受參謀1前一次的提議徘郭,因此讓通信兵帶信回去靠益,內(nèi)容為(編號(hào)1丧肴,進(jìn)攻時(shí)間1)残揉;
b)將軍2收到參謀1的提議,由于(編號(hào)3)大于之前保存的(編號(hào)2)芋浮,因此把(編號(hào)3)保存下來(lái)抱环;由于將軍2已經(jīng)接受參謀2的提議,因此讓通信兵帶信回去纸巷,內(nèi)容為(編號(hào)2镇草,進(jìn)攻時(shí)間2);
c)負(fù)責(zé)通知將軍3的通信兵被抓瘤旨,因此將軍3沒收到參謀1的提議梯啤;
12)參謀1收到了至少2個(gè)將軍的回復(fù),比較兩個(gè)回復(fù)的編號(hào)大小存哲,選擇大編號(hào)對(duì)應(yīng)的進(jìn)攻時(shí)間作為最新的提議因宇;參謀1再次派通信兵帶信給有答復(fù)的2個(gè)將軍,內(nèi)容為(編號(hào)3祟偷,進(jìn)攻時(shí)間2)察滑;
13)將軍1和將軍2收到了(編號(hào)3,進(jìn)攻時(shí)間2)修肠,和自己保存的編號(hào)相同贺辰,因此保存(編號(hào)3,進(jìn)攻時(shí)間2)嵌施,同時(shí)讓通信兵帶信回去饲化,內(nèi)容為(Accepted);
14)參謀1收到了至少2個(gè)將軍的(accepted)內(nèi)容吗伤,確認(rèn)進(jìn)攻時(shí)間已經(jīng)被多數(shù)派接受滓侍。
四. Zookeeper ZAB協(xié)議
Zookeeper Automic Broadcast(ZAB),即Zookeeper原子性廣播牲芋,是Paxos經(jīng)典實(shí)現(xiàn)
術(shù)語(yǔ):
quorum:集群過(guò)半數(shù)的集合
1. ZAB(zookeeper)中節(jié)點(diǎn)分四種狀態(tài)
looking:選舉Leader的狀態(tài)(崩潰恢復(fù)狀態(tài)下)
following:跟隨者(follower)的狀態(tài)撩笆,服從Leader命令
leading:當(dāng)前節(jié)點(diǎn)是Leader捺球,負(fù)責(zé)協(xié)調(diào)工作。
observing:observer(觀察者)夕冲,不參與選舉氮兵,只讀節(jié)點(diǎn)。
2. ZAB中的兩個(gè)模式(ZK是如何進(jìn)行選舉的)
崩潰恢復(fù)歹鱼、消息廣播
1)崩潰恢復(fù)
leader掛了泣栈,需要選舉新的leader
a.每個(gè)server都有一張選票<myid,zxid>弥姻,如(3,9)南片,選票投自己。
b.每個(gè)server投完自己后庭敦,再分別投給其他還可用的服務(wù)器疼进。如把Server3的(3,9)分別投給Server4和Server5,一次類推
c.比較投票秧廉,比較邏輯:優(yōu)先比較Zxid伞广,Zxid相同時(shí)才比較myid。比較Zxid時(shí)疼电,大的做leader嚼锄;比較myid時(shí),小的做leader
d.改變服務(wù)器狀態(tài)(崩潰恢復(fù)->數(shù)據(jù)同步蔽豺,或者崩潰恢復(fù)->消息廣播)
相關(guān)概念補(bǔ)充說(shuō)明:
epoch周期值
acceptedEpoch(比喻:年號(hào)):follower已經(jīng)接受leader更改年號(hào)的(newepoch)提議区丑。
currentEpoch(比喻:當(dāng)前的年號(hào)):當(dāng)前的年號(hào)
lastZxid:history中最近接收到的提議zxid(最大的值)
history:當(dāng)前節(jié)點(diǎn)接受到事務(wù)提議的log
Zxid數(shù)據(jù)結(jié)構(gòu)說(shuō)明:
cZxid = 0x10000001b
64位的數(shù)據(jù)結(jié)構(gòu)
高32位:10000
Leader的周期編號(hào)+myid的組合
低32位:001b
事務(wù)的自增序列(單調(diào)遞增的序列)只要客戶端有請(qǐng)求,就+1
當(dāng)產(chǎn)生新Leader的時(shí)候修陡,就從這個(gè)Leader服務(wù)器上取出本地log中最大事務(wù)Zxid沧侥,從里面讀出epoch+1,作為一個(gè)新epoch濒析,并將低32位置0(保證id絕對(duì)自增)
2)消息廣播(類似2P提交)
a.Leader接受請(qǐng)求后正什,將這個(gè)請(qǐng)求賦予全局的唯一64位自增Id(zxid)。
b.將zxid作為議案發(fā)給所有follower号杏。
c.所有的follower接受到議案后婴氮,想將議案寫入硬盤后,馬上回復(fù)Leader一個(gè)ACK(OK)盾致。
d.當(dāng)Leader接受到合法數(shù)量(過(guò)半)Acks主经,Leader給所有follower發(fā)送commit命令。
e.follower執(zhí)行commit命令庭惜。
注意:到了這個(gè)階段罩驻,ZK集群才正式對(duì)外提供服務(wù),并且Leader可以進(jìn)行消息廣播护赊,如果有新節(jié)點(diǎn)加入惠遏,還需要進(jìn)行同步砾跃。
3)數(shù)據(jù)同步
a.取出Leader最大lastZxid(從本地log日志來(lái))
b.找到對(duì)應(yīng)zxid的數(shù)據(jù),進(jìn)行同步(數(shù)據(jù)同步過(guò)程保證所有follower一致)
c.只有滿足quorum同步完成节吮,準(zhǔn)Leader才能成為真正的Leader