閱讀552 返回首頁    go 阿裏雲 go 技術社區[雲棲]


打造支撐百萬用戶的分布式代碼托管平台

在2017在線技術峰會——首屆阿裏巴巴研發效能嘉年華上,來自研發效能事業部的楊再新分享了《打造支撐百萬用戶的分布式代碼托管平台》。他主要介紹了GIT和SVN思想差異、開源的代碼托管平台的挑戰、雲代碼托管平台的架構設計以及雲代碼托管後續發展。其中,他主要分享了雲代碼托管平台的設計思路,穩定性、安全性的構建。

 

以下內容根據直播視頻整理而成。

直播視頻:https://yq.aliyun.com/edu/lesson/548

PDF下載:https://yq.aliyun.com/attachment/download/?id=1839

 

GIT和SVN思想差異

GIT和SVN是目前主流的代碼托管工具,阿裏巴巴目前的代碼托管80%在GIT上,經曆了從CBS到SVN到現在幾乎全部應用轉為GIT,其中,GIT和SVN的思想差異主要在以下幾個方麵:

  • GIT是分布式管理工具,是去中心卻集中,所有服務可以有中心存在但是又可以去中心;
  • 直接記錄快照,而非差異;
  • 不一樣的分支概念,GIT分支是指向hash的指針而不是一個拷貝;
  • 三個工作區,三個文件狀態,SVN隻有一個本地worker和服務器worker,這兩個worker是不一樣的,而GIT有一個本地暫存的workspace、存到本地的GIT庫、存到遠端三種文件狀態。好處是,GIT本地的代碼是全庫的。

去中心卻集中

74b710a01bbe4cba7536c604628c2d7becdd03b5

圖中origin是中央倉庫,周邊代表四個團隊,他們可以從中心獲取代碼,又相互之間獨立。

數據完整性check

在保存到GIT之前,所有數據都要進行內容的校驗和計算,並將此結果作為數據的唯一標識和索引。所以如果文件在傳輸時變得不完整,或者磁盤損壞導致文件數據缺失,GIT都能立即察覺。GIT使用SHA-1算法計算數據的校驗和,通過對文件的內容或目錄的結構計算出一個SHA-1哈希值,作為指紋字符串。所有保存在GIT數據庫中東西都是用此哈希值來作索引的,而不是靠文件名。

SVN怎麼遷移GIT

(1)使用GIT SVN工具

(2)https://yq.aliyun.com/articles/6046 圖文教學文檔

開源的代碼托管平台的挑戰

阿裏巴巴是在2011年開始轉用GIT的,剛開始時調用了許多開源代碼平台。

Gitlab CE架構

458684e5930bc977f89e27b61e3a38432961f568

Gitlab自我管理倉庫的功能非常強大,可以很大的解放效率,可以自己創建代碼庫、分配權限。Gitlab CE技術棧前端是由nginx提供http服務,open-ssh全局加密,性能更好,ruby上手非常快,提供API功能方麵比較強悍。Git非常依賴於文件體係,所以有專門的文件係統,數據庫選擇MySQL redis存儲緩存。此外還有一個簡單的消息係統用來處理異步消息。

遇到的挑戰

  • 可用性:數據量比較小的時候是單機,機器宕機之後穩定性無法保證,物理擴容比較困難,宕機之後的容災也是問題。
  • 可靠性:數據安全方麵,如果磁盤數據壞了之後數據的恢複也是非常大的挑戰。
  • 高並發的效率:阿裏巴巴在研發的投入是非常大的,各種各樣的研發工具非常依賴於托管底層的平台,底層平台的數據調用量是非常大的,整個RDC調用數據的量非常大。
  • 用戶規模。

雲代碼托管平台的架構設計

設計思路

首先,穩定性優於體驗,體驗優於成本,運維導向是麵向failover。重監控,態勢感知,可回溯;重管控,突破規模製約,代碼量非常大,管控措施很重要。

1fde4dbd004807773b96be5ad97b08a7457fec3f

上圖是機房內的架構,有兩個proxy,分為了http協議、SSHD協議。http協議根據http body信息來進行路由轉發。SSHD協議解析了所有命令行的信息,包括想獲取哪個代碼庫的數據下載,每個集群有多個節點,每個節點有三台以上的機器,機器有不同角色master、mirror、backup。實際中,讀寫比例比較懸殊,大約為20:1,所以進行讀寫分離提高效率。backup的作用是,如果master掛掉的話,監控上會有感應,此時會將backup切換成master。Sharding記錄節點機器的狀態以及namespace和node節點之間的對應關係,這樣遷移的時候隻需要先將數據遷移,那麼裏麵的狀態就會無縫遷移。

構建穩定性

對於單機房,采用主/備切換,根據監控指標自動切換。用VIP、DNS來切的話,時效性會比較慢。同城災備,如果整個機房宕機,那麼直接切換DNS。異地災備策略上和同城災備是一樣的。

6ff2bdac292bf3f7bc8836ba8ed38e0c1aba83d4

上圖展示了兩個機房之間的數據同步,MNS是阿裏雲的消息服務,機房中任何數據變更時會向MNS發送消息,消息類型比較多,比如倉庫的生命周期,訂閱消息通過system hook下發存入MNS裏麵。在容災機房裏麵有消息消費,消息消費之後會調用RPC服務,把一些庫創建出來。通過異步消息來做,在時效性上有點差,但是可以忍受,但最終數據是一致的。

引入了新的技術棧。以前采用Ruby+MySQL來做,現在采用Golang,性能好,易部署。此外,使用Grpc,其基於http2,是穀歌新開發出來的工具,支持服務端和服務端之間的加密,易擴展,跨語言。使用阿裏雲的自研消息係統MNS,支持主題/訂閱。這樣做解決了穩定性,從單機宕機到機房宕機,再到同城宕機都有一定的解決方案。

安全性

數據安全方麵采用多重備份,異地災備。流量控製根據IP做流控,此外還會做namespace流控,因為有些庫裏麵namespace比較多,namespace宕機之後會導致節點的數據量變大,影響整個節點的穩定性,所以需要對namespace做多維度的流量控製。

具體的技術細節是:使用golang的sshd服務替換原生的open-sshd,解決ruby中gitlab-shell啟動慢,並且解決authorized_keys的文件變大後,性能下降的問題;用更多的redis來解決webhooks的性能,大量外部係統依賴webhook,確保穩定性,解決webhook的時效性。

大容量支持

大容量上很好的支撐是提供5GB以上的下載流量,整個數據存儲在100T以上,用戶數可以支撐100w級別,倉庫數也可以支撐100w級別。

平台能力

每天支撐阿裏百萬級別的GIT的操作,覆蓋著阿裏全部BU,對外能力輸出阿裏雲code。阿裏雲code平台是2016年上線的,內部體係包括阿裏雲自己的內部體係以及基於阿裏雲的其他體係,其他能力一致。

雲代碼托管後續發展

從技術來說,目前存儲和計算的分離做的不夠好,node節點上的數據有大量的計算。分離的好處是選用不同的硬件設備來做更好的容量規劃。未來希望更好的支持容器化,拆分更多微服務,對各種邏輯進行歸類。

功能方麵,正在打造更好的代碼review平台。由於本地環境特殊複雜,一些工程在本地不是很好搭建,在線IDE使得所有環境都是固態化,減輕開發的負擔。繼續加強webhook,做到性能更加優化。

最後更新:2017-07-06 21:33:25

  上一篇:go  阿裏巴巴1582.73億背後的持續交付如何玩
  下一篇:go  proxmox 命令行啟動kvm qm 轉移kvm