一、建設自動化運維體系的原因
第一個是游戲的需求。它表現為三個方面:
- 一是游戲數量多,我司現在運營的游戲多達近百款。
- 二是游戲架構復雜。游戲公司和一般的互聯網公司有一個很大的區別,就是游戲的來源可能有很多,比如有國外的、國內的,有大廠商的、小廠商的;每個游戲的架構可能不一樣,有的是分區制的,有的是集中制的,各種各樣的需求。
- 三是操作系統種類多,這與剛才的情況類似,游戲開發者的背景與編程喜好不一樣,會有Windows、Linux等。
第二個是在硬件環境方面,主要表現為服務器數量多、服務器型號多。
因為公司從建立到現在有十幾年的時間了,在這個過程中分批、分期采購的服務器幾乎橫跨各大OEM廠商的各大產品線,型號多而雜。
最后是人的因素。我們在建設自動化運維體系過程中,有一個比較重要的考慮點是人的因素。
如果大家的技術能力都很強,很多時候一個人可以完成所有工作,可能也就不需要自動化運維體系了。
正是因為每個運維人員的能力不一樣,技術水平參差不齊,甚至是運維習慣和工具也不一樣,導致我們必須要創建一套規范的自動化運維體系,來提升工作效率。
二、建設自動化運維體系的目標
再看一下建設這套自動化運維體系的目標,也就是說我們的原則是什么?
筆者將自動化運維體系的建設目標總結為四個詞。
- 第一個是“完備”,這個系統要能涵蓋所有的運維需求。
- 第二個是“簡潔”,簡單好用。如果系統的操作流程、操作界面、設計思想都比較復雜,運維人員的學習成本就會很高,使用的效果是會打折扣的,系統的能力、發揮的效率也會因此打折扣。
- 第三個是“高效”,特別是在批量處理或者執行特定任務時,我們希望系統能夠及時給用戶反饋。
- 第四個是“安全”,如果一個系統不安全,可能導致很快就被黑客接管了。所以安全也是重要的因素。
三、自動化運維體系的結構和運作方式
3.1、自動化安裝系統
說到自動化安裝,大家可能並不陌生,“兩多兩少”,型號多、操作系統多,但是人少,可用時間也比較少。
整個流程采用通用的框架,首先由PXE啟動,選擇需要安裝的操作系統類型(安裝Windows或者Linux),然后根據Windows系統自動識別出需要安裝的驅動。服務器交付用戶之前,會進行基本的安全設置,例如防火牆設置以及關閉Windows共享,這在一定程度上提高了安全性,也減少了需要人工做的一些操作。如圖所示:
自動安裝流程圖
3.2、自動化運維平台
當服務器由自動化安裝系統安裝完成以后,就會被自動化運維平台接管。自動化運維平台是運維人員的作業平台,它主要解決的問題就是因服務器、操作系統異構而且數量特別多而帶來的管理問題。操作系統是五花八門的,我們在設計系統過程中考慮了以下幾個因素:
把整個系統的用戶界面設計成基於瀏覽器的架構。運維工程師無論何時何地都可以登錄管理系統進行運維操作,這樣的話就比較方便。由Octopod服務器對被操作的機器發布指令。
統一管理異構服務器。大家以前可能對Windows深惡痛絕,其實Windows也可以管得很好。我們使用開源的SSH方式管理Windows,這樣就可以對系統進行批量的補丁更新,還可以做批量的密碼管理和操作。
充分利用現有協議和工具。這個平台的特點是所有的系統使用SSH管理,而不是自己開發一些Agent,這也體現了自動化運維的觀點。
很多時候我們沒必要重新造輪子,即使自己造出一套客戶端的方法,大部分時候也並沒有在生產環境里得到嚴格的驗證。
而SSH協議本身已經存在很多年了,而且已經在我司使用了很多年,該出的問題已經出了,相對於造輪子,使用SSH更加穩定,更經得起考驗,使用起來更方便。
3.3、自動化安檢系統
下一個系統是自動化安檢系統。由於我們的子系統比較多,業務也比較多,怎樣設計一套系統去保障它們的安全呢?這里主要是兩個系統:自動化安檢平台和服務器端。
先來看自動化安檢平台。游戲公司和一般的互聯網公司有一個區別,就是前者需要給玩家發送很多的客戶端(特別是有的客戶端比較大),或者補丁文件,去更新、下載和安裝。
如果這些文件里面出現病毒和木馬,將是一件很糟糕的事情,甚至會對業務和公司的聲譽造成惡劣影響。當這些文件被發到玩家電腦上之前,必須經過病毒檢測系統檢測,確保它沒有被注入相應的病毒代碼。
再來看服務器端,主要是通過安全掃描架構來保障安全。
安全並不是一蹴而就,一勞永逸的。如果不對系統持續地檢查、檢測、探測,那么你的一些誤操作會導致系統暴露在互聯網上,或者是暴露在惡意攻擊者的眼皮之下。
通過一種主動、自發的安全掃描架構對所有服務器進行安全掃描,就能在很大程度上規避這樣的問題。
舉一個例子,去年我們遇到過一個情況,某款交換機ACL達到一定的數量的時候,就完全失效了。
如果沒有相關的配套機制去檢查和檢測,那么你的服務器、你認為保護得很好的端口或者是敏感的IP可能已經暴露。所以,通過這種主動的探測可以減少很多系統的或者是人為的安全問題。
3.4、自動化客戶端更新系統
游戲是有周期性的,特別是在游戲發布當天或者有版本更新的時候,這時候玩家活躍度很高,下載行為也是比較多的,但是平時的更新和下載帶寬可能並不大,這也是游戲很顯著的特點。
這個特點對於我們構建這樣一個分發系統提出了很大的挑戰。
第一個挑戰就是在高峰時游戲產生的帶寬可能達到數百GB。
第二是很多小運營商或者中小規模的運營商會有一些緩存機制,這個緩存機制如果處理得不好,會對業務造成影響,也就是非法緩存的問題。
第三是關於DNS調度的問題。
DNS調度本身是基於玩家本身的Local DNS的機制解析的,會有調度不准確的問題。
第四是DNS污染,或者是DNS TTL的機制導致調度不那么靈敏和准確。針對這些問題,我們有下面兩套系統來解決。
第一套是Autopatch系統,它解決的是大文件更新的下載問題,再就是多家CDN廠商流量調度。其操作流程也比較簡單,由運維人員上傳文件、安檢,然后同步到CDN,由CDN分發到相關邊緣節點,最后解壓文件。
剛才說到游戲的周期性特點,就是平時帶寬不是很大,但是在某個節點的時候,或者是重大活動的時候,帶寬比較大。
如果自己構建一套CDN系統,可能不是很划算,所以我們引入國內多家比較大型的CDN廠商調度資源。我們通過302的方法調度,而不是把域名給其中一家或幾家。
因為直接使用CNAME的話很難按比例調度,特別是帶寬大的時候,一家CDN廠商解決不了,或者是一家發生局部故障,需要快速切除。
而通過集中的調度系統就可以實現按比例調度的功能。用戶發過來的所有請求,首先要在我們這邊進行調度,但是本身並不產生直接下載帶寬,而是通過相關算法,按比例和區域調度給第三方的CDN廠商,然后玩家實際是由第三方CDN廠商節點去下載客戶端的。
第二套是Dorado系統。剛剛講到小運營商或者某些運營商的非法緩存機制會對業務造成影響,那么對於某些關鍵的文件,如果緩存的是一個舊版本,可能會造成很大的問題。比如我們的區服列表,如果我們服務器端增加了新的區服,在客戶端沒有顯現出來,就導致玩家沒有辦法進入到新的區服去玩。
針對這些問題,我們設計了內部代號為Dorado的系統,因為這些文件本身是比較小的,而且數量也不是特別多,但是需要用HTTPS加密,通過加密規避小運營商的緩存問題。
所以我們對於這些關鍵文件,全部有自有節點,在節點上支持HTTPS加密方法,規避小運營商緩存帶來的一些問題。
3.5、自動化服務器端更新系統
我們采用的服務器端更新模式也是一種比較傳統的類似於CDN的方式,是由目標服務器通過緩存節點到中央節點下載,由緩存節點緩存控制,這樣可以減少網間傳輸的數據量以及提高效率。
我們在設計這套系統的時候,也想過用P2P去做。大家想P2P是很炫,又節省帶寬,但是用於生產環境中大文件分發的時候會有幾個問題。
一是安全控制的問題,很難讓這些服務器之間又能傳數據又能進行安全端口的保護。
二是在P2P里做流量控制或者流量限定也是一個挑戰。所以最終我們采用了一個看起來比較簡單的架構。
3.6、自動化數據分析系統
說到客戶端更新,其實更新的效果如何,玩家到底有沒有安裝成功或者進入游戲,很多時候我們也很茫然,只能看日志。
但是日志里面的很多信息是不完善和不完整的。下載客戶端的時候,如果看HTTP的日志的話,里面是206的代碼,很難計算出玩家到底完整下載了多少客戶端,甚至他有沒有下載下來,校驗結果是否正確,也很難知道。所以我們最終設計了一個自動化數據分析系統,目標就是分析從用戶開始下載到他登錄游戲,數據到底是怎樣轉化的。
最理想的一種情況是用戶下載客戶端以后,就進入了游戲,但這是一個理想情況。
很多時候,比如因為網絡不好,導致用戶最終沒有下載成功,或者是因為賬號的一些問題,用戶最終沒有登錄到游戲里面去。
所以,展現出來的數據就是一個漏斗狀。我們的目標就是讓最終登錄的用戶數接近於起初下載客戶端的用戶數。
我們來看一下系統的架構。首先由玩家這邊的下載器或者是安裝客戶端,游戲客戶端里面集成一些SDK,對於任何一個關鍵點,比如“下載”按鈕或者“終止”按鈕的數據都上報,當然這里面不會涉及敏感信息。上報以后會有Tomcat集群,集群處理以后會將數據寫入MongoDB。
看一下這個游戲在引導過程中有什么問題,左邊的這一列它分為三個文件,有一個是3MB,有兩個是2G多的文件,其實大家可以想像一下。很多時候玩家看到小的文件就把小的文件直接下載安裝了,但是實際上並不完整。這一點也告訴我們,其實很多時候在運營或者是業務方面,在引導方面也是要比較合理才能去規避掉一些問題。
3.7、自動化數據備份系統
我們第一個版本的備份系統,它的設計和實現是比較簡單的:不同的機房會有一台FTP服務器,本機房的數據寫入FTP服務器,然后寫入磁帶,但是這樣就導致磁帶是分散的,沒有集中存放的地方;另外,基於FTP的上傳會有帶寬甚至有延遲的要求。
后來我們設計了一個集中的備份系統。它主要解決了以下兩個問題。
第一是簡化配置。我們所有機房的全部配置,用一個負載均衡器的IP就可以了,當客戶端需要上傳文件時,通過負載均衡器獲取實際上傳的地址,然后上傳文件,由左邊第二個框里面的服務器進行接收,並且根據MD5值進行校驗,如果校驗沒有問題,就轉到Hadoop的HDFS集群里面去。目前這個集群有數十PB的規模,每天上傳量有幾個TB。
第二是提高傳輸效率和成功率。大家會想一個問題,在中國,網絡環境十分復雜,運營商之間存在隔閡甚至是壁壘,導致網絡不穩定,丟包和延遲的問題是怎樣解決的呢?如果基於TCP傳輸大文件,理論上存在單個連接上帶寬延時積的限制。
這里我們創新的是,客戶端的上傳采用UDP協議,UDP本身沒有任何控制,說白了就是客戶端可以任意、使勁地發文件。最終會由服務器端檢查你收到了哪些文件片段,然后通知客戶端補傳一些沒上傳的片段就可以了。基於這種方式能規避很多因為網絡抖動或網絡延遲比較大而導致的問題。當然,在客戶端做流量控制也是可以的。在遇到問題的時候多想想,或許能找到不走尋常路的解決方案。
3.8、自動化監控報警系統
再看一下游戲的自動化監控報警系統(如下圖所示)。游戲的架構中有游戲客戶端、服務器端、網絡鏈路,所以必須要有比較完整的體系進行全方位、立體式的監控,才能保證在業務發生問題之前進行預警,或者在發生問題時報警。
對於機房鏈路,有IDC(Internet Data Center)的網絡質量監控;在服務器、網絡設備和硬件方面,我們會做服務器的健康檢查、性能監控,以及網絡設備和流量監控;
在系統程序方面,我們會收集和分析系統日志;在游戲服務器端應用方面,有服務器端的程序監控;在客戶端方面,我們會收集植入的SDK做下載更新后的效果,以及收集崩潰的數據。
作為運維人員,我們考慮問題或者設計架構的時候,視角不能僅局限於一個技術方面,或者選用多炫酷、多么牛的技術,要想想技術在業務方面的架構,或者能否通過業務指標監控我們的運維能力與運維系統。
在游戲里,有一個很重要的指標就是在線人數,通過監控在線人數這個業務指標,就可以知道系統是否工作正常,是不是有漏報、誤報的情況,因為很多時候任何一個環節出了問題,最終都會體現在業務上,在產生價值的數據上。
所以我們有一套監控在線人數的系統,每個游戲上線之前會接入這個系統,把在線的人數實時匯集到系統里面。如果發生異常的抖動,系統中都會有所顯示,也就可以知道是否發生了問題。
以上講的是一個框架,下面我們看一下細節,怎樣做服務器的監控。首先由運維工程師在監控策略平台配置監控策略,監控策略平台會將這些數據格式化成相關格式,然后推送給自動化運維平台。
自動化運維平台會判斷是這些數據是外部來的,還是遠程檢測到的;是網絡模擬的,還是本地的監控得到的。
比如流量、本地進程的監控、本地日志的監控,會分別推給遠程探測服務器,或者游戲服務器本身,然后由它們上報數據。數據上報以后,根據運維工程師配置的閾值,會觸發相關的報警,然后通知運維工程師進行相關處理。因為雖然游戲多種多樣,操作系統五花八門,但是總有一些大家可以公用的東西,比如監控的模板或者監控的策略,我們對服務器的東西也進行了整合匯總。