打造支撑百万用户的分布式代码托管平台
在2017在線技術(shù)峰會——首屆阿里巴巴研發(fā)效能嘉年華上,來自研發(fā)效能事業(yè)部的楊再新分享了《打造支撐百萬用戶的分布式代碼托管平臺》。他主要介紹了GIT和SVN思想差異、開源的代碼托管平臺的挑戰(zhàn)、云代碼托管平臺的架構(gòu)設(shè)計(jì)以及云代碼托管后續(xù)發(fā)展。其中,他主要分享了云代碼托管平臺的設(shè)計(jì)思路,穩(wěn)定性、安全性的構(gòu)建。
?
以下內(nèi)容根據(jù)直播視頻整理而成。
直播視頻:https://yq.aliyun.com/edu/lesson/548
PDF下載:https://yq.aliyun.com/attachment/download/?id=1839
?
GIT和SVN思想差異
GIT和SVN是目前主流的代碼托管工具,阿里巴巴目前的代碼托管80%在GIT上,經(jīng)歷了從CBS到SVN到現(xiàn)在幾乎全部應(yīng)用轉(zhuǎn)為GIT,其中,GIT和SVN的思想差異主要在以下幾個(gè)方面:
- GIT是分布式管理工具,是去中心卻集中,所有服務(wù)可以有中心存在但是又可以去中心;
- 直接記錄快照,而非差異;
- 不一樣的分支概念,GIT分支是指向hash的指針而不是一個(gè)拷貝;
- 三個(gè)工作區(qū),三個(gè)文件狀態(tài),SVN只有一個(gè)本地worker和服務(wù)器worker,這兩個(gè)worker是不一樣的,而GIT有一個(gè)本地暫存的workspace、存到本地的GIT庫、存到遠(yuǎn)端三種文件狀態(tài)。好處是,GIT本地的代碼是全庫的。
去中心卻集中
圖中origin是中央倉庫,周邊代表四個(gè)團(tuán)隊(duì),他們可以從中心獲取代碼,又相互之間獨(dú)立。
數(shù)據(jù)完整性check
在保存到GIT之前,所有數(shù)據(jù)都要進(jìn)行內(nèi)容的校驗(yàn)和計(jì)算,并將此結(jié)果作為數(shù)據(jù)的唯一標(biāo)識和索引。所以如果文件在傳輸時(shí)變得不完整,或者磁盤損壞導(dǎo)致文件數(shù)據(jù)缺失,GIT都能立即察覺。GIT使用SHA-1算法計(jì)算數(shù)據(jù)的校驗(yàn)和,通過對文件的內(nèi)容或目錄的結(jié)構(gòu)計(jì)算出一個(gè)SHA-1哈希值,作為指紋字符串。所有保存在GIT數(shù)據(jù)庫中東西都是用此哈希值來作索引的,而不是靠文件名。
SVN怎么遷移GIT
(1)使用GIT SVN工具
- Git svn clone http://code.taobao.org/svn/xxx/
- Git remote add origin git@code.aliyun.com:xxx/xxx.git
- Git push origin –all
(2)https://yq.aliyun.com/articles/6046 圖文教學(xué)文檔
開源的代碼托管平臺的挑戰(zhàn)
阿里巴巴是在2011年開始轉(zhuǎn)用GIT的,剛開始時(shí)調(diào)用了許多開源代碼平臺。
Gitlab CE架構(gòu)
Gitlab自我管理倉庫的功能非常強(qiáng)大,可以很大的解放效率,可以自己創(chuàng)建代碼庫、分配權(quán)限。Gitlab CE技術(shù)棧前端是由nginx提供http服務(wù),open-ssh全局加密,性能更好,ruby上手非常快,提供API功能方面比較強(qiáng)悍。Git非常依賴于文件體系,所以有專門的文件系統(tǒng),數(shù)據(jù)庫選擇MySQL redis存儲緩存。此外還有一個(gè)簡單的消息系統(tǒng)用來處理異步消息。
遇到的挑戰(zhàn)
- 可用性:數(shù)據(jù)量比較小的時(shí)候是單機(jī),機(jī)器宕機(jī)之后穩(wěn)定性無法保證,物理擴(kuò)容比較困難,宕機(jī)之后的容災(zāi)也是問題。
- 可靠性:數(shù)據(jù)安全方面,如果磁盤數(shù)據(jù)壞了之后數(shù)據(jù)的恢復(fù)也是非常大的挑戰(zhàn)。
- 高并發(fā)的效率:阿里巴巴在研發(fā)的投入是非常大的,各種各樣的研發(fā)工具非常依賴于托管底層的平臺,底層平臺的數(shù)據(jù)調(diào)用量是非常大的,整個(gè)RDC調(diào)用數(shù)據(jù)的量非常大。
- 用戶規(guī)模。
云代碼托管平臺的架構(gòu)設(shè)計(jì)
設(shè)計(jì)思路
首先,穩(wěn)定性優(yōu)于體驗(yàn),體驗(yàn)優(yōu)于成本,運(yùn)維導(dǎo)向是面向failover。重監(jiān)控,態(tài)勢感知,可回溯;重管控,突破規(guī)模制約,代碼量非常大,管控措施很重要。
上圖是機(jī)房內(nèi)的架構(gòu),有兩個(gè)proxy,分為了http協(xié)議、SSHD協(xié)議。http協(xié)議根據(jù)http body信息來進(jìn)行路由轉(zhuǎn)發(fā)。SSHD協(xié)議解析了所有命令行的信息,包括想獲取哪個(gè)代碼庫的數(shù)據(jù)下載,每個(gè)集群有多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有三臺以上的機(jī)器,機(jī)器有不同角色master、mirror、backup。實(shí)際中,讀寫比例比較懸殊,大約為20:1,所以進(jìn)行讀寫分離提高效率。backup的作用是,如果master掛掉的話,監(jiān)控上會有感應(yīng),此時(shí)會將backup切換成master。Sharding記錄節(jié)點(diǎn)機(jī)器的狀態(tài)以及namespace和node節(jié)點(diǎn)之間的對應(yīng)關(guān)系,這樣遷移的時(shí)候只需要先將數(shù)據(jù)遷移,那么里面的狀態(tài)就會無縫遷移。
構(gòu)建穩(wěn)定性
對于單機(jī)房,采用主/備切換,根據(jù)監(jiān)控指標(biāo)自動切換。用VIP、DNS來切的話,時(shí)效性會比較慢。同城災(zāi)備,如果整個(gè)機(jī)房宕機(jī),那么直接切換DNS。異地災(zāi)備策略上和同城災(zāi)備是一樣的。
上圖展示了兩個(gè)機(jī)房之間的數(shù)據(jù)同步,MNS是阿里云的消息服務(wù),機(jī)房中任何數(shù)據(jù)變更時(shí)會向MNS發(fā)送消息,消息類型比較多,比如倉庫的生命周期,訂閱消息通過system hook下發(fā)存入MNS里面。在容災(zāi)機(jī)房里面有消息消費(fèi),消息消費(fèi)之后會調(diào)用RPC服務(wù),把一些庫創(chuàng)建出來。通過異步消息來做,在時(shí)效性上有點(diǎn)差,但是可以忍受,但最終數(shù)據(jù)是一致的。
引入了新的技術(shù)棧。以前采用Ruby+MySQL來做,現(xiàn)在采用Golang,性能好,易部署。此外,使用Grpc,其基于http2,是谷歌新開發(fā)出來的工具,支持服務(wù)端和服務(wù)端之間的加密,易擴(kuò)展,跨語言。使用阿里云的自研消息系統(tǒng)MNS,支持主題/訂閱。這樣做解決了穩(wěn)定性,從單機(jī)宕機(jī)到機(jī)房宕機(jī),再到同城宕機(jī)都有一定的解決方案。
安全性
數(shù)據(jù)安全方面采用多重備份,異地災(zāi)備。流量控制根據(jù)IP做流控,此外還會做namespace流控,因?yàn)橛行炖锩鎛amespace比較多,namespace宕機(jī)之后會導(dǎo)致節(jié)點(diǎn)的數(shù)據(jù)量變大,影響整個(gè)節(jié)點(diǎn)的穩(wěn)定性,所以需要對namespace做多維度的流量控制。
具體的技術(shù)細(xì)節(jié)是:使用golang的sshd服務(wù)替換原生的open-sshd,解決ruby中g(shù)itlab-shell啟動慢,并且解決authorized_keys的文件變大后,性能下降的問題;用更多的redis來解決webhooks的性能,大量外部系統(tǒng)依賴webhook,確保穩(wěn)定性,解決webhook的時(shí)效性。
大容量支持
大容量上很好的支撐是提供5GB以上的下載流量,整個(gè)數(shù)據(jù)存儲在100T以上,用戶數(shù)可以支撐100w級別,倉庫數(shù)也可以支撐100w級別。
平臺能力
每天支撐阿里百萬級別的GIT的操作,覆蓋著阿里全部BU,對外能力輸出阿里云code。阿里云code平臺是2016年上線的,內(nèi)部體系包括阿里云自己的內(nèi)部體系以及基于阿里云的其他體系,其他能力一致。
云代碼托管后續(xù)發(fā)展
從技術(shù)來說,目前存儲和計(jì)算的分離做的不夠好,node節(jié)點(diǎn)上的數(shù)據(jù)有大量的計(jì)算。分離的好處是選用不同的硬件設(shè)備來做更好的容量規(guī)劃。未來希望更好的支持容器化,拆分更多微服務(wù),對各種邏輯進(jìn)行歸類。
功能方面,正在打造更好的代碼review平臺。由于本地環(huán)境特殊復(fù)雜,一些工程在本地不是很好搭建,在線IDE使得所有環(huán)境都是固態(tài)化,減輕開發(fā)的負(fù)擔(dān)。繼續(xù)加強(qiáng)webhook,做到性能更加優(yōu)化。總結(jié)
以上是生活随笔為你收集整理的打造支撑百万用户的分布式代码托管平台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB trouble shoo
- 下一篇: 台积电获苹果A10大量订单 三季度销售额