盡管Git Ketch項(xiàng)目開發(fā)才剛剛開始,谷歌公司已經(jīng)對(duì)外宣布了他們的第一個(gè)Git項(xiàng)目——Git Ketch,一個(gè)多主機(jī)Git管理系統(tǒng),能夠通過(guò)訪問(wèn)多個(gè)Git服務(wù)器來(lái)復(fù)制信息,以確保復(fù)制信息的復(fù)原性和可擴(kuò)展性。所做的這些改變都是基于原有用Java搭建的名為JGit的Git服務(wù)器基礎(chǔ)之上的,雖然這里面的其它Git服務(wù)器可能是多主機(jī)群集的一部分。
最初設(shè)計(jì)Git的目的是將Git打造成一個(gè)分布式源代碼管理庫(kù)系統(tǒng),但是大多數(shù)組織都采用了一個(gè)集中式的方式:采用一個(gè)帶有“黃金副本”代碼的主庫(kù),所有開發(fā)者會(huì)在這個(gè)主庫(kù)上做修改,然后以最終版本作為更新基礎(chǔ);盡管所有改動(dòng)能從開發(fā)者的私庫(kù)里直接調(diào)取,但很少有這么做的。
只不過(guò)這種集中式方法也會(huì)導(dǎo)致單點(diǎn)故障。不過(guò)別擔(dān)心,JGit提供了部分解決方案,那就是通過(guò)它的分布式文件系統(tǒng)(DFS)的存儲(chǔ)選項(xiàng)。此選項(xiàng)僅能解決部分問(wèn)題,因?yàn)镴Git只定義了一組抽象類,而這組抽象類又定義了DFS存儲(chǔ)協(xié)議,但支持?jǐn)?shù)據(jù)復(fù)制和創(chuàng)建抽象類實(shí)現(xiàn)的整體架構(gòu)則是由用戶自己設(shè)計(jì)的。這就意味著組織已投入相當(dāng)大的資源——為實(shí)現(xiàn)JGit DFS,項(xiàng)目組暫時(shí)還不能將JGit DFS大范圍推廣使用,谷歌是少有的幾個(gè)掌握DFS實(shí)現(xiàn)的組織之一。
Ketch所遵循的策略有些與眾不同,不僅僅可以定義一個(gè)能夠復(fù)制DFS數(shù)據(jù)的Git服務(wù)器,Ketch還可以假定現(xiàn)存的多個(gè)普通Git服務(wù)器可以互相之間數(shù)據(jù)和狀態(tài)同步,因此被稱為“多主機(jī)”。在任何一個(gè)制定的節(jié)點(diǎn)上,這些服務(wù)器都可以當(dāng)作“主機(jī)”來(lái)使用,其余的服務(wù)器當(dāng)作“從機(jī)”來(lái)利用。任何時(shí)候向任何一臺(tái)服務(wù)器發(fā)送請(qǐng)求,這個(gè)“請(qǐng)求”都會(huì)被轉(zhuǎn)發(fā)給“主機(jī)”,該“主機(jī)”將會(huì)向所有其他服務(wù)器發(fā)送推送請(qǐng)求,一旦絕大多數(shù)“從機(jī)”服務(wù)器已經(jīng)確認(rèn)推送請(qǐng)求成功,“主機(jī)”會(huì)向初始呼叫對(duì)象確認(rèn)操作已成功。這一機(jī)制是基于Raft算法,此算法能夠確保至少大多數(shù)服務(wù)器能夠接收已經(jīng)做了變更的請(qǐng)求;任何服務(wù)器上的數(shù)據(jù)丟失,都可以通過(guò)其它服務(wù)器同步過(guò)來(lái)。目前,只有JGit服務(wù)器可以充當(dāng)“主機(jī)”,雖然在多主機(jī)集群里任何Git服務(wù)器實(shí)現(xiàn)的原子推送都可以充當(dāng)一個(gè)參與服務(wù)器。
這些已經(jīng)提出來(lái)的改變均可以在JGit內(nèi)部Gerrit里看到,關(guān)于未來(lái)在工具上的改進(jìn)細(xì)節(jié)及進(jìn)展都可以從JGit的電子郵件分發(fā)列表里獲得。
查看英文原文:Google Kick-Starts Git Ketch: A Fault-Tolerant Git Management System