七牛雲數據處理團隊的容器技術實踐經驗
首先介紹一下七牛數據處理業務的背景。七牛雲目前平臺上有超過 50 萬家企業客戶,圖片超過 2000 億張,累積超過 10 億小時的視頻。 用戶把這些圖片和視頻存儲在七牛上後會有一些數據處理方面的需求,如縮放、裁剪、水印等。數據庫
這些文件持續在線且數據種類多樣,若是用戶把這些文件在本身的基板上處理好後再上傳到七牛,是很是不合算的事情。而七牛最早提供基於存儲的數據處理功能方便用戶去作數據處理,這些數據處理一般放在企業的客戶端或服務器端來操做,對接上七牛雲存儲的數據處理接口後,便可對圖片和音頻進行豐富的實時轉碼功能,轉碼生成的新規格文件放在七牛提供的緩存層供 App 調用,不用佔用存儲空間,對企業來講不只成本大大下降,還可提升開發效率。七牛雲存儲
下圖爲一個圖片裁剪的數據處理示例:緩存
七牛的文件處理程序簡稱 FOP(File Operation),不一樣的文件處理操做使用不一樣的 FOP。用戶只需上傳一個原文件就能夠經過使用七牛的數據處理功能獲得各類樣式豐富的文件。下圖爲文件從上傳存儲處處理到分發的流程圖:安全
七牛雲的海量數據成就了 Dora 十分強大的數據處理能力,目前七牛的數據處理服務已經日處理數近百億次。面對這樣海量的數據處理請求,原有的數據處理平臺也面臨着新的挑戰:服務器
爲了解決以上問題,七牛基於資源管理系統 Mesos 自主研發了一套容器調度框架(DoraFramework),經過容器技術打造了易擴展、易部署、高自由度的數據處理平臺 Dora。總體架構圖以下所示:網絡
各組件介紹:架構
在這個架構中,咱們選擇經過容器技術實現跨機器實現彈性的實時調度。調度框架能夠根據具體的業務負載狀況動態的調度容器的個數, 很好的解決了靜態配置致使的資源利用率不高的問題 。而容器秒啓的特性也解決了當有大量突發請示進入,能夠快速啓動服務的問題。在網絡方面,因爲 UFOP 是用戶部署運行的服務,並不知道用戶是否有開啓其餘的端口使用,因此使用的是 Bridge 模式,須要對外使用端口的都須要經過 NAT 進行暴露,這樣服務內部使用了什麼端口並不會對外界環境形成影響 ,對平臺環境作了很是好的安全隔離。併發
數據處理平臺的調度系統咱們選擇的是 Mesos 自研容器調度框架(DoraFramework)。選擇 Mesos 作爲資源管理系統一個是由於 Mesos 的相對其餘的容器調度系統更成熟,Kubernetes 是 2015 才發佈可生產環境運行的版本,Docker Swarm 則是 2016 年才發佈,這兩個產品的生產實踐在調研時基本還沒什麼大型生產實踐經驗,而 Mesos 則已有七八年的歷史,且資源管理方面已經在如蘋果,Twitter 等大型公司獲得生產實踐,穩定性比較好。app
第二個是由於 Mesos 支持調度成千上萬的節點,以七牛目前已經達到近千臺物理機的規模,且每一年都在大幅度增加的狀況,Meoso 這種支持超大規模調度的資源管理框架更合適七牛的業務發展。負載均衡
第三是由於 Mesos 的簡單性,開放性及可擴展性,Mesos 是一個開源的分佈式彈性資源管理系統,整個 Mesos 系統採用了雙層調度框架:第一層由 Mesos 收集整個數據中心的資源信息,再將資源分配給框架;第二層由框架本身的調度器將資源分配給本身內部的任務。Mesos 自身只作資源層的管理,這種簡單性帶來的則是穩定性。而容器的調度框架則可使用開源框架如 Marathon/chronos 或自主研發。Kubernetes 雖然功能很豐富,可是也比較複雜,組件及概念都比較多,而且缺少開放性和可擴展性,只能使用它提供的調度功能,而不能根據自身業務的狀況定製調度框架,會形成對 Kubernetes 過於依賴的狀況。
爲何不選擇 Mesos 的核心框架 Marathon 而選擇自研,出於三方面的考慮:
1. Marathon 有些方面不支持咱們指望的使用姿式,好比不太好無縫對接服務發現;
2. Marathon 採用 Scala 開發,出了問題很差排查,也不方便咱們作二次開發;
3. 若是選用 Marathon 的話,咱們上面仍是要再作一層對 Marathon 的包裝才能做爲 Dora 的調度服務,這樣模塊就會變多,部署運維會複雜。
DoraFramework 是七牛使用 Go 語言自研的容器調度框架。DoraFramework 實現了 Mesos 兩層調度中業務進程的調度,是 Dora 調度系統中的核心組件,經過與 Mesos 和 Consul 組件之間的交互, 對外提供 API 接口。架構圖以下:
DoraFramework 主要功能介紹:
DoraFramework 與 Marathon 調度架構的對比:
咱們使用 Consul 作註冊中心,實現服務的註冊與發現。Consul 自帶 key/value 存儲,可經過 DNS 接口作服務發現,且具體健康檢查的功能,並支持跨數據中心的服務發現。API Gateway 能夠經過 Consul 提供的 DNS 接口查詢到服務全部的可用實例的列表信息,並將請求進行轉發。
咱們生產環境的配置管理採用的是 Ansible,Ansible 默認使用 SSH 進行遠程鏈接,無需在被管節點上安裝附加軟件,能夠批量系統配置、批量部署、批量運行命令等,很是適合七牛的大規模 IT 環境。而 Playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎,使用很是簡單,且具備可讀性,很是適合於複雜應用的部署。咱們經過 Ansible 能夠實現數據處理平臺的一鍵式安裝和刪除,新增和刪除節點,還包括對組件版本的升級及回退,以及生產環境的批量配置修改等操做,簡化了複雜的運維配置管理工做。
在實踐中,選擇一臺主機作爲中控機,安裝 Ansible,再配置這臺中控機與全部遠程主機的 SSH 互信,再在中控機上配置 Playbook 文件,便可對多臺主機進行批量操做。對於簡單的操做,可執行以下命令:
$ansible-playbook main.yml -i hosts
在 main.yml 裏編輯全部須要作的操做,在 hosts 文件裏寫入全部需求操做的主機 IP 地址,便可完成對 hosts 文件裏全部主機的批量操做。而對於複雜的操做,則可經過編寫 Playbook 進行配置。roles 裏存放不一樣的角色任務,好比 Mesos Master 上執行的任務和 Mesos Agent 上執行的任務不一樣,則可放在不一樣的 roles 裏,也能夠把 Mesos、Zookeeper、Consul 放的不一樣的 roles 裏。tasks 裏則是 role 裏具體執行的任務,handlers 則是 tasks 裏觸發執行的任務。template 則是模板文件,好比咱們須要個性 Consul 的默認配置文件,能夠修改後的配置文件放在這個目錄下,在執行時用這個文件替換默認的配置文件。
在監控方面,數據處理平臺擁有完整的監控體系,包括了主機監控,容器監控,服務監控,流量監控,日誌監控。主機和容器的監控主要經過 Prometheus 的各類 Exporter 來作,採集到包括 CPU、內存、網絡以及磁盤的實時使用狀況,服務監控和流量監控則經過七牛本身的監控程序進行監控,能夠監控到服務的狀態、存活性、句柄數、及全部處理命令的請求數、失敗數等。日誌監控則是經過七牛內部的日誌平臺 Pandora 系統進行監控,包括收集系統日誌,容器日誌和業務進程日誌。經過修改開源的文件收集器 Filebeat 的 output,將採集到的日誌所有傳送到七牛內部的日誌監控系統 Pandora 進行日誌監控。
監控數據顯示以下:
以上就是七牛雲數據處理平臺基於容器技術實踐的狀況。目前七牛的數據處理平臺具有零運維、高可用、高性能的數據處理服務能力,可以讓用戶輕鬆應對圖片、音視頻及其餘各種數據的實時、異步處理場景。七牛的數據處理業務系統不只能夠處理來自七牛雲存儲的數據處理請求,也支持來自非七牛雲存儲的數據處理請求,還能夠直接處理來自七牛雲分發 Fusion 的數據處理請求,用來提升 CDN 中間源數據的處理速度。而數據處理平臺 Dora 則是一個開放的平臺,不只能夠運行七牛本身的數據處理服務,也支持運行用戶自定義的數據處理服務,並具有豐富的運維管理功能,可使用戶從繁雜的運維管理和架構設計中脫離出來,從而專一於實現數據處理單元。 七牛數據處理平臺的業務支撐能力以下:
Q:請問管理系統是基於什麼開發的?這個系統會開源嗎?
A:Dora 的調度框架是基本 Go 語言開發的。目前不會開源,但提供私有部署。
Q:剛開始看 Mesos 框架實現,請問自定義的 Scheduler 中如何調用自定義的 executor?
A:Schesuler 跟 executor 這個都是按照 Mesos 最新的 V1 版的 HTTP API 去作的,這個沒有不兼容的問題,只是 Mesos Go 版本的 SDK 有些老舊,更新也比較緩慢,這個地方咱們本身根據須要作了些更改。
Q:請問目前 Consul 集羣是多大規模呢?有沒有考慮 Consul 擴展的性能瓶頸呢?
A:Consul 是在每一個 slave 節點上會有一個 Consul 的 Agent ,咱們一個機房有 200 多臺專門用於數據處理的機器,因此 Consul 的集羣規模也就這麼大,單機房。對咱們當前來講不存在瓶頸,由於咱們對 Consul 的使用的場景相對單一簡單:做爲 Metadata 的可靠存儲,Metadata 的更新其實並非很頻繁,這個咱們參考過別人作過的一些性能測試和咱們本身的一些測試,性能是知足需求的。另一個功能就是服務發現與實例的健康檢查,健康檢查是由運行在每一個機器上的 Consul Agent 負責的,均攤到每一個機器上,其實單個機器上的實例數不會特別的多,因此這部分也沒有太大的壓力。固然了,這個也是跟業務規模相關的,假定哪天 Consul 的擴展性成咱們的問題了,也說明咱們的業務量特別特別的大了,咱們也是很指望這一天到來的。
Q:Dora 是否能夠支持 MySQL 的自動伸縮擴容?
A:Dora 系統的應用場景仍是運行一些數據處理命令這類無狀態的服務。MySQL 這類系統不適合直接跑在 Dora 這個裏面,若是指望 MySQL 跑在 Mesos 上面的話,須要本身實現一個專門針對 MySQL 的調度器,由於 MySQL 實例的擴縮容,實例故障的修復都有 MySQL 自身特定的需求。咱們公司 MySQL 這類有狀態服務的容器化是由公司另外一個容器平臺實現的。MySQL 的用的是 Percona XtraDB Cluster 方案,咱們利用另外一個容器平臺的 API 寫了一個 Percona XtraDB Cluster 的調度器,把 Percona XtraDB Cluster 的大部分運維操做在容器平臺上自動化了。
Q:大家的 Ansible host 文件是動態生成的嘛?代碼推送也是經過 Ansible 嘛?新增刪除節點,以及回滾等操做是如何實現的?
A:最開始實踐的時候不是動態生成的,其實咱們是能夠從 Consul 中獲取到當前集羣裏面的節點和節點的一些簡單的配置信息,後面有考慮從 Consul 裏面拿節點信息,動態生成用於 Ansible 灰度的 host 文件。代碼推送也是使用的 Ansible,若是能和外網鏈接的機器,也可使用 GitHub。由於咱們的 Playbook 的角色是經過組件區分的,新增刪除節點只須要修改 Host 文件,把相應的節點加入安裝或刪除相應的組件。如回滾操做:
$ ansible-playbook rollback.yml -i hosts -e "hosts_env=XXX app_env=XXX version_env=XXX"
參數說明:
Q:Dora的調度策略是怎麼樣的?能否簡單介紹一下。
A:首先保證同一種數據處理命令的實例儘可能均勻分散在不一樣的機器上,而後再是保證均衡每一個機器上的負載。
Q:Prometheus 目前是單機的,數據量大了怎麼辦?Prometheus 的監控數據是存在 InfluxDB 嗎?
A:目前咱們是按業務拆分 server,數據量能夠支撐。咱們沒有使用 InfluxDB,仍是用的原生的 LevelDB。
Q:這麼大文件量,大家在存儲技術方面有什麼特別的處理嗎?怎麼實現高性能和海量存儲之間均衡?
A:七牛雲存儲的設計目標是針對海量小文件的存儲,因此它對文件系統的第一個改變也是去關係,也就是去目錄結構(有目錄意味着有父子關係)。因此七牛雲存儲不是文件系統,而是鍵值存儲,或對象存儲。咱們每一個大文件都是切割成小文件存儲下來的,元信息單獨存放在數據庫中,用戶請求的時候經過業務層合併處理後返回。所以理論上磁盤只存儲小文件,大文件存儲和讀取的性能主要在於文件切割和合並。
本文做者: 陳愛珍@七牛雲佈道師,更多雲行業技術洞見請訪問七牛雲博客。