聚效廣告張燁:基于Docker和Mesos的服務可靠性保障實踐
原創來到移動互聯網時代,廣告技術發生了質的改變。不再像PC時代廣告的展示空間、廣告樣式那樣豐富和自由;廣告的商業化特殊特征,也使其技術平臺接受著高并發、極低延時和大數據量的挑戰。面對移動時代越來越苛刻的用戶體驗需求,廣告業務對于系統可靠性的要求也變得越來也高。
在WOT2016互聯網運維與開發者大會現場,51CTO記者專訪到聚效廣告SRE工程團隊總監張燁,探尋聚效工程團隊是如何利用Docker 和 Mesos來保障服務可靠性的。
嘉賓簡介
張燁(Michael)目前就職于聚效廣告平臺工程師團隊,主要負責SRE和大數據平臺。十多年互聯網行業的DevOps實踐經歷,也是OCP在國內的少數先行者之一。同時也是中國反垃圾郵件聯盟的聯合創始人和Linux中國小區的初創專家。
為什么是Docker
移動互聯網時代的廣告創意和營銷,必須要找到精準與用戶體驗之間的平衡點。張燁介紹說,為了應對挑戰,聚效廣告除了依托數據和精準營銷的技術之外,還針對移動端的一些新特性和場景,設計In APP廣告、HTML5廣告等一些特有應用,基于原有的基礎平臺嘗試不同的產品化實現。這些廣告產品業務的復雜性及商業化的特殊性,使聚效廣告系統需要表現出更高的可靠性,來應對高并發、極低延時和大數據量的挑戰。
張燁認為對于可靠性的定義,應該基于整體業務平臺之上來衡量,包括公司系統的經濟損失、商業品牌塑造、媒體影響力等等,而不應該局限于系統的某些模塊或服務可用性。可靠性指標是一個目的,為了達到這個目的,企業還需要要解決哪些問題,系統架構、開發和運維工具等方面還需要做哪些事情,根據業務的實際情況是應該將目標定為3個九、4個九或是更高,等等。為了達到目的,企業需要從技術和可靠性等方面做綜合的考量。
為了保障服務的可靠性,以及提高系統的靈活伸縮性能,聚效工程團隊在Docker容器化和Mesos資源調度框架方面進行了較為深入的探索。2014年底,聚效SRE團隊開始接觸Docker,2015年中旬開始正式將Docker投入到生產環節來使用。張燁說之所以選擇Docker,是為了解決公司業務對于服務可調度化的需求。他們發現將服務Docker化可以解決這個訴求,于是開始將Docker集成到公司原有的的CICD(持續集成與持續交付)的開發流程中,并驅動團隊開發和保證這些監控工具和運維工具的可用性。“我們不是為了Docker而使用Docker,Docker只是一個輪子,是驅動我們提高軟件和系統品質的工具”,張燁這樣告訴記者。
為什么是Mesos
隨著在生產環境下部署Docker集群的需求越來越多,Mesos、Kubernetes等資源管理和調度軟件也漸漸走進大家的視線。經過不斷的選型和嘗試,聚效廣告系統目前采用的是Mesos來實現Docker集群的管理和資源調度
最初聚效廣告系統選擇的是Kubernetes來管理Docker集群。“Kubernetes是很好的整體解決方案,因為它是一個大而全的工具,既能解決容器化、又能解決資源調度,又能解決服務發現等等的問題”,張燁是這樣評價Kubernetes的。那是什么原因讓他們放棄Kubernetes,轉而使用Mesos的呢?張燁向記者解釋說,這是因為Kubernetes的網絡模型比較復雜,在高并發情況下的性能是很大的問題,但這正是廣告系統非常關鍵的需求,因此只能無奈放棄。
Mesos是Apache下的開源分布式資源管理框架,起源于Google的數據中心資源管理系統Borg,被稱為是分布式系統的內核。Mesos實現了雙層調度機制,使它可以管理多種類型的應用程序。第一級調度是Master的守護進程,管理Mesos集群中所有節點上運行的Slave守護進程。集群由物理服務器或虛擬服務器組成,用于運行應用程序的任務,比如Hadoop和MPI作業。第二級調度由被稱作Framework的“組件”組成,包括調度器(Scheduler)和執行器(Executor)進程,其中每個節點上都會運行執行器。Mesos能和不同類型的Framework通信,每種Framework由相應的應用集群管理。這些Framework可以減少個業重造輪子的代價,像Mesos本身不處理網絡問題,但利用Marathon我們可以選擇Docker本身提供的Host模式和Bridge模式。Mesos的開源特性與基于Framework的調度機制,是聚效廣告系統選擇它的重要原因。
服務Docker容器化的典型問題
經過不斷的摸索和實踐,聚效SRE團隊在服務Docker容器化方面積極了很多經驗,張燁也享了幾個比較典型的問題。
- 不要在Docker中加入SSH
很多人都喜歡用SSH,也會認為在Container里安裝一個SSH Server 就可以直接連接Container并且進入它的內部,這樣就可以很容易地檢查日志,做備份,或者重啟進程,調整配置等。但其實只有SSH Sever是不夠的,還需要加入進程管理軟件,Monit 或 Supervisor等監控軟件,而且由于Docker只能管理單進程,如果應用停止了,我們只能通過進程管理軟件那里獲得信息,這樣就把簡單的Docker復雜化了,并且會有一些訪問上的安全隱患。在使用Docker的時候,一定要跳出把它當成小“vps”的誤區,尋找其它解決方案來處理需要SSH的問題
- 存儲持久化
Docker 有一個Plugin的機制,可以讓一個容器為其他容器提供存儲。這個容器是可以Ceph, Gluster或者任何其他的存儲集群的一員,并掛載在另一個容器上,來解決存儲持久化的問題。
- Docker網絡性能
張燁講到,他們跳過了Docker本身網絡性能問題。對于網絡性能需求高的服務,他們選擇了它的host模式來兼容;對于網絡性能不高的服務,則是采用Docker本身自帶的網絡解決方案,從而避免了我們重新去做SDN的研發,或者說重新造輪子的代價,而是選擇用適合于自身業務的產品繞過去。
留給每位工程師的DevOps問題
Docker是一個對開發者非常友好的東西:簡單的實現不同機器上的環境標準化,可以輕松拿來拿去,而且在不同的云平臺上都支持。但把Docker用起來對運維而言則是很大的挑戰。
張燁告訴記者,在聚效,DevOps是每個工程師都必須要做的事情,所有開發規范和工作方式都是圍繞DevOps的方式去做,所以對每位工程師的能力要求非常高。因為每位工程師不僅僅是在開發產品的Feature,還要在DevOps理念的指導下,考慮開發出來產品的可運維性、可監控性、可交付性等等,并且日常的Ops的這些On call工作,也是由Dev-team輪流完成。
張燁的建議是,不要強求每個團隊都要用DevOps這種方式工作。我們可以在特定的團隊和特定的項目里采用DevOps這種方式,比如一些對于可靠性要求非常高的業務,會提高項目整體迭代能力和可靠性。