億級用戶體量,千萬級日活用戶,《王者榮耀》高并發背后的故事!
堪稱中國最火爆的手機游戲“王者榮耀”,擁有億級用戶體量,***日活用戶,如何快速、低成本地保障業務突發?本文從該問題出發,論述了問題對應的解決方案,并對其效果做出總結。
“王者榮耀”是一款國民級手機游戲,用戶體量巨大,而且一直保持著較高的更新頻率。這種業務場景下,突發也變得非常頻繁,然而業務體驗是至關重要的,使用 CDN 必不可少。
騰訊 CDN 發展背景
使用 CDN 的業務中,經常有帶寬突發的場景,比如新聞爆點視頻、大型直播活動、熱門影視劇上線、游戲等應用發布。
得益于家庭帶寬和移動網絡的快速升級,突發帶寬越來越大,經常達到 Tb 級,甚至 10Tb。如何快速、低成本地保障業務突發,是 CDN 的一大挑戰。
2007 年,騰訊 CDN 接入***個業務騰訊網。帶寬從最早的 10Gb,發展到現在的數 10Tb。單業務的帶寬也越來越大,大部分業務常量帶寬在幾百 Gb,部分突發業務達到了 10Tb。
網絡的快速升級,移動用戶爆發式增長,以及視頻類業務包括點播和直播的興起,使得業務突發越來越頻繁,突發帶寬越來越高,對 CDN 的要求也越來越高。
騰訊 CDN 得益于公司業務的蓬勃發展,先后支持了游戲下載、流媒體視頻加速、春節紅包等公司內部業務;2014 年騰訊 CDN 開始接入第三方客戶,比如快手點播、斗魚直播等。
以上各種業務都有突發場景,騰訊 CDN 在這些年的發展過程中,關于如何保障業務突發,積累了豐富的經驗。接下來從挑戰和問題、解決方案、效果三個方面來解析。
挑戰和問題
下面將從業務特點開始,分析目前存在的挑戰和問題。
01業務特點和挑戰
CDN 多樣化的場景,注定了突發業務充滿挑戰。突發業務具有三大特點:
- 體量大。突發業務帶寬大部分都超過 Tb,部分甚至達到了 10T。
- 場景多樣化。點播中的熱劇和新聞爆點;直播中的 LOL/KPL/DOTA2 等游戲直播,NBA/世界杯等體育直播,演唱會等綜藝直播;應用下載中的王者榮耀等游戲下載;靜態網頁加速中的紅包活動、電商促銷等。
- 無規律。部分突發活動無法預知,活動快要開始或已經開始了才知道,比如新聞爆點。
體量大,需要準備更多的資源;場景多樣化,需要滿足不同的資源需求;無規律性則對我們的擴容效率提出了很高的要求。
02目前存在的問題
僅僅為了滿足業務突發需求而儲備大量的資源,成本太高,會造成資源極大的浪費。所以一般會通過復用資源來應對業務突發。
直接復用資源,存在兩個問題:
- 只能復用部分資源。CDN 業務,一般按業務類型來區分平臺和資源使用,主要原因是不同業務類型對資源需求不同,比如點播類需要更多的存儲;有較多 https 請求的靜態頁面類,則需要更多 CPU 資源。
這種限制使得資源無法充分利用,加大了資源準備的難度。比如視頻突發主要使用視頻 Buffer,而下載類和網頁類 Buffer 無法直接使用,這限制了 Buffer 的大小。即使復用同類型資源,因為涉及多個業務資源的協調,準備時間一般會超過兩天,無法應對臨時突發情況。
- 無法降低成本。針對部分突發業務,比如游戲應用下載,帶寬高峰期在上午和中午,如果只使用本平臺資源,會導致結算帶寬明顯上漲,從而增加成本。無法利用同其他業務錯峰的特點來降低結算帶寬。
解決方案
通過虛擬化復用現有資源,搭建全業務通用的突發池,所有平臺共享 Buffer。突發池中的設備為 Docker 虛擬機,虛擬機有不同的規格,只要業務有需求,都可以按需使用。
突發池中的帶寬儲備達到了 10Tb,基本能滿足所有業務的突發需求 。任何業務有突發需求,配合自動化上架接口,可在 10 分鐘完成 10Tb 突發池的擴容。
01突發池系統架構
圖1:突發池系統架構
突發池:在各平臺物理機的上層,由 Docker 虛擬機組成的資源池,對 CPU/內存/磁盤等使用進行了限制,防止對物理機造成影響。原有業務依然部署在物理機上,不用調整。
自動化部署和監控系統: 根據業務實際需求,自動預測需求并擴容 。所有的突發需求,都能在 10 分鐘內擴容完成。針對點播/下載業務,自動分發熱點文件,降低回源帶寬。
調度系統:針對突發業務的突發性和體量大兩個特點,使得相比域名調度系統,直通車更占優勢。直通車調度更靈活,生效時間快,能達到分鐘級。
虛擬機和物理機部署了上報 Agent,業務信息和服務器負載每分鐘都會上報到監控系統。監控系統會根據歷史帶寬預測一個值,并與當前帶寬比較,如果當前帶寬超過預測值的 50%,則認為有突發。
根據帶寬上漲的比例,系統會自動從突發池中擴容相應數據的設備。針對提前準備的突發活動,運維可以指定帶寬需求量,之后系統便會自動計算設備需求并擴容。
分鐘粒度上報的服務器負載信息則為監控系統做調度決策提供了依據。系統會依據機房剩余帶寬、服務器帶寬、CPU、IO 等綜合信息決定虛擬機是否需要從直通車中啟用或者禁用。
用戶訪問時先請求直通車調度系統,直通車會根據調度策略返回一個 302 地址,此302 地址為實際 CDN 資源地址。用戶跳轉到 302 地址,并獲取實際內容。
02技術優化
使用虛擬化技術復用資源的重要前提是不影響現有業務。這就要求對資源有充分的隔離,比如 CPU/磁盤,以及對帶寬的使用。
下面是實現過程中存在的幾個問題及解決方案:
精準控制單機負載
負載過高會影響業務質量,需要對單機負載進行精準的控制。
解決方案:
- 配額系統:直通車中有配額系統,對每個虛擬機可使用的資源做了限制,包括 CPU/IO 和帶寬。監控系統中上報的信息,結合配額系統,可以確保服務器負載被限定在指定的范圍內,粒度為分鐘級。
- 部分請求返回 302:對 CPU/帶寬/IO 等做了限制后,應用程序能根據母機當前負載,實時判斷是否處理一個請求。
如果負載在限制范圍內,直接處理;如果負載超出限制,則返回 302,使用戶跳轉到直通車的調度地址,這樣能在盡量不影響業務質量的情況對負載做精準控制。程序層面對負載的實時控制,是配額系統的有效補充。
- 網卡流量控制:在極端情況下,業務帶寬超過設定閾值,這時虛擬網卡會主動丟包,避免對母機造成影響。
限制磁盤大小
Docker 在 ext3 / ext4 文件系統中無法對文件/目錄級別進行磁盤大小限制。
解決方案:由于騰訊 CDN 業務基本都是使用 ext3 / ext4 文件系統,這種情況下 Docker 只對根據用戶或用戶組對磁盤進行限制,但現網業務都是直接在 root 環境下使用。
這里我們使用 loop device 來解決磁盤大小限制問題。虛擬機中突發業務使用掛載在 loop device 上的目錄,這樣就可以間接限制磁盤大小,防止使用太多磁盤影響其他業務。
CPU 綁定
默認是綁定所有 CPU,部分單 CPU 負載高會影響母機業務。
解決方案:通過腳本每分鐘采集一次系統所有單 CPU 負載,為避免頻繁調整和受毛刺數據影響,選取 15 分鐘的均值。
***選取負載較低的部分核,并通過配置文件 cpuset.cpus 來動態綁定,將虛擬機對母機業務影響降低到最小,并且能充分利用資源。
應用效果
突發池上線后,支持了王者榮耀下載、NBA 直播、KPL/LPL 游戲直播等多次大型突發活動,節約成本 2000 萬。通過共享 Buffer,搭建突發池能顯著提高突發能力和降低成本。
總結
騰訊 CDN 通過 Docker 技術復用資源,搭建 Tb 級別突發池,能支持直播、點播、靜態等各種業務突發,能自動檢測到業務突發需求并在 10 分鐘內完成資源擴容,具有發布快,成本低等特點。
資源復用能提高資源利用率,為業務提供極大的突發池,但要注意復用業務之間不能相互影響,這需要對服務器進行實時的監控和及時的調度。
另外還有一些待改進的地方,比如內核參數基于容器隔離,方便不同業務調優;部分業務客戶端不支持 302 跳轉,調度系統需要支持域名調度方式。