說到系統部署工具,大的互聯網公司基本上是本身研發,一鍵自動部署到數百臺到數千臺服務器,好比twitter開源的Murder。小的公司可能使用一些開源工具,好比Jenkins、Puppet、Ansible結合一些腳本進行。python
開源的部署工具備Capistrano、瓦力等,在線部署的有http://dploy.io/。其中瓦力是國人開發的一個系統部署工具。git
貝聊以前也使用了瓦力來部署web服務和dubbo服務,在使用的過程當中遇到一些問題:github
爲了解決使用瓦力遇到的問題,咱們決定本身研發一個部署工具。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執行命令的次數,好比有多個文件須要發送到目標服務器,打包成一個文件後再進行傳輸。
因爲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項目的部署,之後會支持多種語言,而且咱們考慮在今年年末把它開源。