揭祕騰訊代碼管理核心—工蜂Git系統架構

騰訊工蜂Git

code.tencent.comweb

引言:

近日,2018 DevOps China 沙龍在深圳騰訊大廈舉辦。本次沙龍邀請了多位嘉賓,分享了關於DevOps的實踐與心得。會上,騰訊高級工程師、工蜂系統架構負責人羅奇帶來「揭祕騰訊代碼管理核心:工蜂 Git 系統架構」的經驗分享,爲你們闡述了騰訊工蜂的起源、發展以及將來規劃。數據庫

1 騰訊工蜂

騰訊工蜂是騰訊通過10年的積累和摸索打造的企業代碼管理協做解決方案。具有代碼檢視、分支管理、會話式開發、集成定製、審查和監控等企業級研發管理系統特性,秉承了前沿的研發思想和先進的研發理念,助力企業貫穿研發流程,讓開發和研發管理更加敏捷高效。後端

2 工蜂系統的架構

從2012年開始,Git逐漸成熟。由於Git的去中心化、快速拉取分支和便捷使用等特性,被衆多開發者所青睞,Git的使用在國內逐漸流行起來。此時騰訊也正着手準備搭建Git代碼託管系統,計劃將原來的SVN逐步切換到Git上。緩存

咱們採用自研的方式,是由於它既可以知足整個騰訊的日益增加的代碼託管需求,又可以很好地適應公司企業管理、安全和內部開源文化。在架構方面,面對騰訊這樣的體量,咱們須要分佈式集羣的能力和高可用的解決方案,也須要強化後臺管理、監控、運維能力。再者,自研有很好的可控性,能夠作不少企業定製化的功能。安全

在系統架構的選擇上,爲應對騰訊上百T的代碼庫總量,和不斷產生的平臺方接入需求,好比自動構建、自動代碼掃描等,咱們選擇了微服務。微服務結合容器部署方案,具有快速水平擴展、可插拔和增量發佈等特性,這些特性可以很好的知足高可用高併發場景。服務器

微服務的架構模塊圖 在存儲擴容方案上,考慮到Git的代碼庫服務是IO密集型,再加上大庫在分佈式存儲中的性能不足,最終選定數據分片做爲存儲擴容方案。使用數據分片的優勢在於,它能夠根據業務需求實現不一樣的分片策略,控制靈活和方便擴展。

在工蜂架構的流程圖中,列舉了SSH、HTTP、WEB和API四種網絡請求的方式。Auth用於統一的認證服務,Router用於數據分片尋址的路由服務,Manager用於後臺數據的組裝服務,最後端則是代碼庫集羣。

路由是全部服務的核心,全部對代碼倉庫操做的請求都要經過路由進行尋址,而且經過切面的方式,最終實現對業務調用的透明和較低的侵入。網絡

以客戶端HTTP請求這條鏈路爲例,用戶請求先經過Nginx,轉發到HTTP代理,通過調用Auth認證,認證成功後由路由查找對應集羣節點,最後透傳到對應的Server集羣。

圖中右邊的代碼庫Server採用的是兩地三中心的容災解決方案。架構

3 架構提供了哪些能力

水平擴展能力,因爲服務都採用容器部署,再加上無狀態的底層服務,水平擴展將更加方便。即便忽然有大量業務接入時,系統也能隨時經過調整實例數量的方式進行輕鬆擴展,作到快速響應。 服務間的獨立性,單鏈路出現異常時,其它鏈路依然保持正常工做。例如數據庫所在的網絡受到影響,web服務出現短暫異常,但因爲HTTP代理有緩存路由數據,因此用戶最基本的Pull/Push等客戶端操做依然可以正常運行,開發人員的基本代碼操做不會受到任何影響。 提供熔斷、有損服務,防止瞬時負載太高引起的雪崩效應。 服務的高可用,咱們經過運用兩地三中心和主寫雙活的方式,而且採用跨機房,按期增量備份等措施,提供高標準的可用性和容災備份能力。併發

4 實際運營中遇到了哪些問題

隨着工蜂系統用戶量的增加,系統在運行中也逐漸涌現出新的問題,例如出現了異地項目訪問慢、大庫項目逐漸增多和大庫Merge操做超時等問題。爲了可以儘快解決這些眼前的問題,咱們決定對工蜂系統進行一次新版本的進化。運維

5 工蜂系統架構的進化

