jbpaxos跨機(jī)房配置中心
paxos是什么?
一致性算法,google稱(chēng)其為唯一的一致性算法,其他的算法都是paxos的簡(jiǎn)化。
我們知道一般數(shù)據(jù)庫(kù)的主從同步,實(shí)際上在極端情況下,依然會(huì)產(chǎn)生不一致的現(xiàn)象,這就造成了master的損壞,需要手動(dòng)的切換備機(jī),而在paxos中,由于一致性算法,我們可
以做到自動(dòng)的進(jìn)行master的切換,而不會(huì)產(chǎn)生不一致的現(xiàn)象,當(dāng)然這個(gè)要在一個(gè)大前提下,就是n臺(tái)機(jī)器,僅有小于 n/2的機(jī)器損壞,但這樣依然提供了我們一種更高的容災(zāi)標(biāo)準(zhǔn)。
jbpaxos是什么?
jbpaxos = java basic paxos , java語(yǔ)言實(shí)現(xiàn)的paxos編程框架,提供高可用,強(qiáng)一致,基于paxos構(gòu)建分布式程序的框架。
適用的場(chǎng)景?
對(duì)于一般的應(yīng)用而言,沒(méi)有數(shù)據(jù)的保存,僅僅是提供服務(wù),那么我們可以說(shuō)這些server對(duì)于數(shù)據(jù)而言是無(wú)狀態(tài)的,比如說(shuō),我們多數(shù)的java web應(yīng)用,這些應(yīng)用所需要的數(shù)據(jù),
要么在緩存里,要么在 db里,那這些server僅僅需要提供一個(gè)更穩(wěn)定的負(fù)載器來(lái)進(jìn)行故障轉(zhuǎn)移即可了,實(shí)際上整套系統(tǒng)的一致性和容災(zāi)全部交由另外的系統(tǒng)來(lái)解決(db,緩存,
穩(wěn)定的負(fù)載均衡),這些server 是不適用paxos算法的。
對(duì)于另外一些應(yīng)用,我們需要自己維護(hù)數(shù)據(jù)副本,不依賴(lài)于第3方服務(wù)的,比較適合paxos,自動(dòng)選主,主故障時(shí),15s恢復(fù)期,可提供強(qiáng)一致性,誘人的特性,但這些特性,也
不是沒(méi)有代價(jià),更高的網(wǎng)絡(luò)負(fù)載,更高的寫(xiě)入延時(shí),如果你能忍受這些,那么請(qǐng)選擇paxos吧。
構(gòu)建高可用的分布式程序,不是有zookeeper嗎?
zookeeper提供了類(lèi)似chubby的功能,可以說(shuō)zookeeper提供的是一種服務(wù),jbpaxos提供的是更底層的算法實(shí)現(xiàn),基于接口的編程,就可以實(shí)現(xiàn)類(lèi)似與zookeeper的功能
通過(guò)jbpaxos,可以自由的實(shí)現(xiàn)副本間的同步,zookeeper提供服務(wù)的形式,是無(wú)法提供副本間同步的功能,副本間同步的功能,請(qǐng)參見(jiàn)下面的demo,實(shí)際上,每個(gè)config server 就是一份副本
jbpaxos 0.0.1beta提供了什么?
一個(gè)classic paxos的實(shí)現(xiàn),應(yīng)對(duì)磁盤(pán)損壞,主機(jī)宕機(jī),可以做到15s恢復(fù),提供了paxos的底層實(shí)現(xiàn),提供了網(wǎng)絡(luò)層的接口,二次開(kāi)發(fā)不需要考慮網(wǎng)絡(luò)層上的開(kāi)發(fā),基于此項(xiàng)目的二次開(kāi)發(fā),可以實(shí)現(xiàn)高可用的配置中心,分布式鎖,基于paxos的副本同步機(jī)制等等。
根據(jù)網(wǎng)絡(luò)情況,和設(shè)定的最大 rt 容忍時(shí)間,自動(dòng)運(yùn)行時(shí)調(diào)整封包大小,最大化網(wǎng)絡(luò)利用率。
0.0.1beta暫時(shí)沒(méi)有提供fellower的實(shí)現(xiàn),僅僅有senator的實(shí)現(xiàn)
jbpaxos 0.0.1beta中的概念
senators,用于寫(xiě)入時(shí)投票的節(jié)點(diǎn),fellowers(下個(gè)版本實(shí)現(xiàn),對(duì)于配置中心類(lèi)似的多讀少寫(xiě)的應(yīng)用比較有用),僅僅學(xué)習(xí)的節(jié)點(diǎn),不參與投票過(guò)程
master , 從senators中選舉出的法官,它來(lái)發(fā)起一項(xiàng)法案的投票
jbpaxos 的基本性能
3個(gè)節(jié)點(diǎn)時(shí),寫(xiě)入大小128bytes, 單線(xiàn)程單tcp連接非阻塞同步寫(xiě)入3w+ tps , 1000線(xiàn)程單tcp連接阻塞同步寫(xiě)入2.5w+ , 3線(xiàn)程3個(gè) tcp連接非阻塞同步寫(xiě)入4w+ ,單線(xiàn)程同步寫(xiě)入200tps
寫(xiě)入大小512bytes ,3線(xiàn)程3個(gè) tcp連接非阻塞同步寫(xiě)入3w+
寫(xiě)入大小1024bytes,3線(xiàn)程3個(gè) tcp連接非阻塞同步寫(xiě)入1.6w+
512及1024bytes的時(shí)候,基本上將千兆網(wǎng)卡頂滿(mǎn)了
如果說(shuō)節(jié)點(diǎn)上升到5個(gè)的時(shí)候,吞吐會(huì)下降,寫(xiě)入的大小影響系統(tǒng)性能非常多,所以建議在開(kāi)發(fā)的時(shí)候?qū)懭霐?shù)據(jù)需要經(jīng)過(guò)壓縮,建議使用snappy或lzo這種高吞吐的壓縮算法
讀取性能,要看二次開(kāi)發(fā)的實(shí)現(xiàn)如何,及服務(wù)端口,是否和內(nèi)部系統(tǒng)端口,走同一塊網(wǎng)卡
當(dāng)前的總體架構(gòu)圖
\
架構(gòu)解說(shuō):5個(gè)config server 為互備節(jié)點(diǎn),當(dāng)2個(gè)節(jié)點(diǎn)(包含2個(gè))以下?lián)p壞,不會(huì)影響服務(wù),client連接上任一節(jié)點(diǎn)即可,對(duì)于跨機(jī)房部署,要優(yōu)先連接最近的節(jié)點(diǎn)
后續(xù)架構(gòu):jbpaxos下個(gè)版本,預(yù)計(jì)支持fellower,當(dāng)下個(gè)版本發(fā)布后,config server不做代碼修改,即可將架構(gòu)變?yōu)橄聢D:
后續(xù)架構(gòu)解說(shuō):相比兩種架構(gòu)區(qū)別,后一種,在擴(kuò)展更高連接量時(shí),有非常大的優(yōu)勢(shì),fellower的數(shù)量決定了可以支撐的client 的數(shù)量,但對(duì)寫(xiě)入沒(méi)有幫助,反而會(huì)加大寫(xiě)入的延時(shí),適合于像配置中心這類(lèi)多監(jiān)視變化,少修改的類(lèi)型
程序架構(gòu)圖: 紅框的部分,是我們需要做的
