一,分布式系統(tǒng)
1遣钳,簡(jiǎn)介。(what) 這是一個(gè)較為寬泛的概念,它的產(chǎn)生和出現(xiàn)是為了解決和應(yīng)對(duì)以往系統(tǒng)的問(wèn)題
百科: 分布式系統(tǒng)(distributed system)蕴茴,是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)劝评。正是由于軟件的特性,所以分布式系統(tǒng)具有內(nèi)聚性和透明性倦淀。
內(nèi)聚性: 系統(tǒng)內(nèi)的節(jié)點(diǎn)蒋畜、服務(wù)的目的、分工撞叽、規(guī)則明確姻成。
透明性: 分布式系統(tǒng)對(duì)外提供服務(wù),調(diào)用該系統(tǒng)的外部用戶不用考慮它是怎樣工作的愿棋,只要根據(jù)規(guī)則進(jìn)行使用就行科展,也不需要里面包含多少臺(tái)服務(wù)器,在什么地方
簡(jiǎn)單理解: 是一套互相連接共同對(duì)外提供服務(wù)的系統(tǒng)糠雨,系統(tǒng)內(nèi)部結(jié)點(diǎn)采用某種方式進(jìn)行通信才睹;常見(jiàn)的大的如大型電商系統(tǒng),小的如數(shù)據(jù)庫(kù)集群甘邀、緩存集群琅攘。
2,使用分布式系統(tǒng)原因松邪?(why)
* 分布式系統(tǒng)出現(xiàn)之前的單機(jī)系統(tǒng)坞琴,一旦服務(wù)器的操作系統(tǒng)、硬盤逗抑、網(wǎng)絡(luò)出現(xiàn)問(wèn)題就會(huì)導(dǎo)致服務(wù)的中斷剧辐,數(shù)據(jù)的丟失等問(wèn)題。
* 單機(jī)系統(tǒng)的性能再高锋八、存儲(chǔ)能力再擴(kuò)展浙于、也是有限的。而分布式系統(tǒng)可以以大量的服務(wù)器來(lái)分散帶寬挟纱、存儲(chǔ)羞酗、計(jì)算的壓力
* 由于跨遠(yuǎn)區(qū)域甚至跨國(guó)、網(wǎng)絡(luò)的延遲有時(shí)候是客觀的紊服,所以說(shuō)服務(wù)器集中在一個(gè)地方很難再較大的區(qū)域內(nèi)提供較好的服務(wù)和體驗(yàn)
3檀轨,分布式系統(tǒng)在實(shí)際操作環(huán)境之中的問(wèn)題;
由于分布式系統(tǒng)不完美的運(yùn)行環(huán)境欺嗤,所以有些問(wèn)題尚待解決参萄。例如,系統(tǒng)之間的每個(gè)節(jié)點(diǎn)都有可能出現(xiàn)單個(gè)節(jié)點(diǎn)出現(xiàn)故障突然間不工作了煎饼,節(jié)點(diǎn)間會(huì)有或大或小讹挎,忽大忽小的網(wǎng)絡(luò)延遲,節(jié)點(diǎn)間也有可能出現(xiàn)網(wǎng)絡(luò)中斷。從技術(shù)角度來(lái)看筒溃,可能出現(xiàn)的問(wèn)題基本上認(rèn)為是早晚會(huì)發(fā)生的马篮,說(shuō)到底,很多問(wèn)題就是成本和收益的平衡怜奖。因此浑测,一個(gè)分布式系統(tǒng)要想正常的對(duì)外提供服務(wù),它的設(shè)計(jì)本身就的考慮這些問(wèn)題的解決歪玲。在算法層面上迁央,分布式一致性算法就是為了輔助和解決這些問(wèn)題,確保系統(tǒng)盡可能的能夠正常的對(duì)外提供服務(wù)
二滥崩,分布式一致性算法
簡(jiǎn)介岖圈;
主要是從系統(tǒng)角度分析分布式系內(nèi)部節(jié)點(diǎn)本身及其節(jié)點(diǎn)之間出現(xiàn)問(wèn)題的解決,
例如夭委,一個(gè)系統(tǒng)之間包含5個(gè)節(jié)點(diǎn)幅狮,由于網(wǎng)絡(luò)問(wèn)題,其中3個(gè)節(jié)點(diǎn)與另外2個(gè)節(jié)點(diǎn)失去連接株灸,此刻系統(tǒng)如何處理崇摄?是否繼續(xù)提供服務(wù)支持?如果繼續(xù)提供服務(wù)支持慌烧,那么他們之間的數(shù)據(jù)就是不一致的逐抑,后面節(jié)點(diǎn)的網(wǎng)絡(luò)恢復(fù)后,怎么解決數(shù)據(jù)不一致問(wèn)題屹蚊?
其次厕氨,節(jié)點(diǎn)間的網(wǎng)絡(luò)延遲,磁盤讀寫汹粤,CPU處理能力都不盡相同命斧,那么保存到這個(gè)系統(tǒng)中的數(shù)據(jù)什么樣的情況下認(rèn)為保存成功?同時(shí)還要以一種高效的形式來(lái)實(shí)現(xiàn)嘱兼。
常見(jiàn)的分布式系統(tǒng)的一致性算法:
Paxos Raft ZAB
ZAB(zookeeper atomic Broadcast):
主要以下特點(diǎn):
* 把節(jié)點(diǎn)分為兩種:主節(jié)點(diǎn)(leader)和從節(jié)點(diǎn)(follower)
* 有一個(gè)主節(jié)點(diǎn)国葬,所有的寫操作(這里的寫操作可以認(rèn)為是新增和修改)都在主節(jié)之上,如果有一個(gè)從節(jié)點(diǎn)收到寫操作請(qǐng)求芹壕,也會(huì)轉(zhuǎn)移到主節(jié)點(diǎn)處理汇四。
* 其他節(jié)點(diǎn)都是從節(jié)點(diǎn),可以通過(guò)從節(jié)點(diǎn)進(jìn)行讀操作
* 主節(jié)點(diǎn)通過(guò)選舉所得踢涌,主節(jié)點(diǎn)失蹤后通孽,其余從節(jié)點(diǎn)自動(dòng)選取新的主節(jié)點(diǎn)
寫操作具體實(shí)施:
常規(guī)寫流程如下:
1. 客戶向主節(jié)點(diǎn)請(qǐng)求寫數(shù)據(jù)X
2. 主節(jié)點(diǎn)為該條數(shù)據(jù)X生成唯一的遞增id,叫ZXID X(id)
3. 主節(jié)點(diǎn)把X(id)發(fā)送給所有從節(jié)點(diǎn)睁壁,跟他們確認(rèn)能不能正常的將數(shù)據(jù)記錄下來(lái)背苦,這個(gè)操作叫做Propose提議
4. 超過(guò)一半的從節(jié)點(diǎn)向主節(jié)點(diǎn)回復(fù)沒(méi)有問(wèn)題互捌,這個(gè)操作叫做ACK應(yīng)答
5. 主節(jié)點(diǎn)收到一半以上從節(jié)點(diǎn)肯定回答后,給所有從節(jié)點(diǎn)發(fā)送確認(rèn)提交請(qǐng)求行剂,即表示你們可以將這條數(shù)據(jù)保存下來(lái)了疫剃,同時(shí)自己也正式保存這條數(shù)據(jù),這個(gè)過(guò)程叫做commit
節(jié)點(diǎn)掛掉的各個(gè)情況:
1. 少部分節(jié)點(diǎn)掛掉沒(méi)有任何影響
2. 一半節(jié)點(diǎn)掛掉硼讽,系統(tǒng)不能提供服務(wù);一般這種情況的概率較小
3. 少部分節(jié)點(diǎn)掛掉牲阁、一段時(shí)間后又恢復(fù)了之后:
* 先通過(guò)主節(jié)點(diǎn)同步最新的數(shù)據(jù)固阁;因?yàn)樽约簰斓粢欢螘r(shí)間后,很有可能沒(méi)有最新的數(shù)據(jù)城菊。
* 數(shù)據(jù)同步之后正式成為子節(jié)點(diǎn)開(kāi)始工作备燃。
同理:新添加的子節(jié)點(diǎn)到現(xiàn)有的集群也是這個(gè)模式
4. 在主節(jié)點(diǎn)掛掉期間,系統(tǒng)暫時(shí)不對(duì)外提供服務(wù)凌唬,開(kāi)始新的節(jié)點(diǎn)選舉
ZAB節(jié)點(diǎn)選舉機(jī)制:發(fā)消息到每一個(gè)自己能連得上的節(jié)點(diǎn):包含自己的節(jié)點(diǎn)編號(hào)myid和保存數(shù)據(jù)的最大ZXID
選舉規(guī)則:
* 誰(shuí)的ZXID最大并齐,誰(shuí)就是主節(jié)點(diǎn)。why客税?因?yàn)檫@表示他的數(shù)據(jù)最新况褪。盡量保證數(shù)據(jù)的一直性。
* ZXID一樣時(shí)更耻,誰(shuí)的myid最大测垛,誰(shuí)就是新的主節(jié)點(diǎn)。
* 每個(gè)節(jié)點(diǎn)收到其他節(jié)點(diǎn)的數(shù)據(jù)后秧均,與自己的數(shù)據(jù)進(jìn)行判斷食侮,如果對(duì)方的比自己大,那就認(rèn)同對(duì)方為主節(jié)點(diǎn)
* 得到一半以上(注意目胡;這里又是一半以上)節(jié)點(diǎn)認(rèn)同的候選節(jié)點(diǎn)成為新的主節(jié)點(diǎn)
====》最后 新的主節(jié)點(diǎn)選取出來(lái)以后锯七,進(jìn)入集群成為數(shù)據(jù)同步節(jié)點(diǎn),先檢查節(jié)點(diǎn)內(nèi)部那些數(shù)據(jù)比自己舊誉己,然后將數(shù)據(jù)同步過(guò)去眉尸。然后對(duì)外提供服務(wù)
Raft算法:
Raft算法與ZAB算法類似,也分為主節(jié)點(diǎn)和從節(jié)點(diǎn)巫延;區(qū)別在于主節(jié)點(diǎn)選取機(jī)制上有所不同效五。
Raft選舉機(jī)制:
1. 發(fā)現(xiàn)主節(jié)點(diǎn)失蹤一段時(shí)間之后,所有從節(jié)點(diǎn)向其他從節(jié)點(diǎn)發(fā)送消息炉峰,讓他們選取自己為新的主節(jié)點(diǎn)畏妖。
2. 還沒(méi)有參加選舉的從節(jié)點(diǎn)如果收到其他節(jié)點(diǎn)的選舉請(qǐng)求,就選取自己收取到的第一個(gè)節(jié)點(diǎn)疼阔,后面在有誰(shuí)請(qǐng)求自己支持選取戒劫,就告知自己已經(jīng)支持另一個(gè)節(jié)點(diǎn)了半夷。
3. 如果一個(gè)節(jié)點(diǎn)發(fā)現(xiàn)另一個(gè)節(jié)點(diǎn)的支持率比自己高迅细,那么自己就無(wú)條件的支持另一個(gè)節(jié)點(diǎn)巫橄,并同時(shí)讓自己的簇?fù)硪仓С至硪粋€(gè)節(jié)點(diǎn)。
4. 如果一輪選舉沒(méi)有選取出新的主節(jié)點(diǎn)茵典,那么就開(kāi)始下一輪選舉湘换,知道一個(gè)節(jié)點(diǎn)得到大多數(shù)的擁簇。
備注:
關(guān)于ZXID說(shuō)明:主節(jié)點(diǎn)上沒(méi)提交的數(shù)據(jù)在從節(jié)點(diǎn)上也算做未提交统阿,因此沒(méi)提交的數(shù)據(jù)的ZXID不算數(shù)彩倚。
關(guān)于選舉說(shuō)明:選舉一定是在主節(jié)點(diǎn)掛掉之后才進(jìn)行的。分布式一致性算法可以再保證部分節(jié)點(diǎn)掛掉的情況下扶平,數(shù)據(jù)的一致性帆离;但是在大部分節(jié)點(diǎn)同時(shí)掛掉的情況下不保證。如果超過(guò)半數(shù)節(jié)點(diǎn)同時(shí)掛掉结澄,那么該系統(tǒng)則不對(duì)再外提供服務(wù)哥谷。
當(dāng)然,在寫數(shù)據(jù)時(shí)麻献,強(qiáng)制確認(rèn)所有節(jié)點(diǎn)都寫入了新數(shù)據(jù)會(huì)更安全和一致们妥,但是系統(tǒng)的可用性和性能就大大降低了;
譬如一個(gè)節(jié)點(diǎn)掛掉勉吻,那么整個(gè)系統(tǒng)就不能夠正常的工作了王悍。
Q&A
Q:為什么要保證一半以上的從節(jié)點(diǎn)回復(fù)?
A為了保證數(shù)據(jù)的一致性
Q:如果他們網(wǎng)絡(luò)恢復(fù)之后餐曼,正常節(jié)點(diǎn)與非正常節(jié)點(diǎn)(多數(shù)節(jié)點(diǎn)與少數(shù)節(jié)點(diǎn)間)數(shù)據(jù)已誰(shuí)為準(zhǔn)压储?
A:分布式一致性算法采用大多數(shù)認(rèn)同的方式
Q:判定主節(jié)點(diǎn)已死的依據(jù)是什么?因?yàn)橥ㄟ^(guò)節(jié)點(diǎn)選舉的機(jī)制源譬,那么主節(jié)點(diǎn)的壓力比較大集惋。
A:通過(guò)心跳檢測(cè)來(lái)判斷;針對(duì)心跳偵聽(tīng)時(shí)間的配置較為嚴(yán)苛踩娘,間隔太大容易響應(yīng)慢刮刑,間隔太小容易出現(xiàn)假死。所以針對(duì)這種情況分兩方面考慮:1养渴,針對(duì)外部系統(tǒng)通過(guò)緩存雷绢、延遲調(diào)用等方式解決;2理卑,對(duì)內(nèi)在運(yùn)維上需要對(duì)于服務(wù)器做自動(dòng)化監(jiān)控預(yù)警告警方面的處理翘紊。