下面是新版本的架構流程圖,黃色部分是系統增長的新特性。咱們引入IDC選擇器來解決異地部署的問題,引入LFS用來解決大庫問題,從而分別實現異地項目快速訪問和大庫操做快速響應。

  • LFS 在實際運營中,有大量用戶反饋加載慢的問題,經過掃描發現此類用戶的項目包含大量依賴包文件,其中還關聯大量的歷史。除此以外,有些遊戲業務部門的項目數據量超過50G,其中包含大量的圖片和視頻資源。

爲了解決項目容量大而致使操做加載緩慢的問題,咱們引入了開源的Git-lfs方案。從圖中咱們能夠看到,用戶本地庫有各類類型的文件,包括代碼、圖片、視頻等文件,經過把這些文件存儲在Git倉庫以外,在Git倉庫中只保留文件的文本指針,這種方式能夠減少Git倉庫自己的體積,也能夠加快克隆倉庫的速度。

下面是LFS部署的架構流程圖。咱們部署了LFS代理和專門的LFS服務器。當用戶有LFS操做時,Git智能協議會將代碼、圖片、視頻等文件的文本指針,經過HTTP代理推送到代碼倉庫,再將文件資源推送到LFS代理,LFS代理會先查找路由,進行權限認證,最終把文件資源推送到LFS服務器。此外,爲了可以讓用戶在後臺進行統一的控制,咱們還在HTTP代理中添加了後臺配置,對單個文件、單次提交進行攔截,攔截後會通知用戶使用LFS進行轉換。

  • 異地協同開發 咱們發現,異地項目訪問慢的狀況發生在這種場景:同一部門的員工分別分佈在深圳和北京,他們都須要使用工蜂系統。北京的小組有獨立的項目,而深圳與北京的員工之間又有公共的項目。當項目中出現對於大庫的Clone和Push等操做時,系統響應會很是緩慢。做爲同一個部門,在有公共項目的狀況下,部署兩套徹底不一樣的環境是不可能的,那如何解決這種問題呢?

假設IDC1是深圳,IDC2是北京。咱們只需在深圳的一套完整系統中增長IDC協調器,而後在北京部署最基本的HTTP代理、路由、IDC選擇器和用於讀寫的新的Server集羣,就能夠解決上述問題。當北京的同事在使用客戶端操做時,訪問請求會由IDC選擇器分配到對應的地方,從而實現就近訪問。協同開發方面,因爲北京和深圳的Web和數據庫採用同一套系統,因此數據之間是相互可見的,同事之間能夠經過Fork公共項目來進行協同開發。

還有另一種異地協同開發的場景。例如北京的同事須要使用深圳共用的構建系統,進行版本的構建和發版。這種場景是須要在不一樣網絡中使用同一個版本庫。爲了可以實現這種異地構建的場景,咱們在北京部署最基本的HTTP代理、路由、IDC選擇器和一臺備機(備機和主機分配在同一個集羣)。當主機接收到寫請求時,協調器會根據IDC標誌,分別對兩邊的備機下發同步任務,實現數據的同步,這樣就能夠知足異地構建的需求。

6 進化所帶來的能力提高

大庫方案 在上一個版本中,咱們已經經過將存儲數據分片和微服務,讓總體存儲容量能夠自由地水平擴展,最終實現總體存儲容量無上限。如今經過LFS,單個庫也能實現理論上容量無限制。如今不只可以輕鬆應對遊戲部門總體項目遷移的需求,還能作到後臺統一配置和管理攔截大文件的規則。

異地協同開發能力 經過IDC選擇器,如今工蜂系統能作到就近訪問和協同開發,在保證數據統一和系統易維護的基礎之上,爲分公司同事提供了較好的使用體驗。

計算和存儲分離 MySQL的分片支持,讓數據容量和API調用也能實現分片操做,從而提供海量數據的支持。

提供Open API和OAuth功能,更好地跟第三方應用集成

7 對將來的指望

工蜂系統做爲代碼託管系統,是DevOps研發工具鏈中重要的一個環節。目前工蜂系統已經經過Web Hooks、API和OAuth實現了和其它系統的對接,共同打通需求、代碼託管和構建等整個環節。從此,咱們將更多地專一於企業的需求,讓工蜂系統開放更多的能力和更加緊密地集成DevOps上的服務,最終造成研發工具鏈的閉環。


掃描二維碼,研發管理今後高效、輕便、可靠
相關文章
相關標籤/搜索