Uber微部署的工程實踐

原文:UBER ENGINEERING’S MICRO DEPLOY: DEPLOYING DAILY WITH CONFIDENCE 
作者: Mathias Schwarz 
譯者:仲培藝,關注數據庫領域,糾錯、尋求報道或者投稿請致郵:[email protected]

圖片描述

2014年,Uber發展迅速,其平臺在第一季度由原來的60座城市發展到100座,後又在第三季度拓展到200座。同時,發展最快的城市也包含在第一批發展的城市當中。

隨着越來越多平臺工程師的加入,新的代碼部署混亂的問題也愈加明顯。因爲在新版微服務投放生產的過程中,每個團隊都有自己慣用的shell腳本,並通過特定的服務工具對其進行手動監測。而當主機升級出錯時,工程師唯有機械地一次重新運行一臺機器。因此,不斷擴大的工程師團隊阻礙了Uber人工服務的進一步擴展,有時甚至還會導致其長時間宕機。

如何才能確保每天的穩定部署?爲此,Uber開發了微部署(Micro Deploy,簡稱μDeploy)。它是Uber的內部部署系統,其構建、更新和回滾服務都是基於Uber進行。

每日部署進程

代碼在經過審覈、接受和全部單項測試之後,被收入知識庫,從而進入預生產階段,這時Uber工程師就會使用到微部署。首先,工程師通過μDeploy接口挑選出一項待更新服務。之後,爲了開展更新流程,他們需挑選一個部署並在Git知識庫中指定一個源碼版本。

圖片描述

μDeploy按需構建服務和分佈架構,在正確的數據中心與相關主站對話,並使所有代理在部署主機上進行服務更新。通過這一進程,μDeploy用戶界面在工作流程完成之前,會提供更新狀態的視覺反饋,這讓工程師得以繼續進行其他任務。

通過這種方法,μDeploy無論是構建還是推出新服務,通常只需要幾分鐘。這也是工程師對此可以達到的最快速度。

從工程師編寫代碼,到該代碼被運用到Uber生產系統當中,中間幾乎沒有過渡階段。自Uber推出首代μDeploy以來,其發展就從未減緩。2016年,工程師每週都要加緊構建數千項服務,監測後,會淘汰其中有10%,並將其退回原版。這意味着在工作時段,Uber系統的某部分每分鐘都在更新。由於更新時長往往不止一分鐘,所以該系統總是處在更新中的狀態。

目標:穩步部署

微部署由衆多微服務構成,而其中的大多數又通過μDeploy部署。

圖片描述

  • 一個網絡應用UI加CLI讓工程師選擇與μDeploy交互的方法;
  • μDeploy代理在Uber數據中心的每一臺機器上運行,其受主μDeploy指令調配,對服務進行安裝和配置更改。同時,代理部署也會概述各項服務,並向主部署反饋設備狀態。
  • μDeploy主部署管控着數據中心內部的μDeploy代理在所有設備上的操作方式。每個數據中心至少包含一個主部署。
  • 在每個數據中心內,μDeploy聚合器會和一個主部署設備接口,以實現全面部署。
  • uBuild系統在其設備的單個集羣中展開前,構建服務並隨之將其分佈至各數據中心。
  • μDeploy複製器負責在數據中心內部或兩個數據中心之間複製備份最終架構。
  • μDeploy協調器以這一種分佈式容錯模式對更新工作流進行管理。
  • μDeploy位置處在一組負責部署服務的主機。
  • uConfig系統支持服務配置迭代,且以服務更新的方式進行。

部署系統要素

一系列特性綜合造就了微部署的完整架構和完備的部署管理系統。下面列舉出一些類似Uber的基礎設施系統,他們在構建部署系統時所需的幾大要素:

服務架構一致性:對Uber來說,微部署是適用於各類服務的集成構建系統。是支持Tornado的Python?支持Node.js的JavaScript?還是支持Docker,沒有容器的Go、Java?答案都是肯定的。μDeploy構建系統利用不同的軟件棧調控多種編程語言和設備。Uber的集成構建系統使其生產服務部署更加標準化。

零停機更新:微部署系統在全球範圍內逐步推廣,將同一版本的軟件推广部署至多個數據中心,這些數據中心各自有不同的任務和配置。全自動化的部署便於工程師對其服務做出全球迭代。

錯誤早期自動化檢測:微部署集成監控系統,對異常現象做出早期監測,而無需人工控管,其中包括I/O性能的明顯下降、未捕獲異常、HTTP錯誤代碼、請求吞吐量問題和服務器負載問題。μDeploy則通過這些監控數據來確認在新版本推出的過程中,系統仍保持性能穩定。

預防運行中斷:面對異常情況,微部署利用監控數據中止更新,並將其退回一個性能相對穩定的版本。雖然誤報的情況時有發生,但比起冒險,選擇安全更爲穩妥。回滾是自動化運行,且操作發生往往遠在全部主機完成版本更新之前。理想化狀態是使回滾發生在一個canary 區,在該區域內,極小一批設備負責阻斷任何故障的外部影響。

穩定更新:微部署的高配置工作流引擎協調更新各階段。作爲一個分佈式系統,在更新過程中,μDeploy可以應對所有主機和機架的異常停運(包括正在運行工作流的主機)。

簡易使用:微部署基於的是Web應用,有着豐富用戶界面( User Interface)且功能完善。從而所有工程師都可通過瀏覽器獲取μDeploy,並立刻部署其服務投產。

深度集成REST API:微部署的REST API使用的是第三方工具,並深度集成到功能中。

從任務到委託

Uber設計微部署的目的在於避免不必要的部署進程,同時也想要藉此協助更新的準確進行。如果沒有微部署,則系統將快速捕獲偶發性更新錯誤,從而大大降低投產的可能性。而有微部署的情況下,若有意外錯誤發生,系統仍繼續運行。和Uber其它主要工程項目類似的是,μDeploy的構想和實現都是在其初始模式下進行的,且其投產過程的數月也是充滿趣味性的。

開發兩月後,Uber推出了首批微部署服務,其中50%在生產前五月使用μDeploy,較爲高產。

2016年中期,在衆多數據中心當中,Uber後端以及發展成爲一個不斷迭代,大規模分佈式系統。Uber工程師亦遍佈數個國家和大洲的12個工作室。99%的Uber軟件支持μDeploy。微部署在任何場合下賦予工程師的所有權都高速、自主,並且是端對端的。

本文作者Mathias Schwarz是Uber丹麥奧爾胡斯工作室的一名工程師。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章