貝聊系統部署工具

說到系統部署工具,大的互聯網公司基本上是本身研發,一鍵自動部署到數百臺到數千臺服務器,好比twitter開源的Murder。小的公司可能使用一些開源工具,好比Jenkins、Puppet、Ansible結合一些腳本進行。python

開源的部署工具備Capistrano、瓦力等,在線部署的有http://dploy.io/。其中瓦力是國人開發的一個系統部署工具。git

貝聊以前也使用了瓦力來部署web服務和dubbo服務,在使用的過程當中遇到一些問題:github

  • 對運維規範支持不夠
  • 不能在界面顯示部署失敗的緣由
  • 讀取tags列表很是慢,常常要屢次刷新,致使部署過程很長
  • 若是項目下有N個模塊,每次部署此項目下全部的模塊,要重複編譯此項目N次(Java項目),很耗時間
  • 業務系統多的時候項目列表眼花繚亂
  • 不能只部署一部分服務器

爲了解決使用瓦力遇到的問題,咱們決定本身研發一個部署工具。web

部署工具主要有如下內容:shell

  • 規範和約定
  • 項目配置
  • 服務器管理
  • 文件傳輸
  • 提升部署效率
  • 部署過程的日誌收集

下面分別就上面的內容作詳細說明。數據庫

規範和約定api

全部使用部署系統的項目,必須遵循一樣的規範,好比部署的文件統一放在:服務器

/data/project/項目名稱/模塊名稱

包括業務日誌目錄、端口範圍、配置文件等等。網絡

對於一些基礎的JVM參數,部署系統自動檢測並加上,好比gc相關的參數。架構

項目配置

項目配置包括項目名稱、管理員、項目成員、SVN/Git地址、賬號、服務啓動的shell、自定義腳本、不一樣環境的JVM配置、web容器配置等等。

對於web應用,運維在部署系統配置好端口、域名等參數,部署系統自動生成相應的容器配置(Tomcat/Resin等),減小運維的容器配置管理工做,也便於運維規範的執行。

服務器管理

服務器管理,在一些公司有CMDB系統來進行管理,功能很複雜。咱們的服務器管理和阿里雲結合,經過它的API讀取服務器列表,這樣就簡單了。

經過定義服務器組,能夠把不一樣做用的服務器分組,方便在部署的時候區分,而且也能夠只部署一部分服務器:

文件傳輸

服務器之間的文件傳輸,常見的方式有scp和rsync。其中scp用於簡單的文件傳輸,而rsync經常使用於增量文件同步。

而同時傳輸文件到多個服務器,能夠用Puppet、Ansible或相似功能的軟件。咱們選擇了Ansible,經過ssh的方式拷貝文件。若是有多個文件,先打包成一個文件,發到目標服務器再進行解壓,減小網絡傳輸的次數。

提交部署效率

爲了提升部署的效率,咱們作了不少小優化。

  • 減小Ansible執行命令次數

Ansible執行命令的速度有點慢,儘可能減小Ansible執行命令的次數,好比有多個文件須要發送到目標服務器,打包成一個文件後再進行傳輸。

  • 保存編譯結果

因爲Java代碼編譯很耗CPU,咱們把編譯的工做放到獨立的服務器,把編譯結果(jar/war文件)存儲到阿里雲的NAS,方便跨ECS讀取文件。

爲何要把編譯結果保存到NAS?若是一個項目有N個模塊,部署新版本的時候,建立相似這樣的部署記錄:

如圖中所示,對於同一個分支,要編譯N次。

假設每次編譯須要30秒,若是不保存編譯的結果,部署N個模塊光是編譯就要 N x 30 秒。保存編譯結果有利於提升部署的效率。

日誌收集

咱們的系統收集Java項目的編譯日誌、執行shell的日誌、業務日誌等。收集這些日誌的目的是爲了在web界面上直觀地看到部署過程當中的問題。

收集日誌一般使用agent的方式,好比常見的filebeat。

咱們使用python實現了agent,每一個服務器上啓動一個,以下圖:

因爲只收集部署時的日誌,agent並不須要一直常駐內存,在部署的時候啓動agent便可。當agent遇到退出指令,或超過120s沒有日誌的時候自動退出,下次須要再啓動。

若是一次部署幾百臺、幾千臺服務器的時候,上傳的日誌的TPS是很高的,每一個agent能夠批量上傳日誌,下降TPS,而且使用NoSQL數據庫(好比Redis)保存日誌。

日誌展現的效果圖:


跨IDC的處理

貝聊的服務所有部署在阿里雲,阿里雲有經典網絡和VPC專有網絡,若是全部IDC使用VPC專有網絡+高速通道,則比較簡單,由於所有使用內網進行通信。

若是已經使用了阿里雲經典網絡,建議轉換到VPC網絡,能夠下降跨IDC的應用架構設計的難度。

整體技術架構

業務模型

目前咱們的系統只支持Java項目的部署,之後會支持多種語言,而且咱們考慮在今年年末把它開源。
相關文章
相關標籤/搜索