(文章轉(zhuǎn)自公眾號:又拍云)
日前,又拍云攜手 CloudFlare 共同舉辦了出海企業(yè)網(wǎng)絡(luò)安全專場技術(shù)沙龍,通過深度剖析當(dāng)前企業(yè)出海業(yè)務(wù)面臨的安全難題,結(jié)合企業(yè)用戶實踐案例探討切實可行的、具有高性價比的安全解決方案。其中來自圖靈互娛運維工程師劉龍鑫,結(jié)合業(yè)務(wù)實踐經(jīng)驗,帶來了干貨滿滿的《游戲出海之運維小經(jīng)驗分享》主題分享。以下是現(xiàn)場演講整理,視頻及 PPT 可下拉文末點擊閱讀原文查看。
大家好,我叫劉龍鑫,來自廣州圖靈科技有限公司,主要負(fù)責(zé)公司日常的運維工作。這次很榮幸能和大家一起探討游戲出海相關(guān)的一些經(jīng)驗。我今天主要從以下五部分游戲出海過程中必須考慮的點進(jìn)行展開分享:
服務(wù)器部署地域的選擇
網(wǎng)絡(luò)和數(shù)據(jù)庫規(guī)劃
DDOS 攻擊緊急處理
服務(wù)器和數(shù)據(jù)監(jiān)控
國內(nèi)維護(hù)小妙招
服務(wù)器部署地域選擇
我們首先來看一下服務(wù)部署地域的選擇。服務(wù)器部署的地域決定了玩家進(jìn)入服務(wù)器的網(wǎng)絡(luò)狀況,也決定了玩家的體驗。保證一個通暢的網(wǎng)絡(luò),才能讓玩家在玩的時候更順暢,體驗更好。如果網(wǎng)絡(luò)容易卡頓,則很容易造成玩家流失。
相比國內(nèi)我們選擇北上廣任意一點就可以覆蓋全國的網(wǎng)絡(luò)情況,海外的網(wǎng)絡(luò)就比較復(fù)雜,需要我們格外認(rèn)真一些。下圖是我自己測試做的時延表,我們可以清楚看到各個地域網(wǎng)絡(luò)的時延差異非常大。

結(jié)合經(jīng)驗,我有兩條小建議給大家選擇服務(wù)器時做參考:
如果發(fā)行區(qū)域有本地節(jié)點,則優(yōu)先選擇本地節(jié)點:比如我們發(fā)行到臺灣,那服務(wù)器就直接部署在臺灣。這里特別需要提到的是,有些云廠商是擁有一個白名單的,這種需要找云服務(wù)申請后才可以開通對應(yīng)節(jié)點。比如我們要發(fā)行到某一區(qū)域,如果你看到列表上沒有,那最好可以問一下云服務(wù)商,他們可能通過相關(guān)白名單的方式提供給你想要的節(jié)點。
東南亞選擇新加坡或香港,美洲選擇弗吉尼亞,歐洲選擇法蘭克福。這幾個是我們根據(jù)我們已有項目總結(jié)出來的經(jīng)驗選擇,其他地域我們暫時還沒遇到,如果大家有需要那一定要做好網(wǎng)絡(luò)測試再確定選擇地點。
網(wǎng)絡(luò)和數(shù)據(jù)庫規(guī)劃
接下來我們說一下網(wǎng)絡(luò)和數(shù)據(jù)庫的規(guī)劃。因為海外玩家客戶端到服務(wù)端網(wǎng)絡(luò)的延遲比較大,同時也是為了提升他們的穩(wěn)定性,我們需要對網(wǎng)絡(luò)進(jìn)行最大可能的優(yōu)化,從而加速玩家的訪問,提升玩家體驗。
數(shù)據(jù)庫的規(guī)劃主要用于大數(shù)據(jù)分析。如果沒有提前進(jìn)行規(guī)劃,當(dāng)同一個游戲各區(qū)域數(shù)據(jù)集中到一起時,就會存在主鍵沖突和其他問題。而提到網(wǎng)絡(luò)規(guī)劃那我們必須要了解這兩個產(chǎn)品,對等連接和 Anycast IP。
對等連接能夠打通兩個 VPC 網(wǎng)絡(luò),使它們能進(jìn)行內(nèi)網(wǎng)通信。它的優(yōu)點在于能夠讓兩個 VPC 網(wǎng)絡(luò)通過云服務(wù)商自建的內(nèi)部網(wǎng)絡(luò)進(jìn)行通信,不受公網(wǎng)質(zhì)量影響,這大大提升了可用性,保證了時延和丟包率。

如上圖所示,如果一個游戲在歐美同時發(fā)布,但是共用一個后臺,這時無論后臺在美國還是歐洲,只要是走公網(wǎng)進(jìn)行訪問就沒辦法保證網(wǎng)絡(luò)質(zhì)量。比如把后臺放在美國,美國本地的服務(wù)器在同一個 VPC 內(nèi)肯定不影響訪問,但是歐洲服務(wù)器走公網(wǎng)訪問就會非常不穩(wěn)定。這時候我們可以通過對等連接,走內(nèi)網(wǎng)降低它們內(nèi)部訪問之間的時延和丟包。事實上我測試過,從歐洲的法蘭克福到美國的弗吉尼亞時延在80毫秒左右,這是一個能夠讓人接受的范圍。
Anycast IP 采用 Anycast 的方式,把 IP 發(fā)布到多個地域,讓請求包根據(jù)傳輸協(xié)議到達(dá)最優(yōu)的 IP 發(fā)布地域。它的優(yōu)勢是實現(xiàn)了 IP 傳輸?shù)馁|(zhì)量優(yōu)化和多入口的就近接入,減少了網(wǎng)絡(luò)傳輸?shù)亩秳印G包。
如果我們在海外發(fā)布一個共用 SDK,而且還是多地域發(fā)布的話,因為海外運營商很多,很容易導(dǎo)致丟包時延。那么不管玩家是訪問 SDK 還是游戲和 SDK 進(jìn)行校驗,只要 SDK 在本地沒有節(jié)點,走公網(wǎng)進(jìn)行訪問的話,用戶的體驗就會比較差。這時我們就可以通過 Anycast IP 對 SDK 進(jìn)行網(wǎng)絡(luò)優(yōu)化。或者選擇對等連接+反向代理+域名分地域解析的方式,把 SDK 的域名分別解析到不同地域,讓用戶請求的時候可以請求到對應(yīng)節(jié)點。

如上圖所示,SDK 源節(jié)點在新加坡,而我們在香港、臺灣、日本建立四個反向代理節(jié)點。當(dāng)我們將解析分別接到這三個節(jié)點后,用戶請求時就會請求到自己國家的節(jié)點,再通過這些節(jié)點反向代理走云服務(wù)商內(nèi)部網(wǎng)絡(luò)到源節(jié)點,這樣就能夠進(jìn)行一次及時的響應(yīng),讓用戶在體驗上有所提升。
網(wǎng)絡(luò)規(guī)劃
我們前面提到的對等連接,如果需要使用對等連接則必須要提前對網(wǎng)絡(luò)進(jìn)行規(guī)劃,網(wǎng)絡(luò)規(guī)劃的考慮主要基于以下兩點:
各 VPC 網(wǎng)絡(luò),不在同一個網(wǎng)段
各地域根據(jù)項目的情況,預(yù)留出對應(yīng)的網(wǎng)段。不同項目使用不同網(wǎng)段。
數(shù)據(jù)庫規(guī)劃
數(shù)據(jù)庫規(guī)劃主要是為了提前防止數(shù)據(jù)沖突,主要就是根據(jù) auto_increment_increment 和 auto_increment_offset 兩個 MYSQL 的質(zhì)證參數(shù)。提前進(jìn)行數(shù)據(jù)規(guī)劃能夠防止起點設(shè)置過長,方便大家把各個數(shù)據(jù)中心的數(shù)據(jù)導(dǎo)入到一起,避免大數(shù)據(jù)分析時出現(xiàn)數(shù)據(jù)沖突。
DDOS 攻擊緊急處理
這是本次分享的重點,因為海外發(fā)行游戲特別是在港臺地區(qū),只要上榜就很容易受到攻擊。所以我們需要在游戲上線前就做好防護(hù)預(yù)案,這樣當(dāng)攻擊發(fā)生時我們就能按預(yù)案進(jìn)行緊急處理。
對于中小型廠商來說,高防的成本較高,而且流量經(jīng)過高防后會導(dǎo)致少量正常用戶一塊被清洗掉,所以導(dǎo)致很少有中小型廠商選擇接了高防再上線游戲,一般都是遇到了攻擊的時候才接入高防。但是上線后再接入高防比上線前接入,在時間上的緊迫感更大,一個剛上線的游戲不可能長時間的停服和測試來對接高防。因此在上線前我們一定要有詳盡的預(yù)案和測試,這邊給大家?guī)c接入高防需要注意的地方。
攻擊范圍
一般我們上線都是新游戲和 SDK,因此需要將這兩部分都考慮進(jìn)去,不然不管對面攻擊哪一部分都會導(dǎo)致游戲的不正常。
高防產(chǎn)品的選擇
這里需要考慮到兩點,首先是成本。我們要根據(jù)攻擊的情況,提前考慮到自己能夠接受的成本有多高,十萬還是二十萬,一旦超出這個成本就需要考慮其他方式。第二是考慮是否有本地高防,因為我們要把正常的流量轉(zhuǎn)入高防進(jìn)行清洗,這相當(dāng)于網(wǎng)絡(luò)鏈路的加長,如果有本地高防就可以更快的完成清洗過程,讓用戶體驗更好。
游戲的黑白名單
我們大部分游戲都有黑白名單,這可能會導(dǎo)致游戲接入高防后無法登錄。這個問題是我們前年上線一款產(chǎn)品時確實遇到的情況,當(dāng)時在接入高防后就出現(xiàn)了無法登錄的情況,造成了剛上線就被迫停服檢查,后來才發(fā)現(xiàn)是游戲黑白名單出現(xiàn)的問題。因此我們需要提前做好測試,確保各方面都是正常的。
游戲要提前做好雙 IP
當(dāng)攻擊來臨時原本暴露的 IP 會因為被攻擊而無法正常連接使用。因此我們需要有另一個備用 IP,并且在上線前就讓每臺機器都綁定兩個 IP。同時保證一個是隱藏起來的不被外界所知。
Nginx 轉(zhuǎn)發(fā)文件準(zhǔn)備
為什么要做 Nginx 轉(zhuǎn)發(fā)文件準(zhǔn)備呢?因為有些端口,比如 80、443 這類常用端口,很容易重復(fù)。而且因為高防成本的問題,很難買多個高防 IP 或者多個高防產(chǎn)品進(jìn)行防護(hù)。所以我們的高防 IP 通常只有一個,這種時候就需要 nginx 的轉(zhuǎn)發(fā)。比如我們把流量從高防 80 端口轉(zhuǎn)發(fā)到某臺機器的備用 80 端口,然后在通過這臺機器的 Nginx 轉(zhuǎn)發(fā)到其他相應(yīng)機器上。這么做也可以節(jié)約我們的成本。
多提一句,除了通過高防來處理 DDoS 攻擊,CDN+負(fù)載均衡的方式也可以通過把攻擊分散到各個節(jié)點,從而避免需要防護(hù)的情況,這是我在和一些云廠商接觸的時候發(fā)現(xiàn)的。但是因為我們的游戲并不是使用的這種方法,所以大家可以拿去做個參考。比如又拍云和 Couldflare 的產(chǎn)品是用 Anycast IP 的,我們可以使用他們的 CDN 加上負(fù)載均衡的方式來進(jìn)行防護(hù)。
服務(wù)器和數(shù)據(jù)監(jiān)控
在游戲運行的過程中監(jiān)控是必不可少的,只有做好監(jiān)控才能及時發(fā)現(xiàn)并解決問題。而監(jiān)控又分為服務(wù)器和數(shù)據(jù)監(jiān)控,我們詳細(xì)說下。
服務(wù)器監(jiān)控
服務(wù)器監(jiān)控主要有兩方面組成,機器指標(biāo)監(jiān)控和進(jìn)程、日志監(jiān)控。
機器指標(biāo)監(jiān)控
機器指標(biāo)監(jiān)控相信大家都比較熟悉了,包括 CPU、內(nèi)存、硬盤、網(wǎng)絡(luò)這些。目前大部分的云服務(wù)上提供的監(jiān)控系統(tǒng)已經(jīng)基本完善了,只需要完成系統(tǒng)配置并根據(jù)自己的需要添加一下必要腳本,就可以滿足日常的監(jiān)控需求。
但是如果我們因為一些特色業(yè)務(wù)需求,比如需要對數(shù)據(jù)進(jìn)行匯總,進(jìn)行更深次分析的話。我們可能會需要 Zabbix,或者一些其他的監(jiān)控工具。這部分的相關(guān)文檔市面上有很多,我們就不展開細(xì)說了。
在游戲海外發(fā)行的過程中,除了基本的監(jiān)控外,網(wǎng)絡(luò)監(jiān)控是很重要的。因為我們的玩家來自很多國家,他們的丟包和時延都需要監(jiān)控來看。一般這類監(jiān)控都是根據(jù)腳本監(jiān)控的。比如我們的監(jiān)控標(biāo)準(zhǔn)是 10% 以內(nèi)的丟包,400 毫秒以內(nèi)的時延,然后每隔五分鐘檢查一次。當(dāng)?shù)谝粋€五分鐘檢測到有異常時我們是不會發(fā)送告警的,因為網(wǎng)絡(luò)有偶爾的小波動橫正常。當(dāng)相隔五分鐘后的第二次檢測依然有異常時,就代表超過了我們所涉的閾值,那么無論是丟包還是時延都會對網(wǎng)絡(luò)進(jìn)行郵件告警。這個監(jiān)控邏輯非常簡單,但是也非常有效。
進(jìn)程和日志監(jiān)控
進(jìn)程的監(jiān)控大家可以通過簡單的腳本來實現(xiàn)。當(dāng)進(jìn)程掛掉后我們可以將進(jìn)程掛掉時的情況、進(jìn)程重啟、重啟成功或者重啟失敗都通過郵件進(jìn)行告警,防止進(jìn)程中斷而不知道的情況。
日志的監(jiān)控一般指的是對游戲日志的監(jiān)控,常用工具是 ELK 工具,它可以對日志進(jìn)行收集,進(jìn)行日志分析和處理,并進(jìn)行郵件告警。
數(shù)據(jù)的監(jiān)控
數(shù)據(jù)監(jiān)控屬于業(yè)務(wù)監(jiān)控,一般是對游戲的充值、在線、注冊等數(shù)據(jù)進(jìn)行監(jiān)控。通常數(shù)據(jù)監(jiān)控都在游戲剛上線需要重點關(guān)注的時候加入。因為有時候服務(wù)器的監(jiān)控反饋不夠及時,數(shù)據(jù)監(jiān)控就可以保障業(yè)務(wù)的正常。比如日常晚上七點的游戲在線人數(shù)是 500,突然有一天只有 100 人了,出現(xiàn)了明顯的下降。那我們就需要考慮是不是游戲本身有 bug,或者被攻擊了。
除了數(shù)據(jù)監(jiān)控外,我們也需要對相關(guān)閾值進(jìn)行不斷調(diào)整。因為我們的業(yè)務(wù)在不同時間點的正常值是不同隊,如果我們要確保這個值能夠準(zhǔn)確反映當(dāng)前的狀態(tài),就需要進(jìn)行相關(guān)閾值的調(diào)整。
另外監(jiān)控也需要查詢數(shù)據(jù)庫,我們最好不要直接在相關(guān)表上進(jìn)行查詢,而是創(chuàng)建一個數(shù)據(jù)庫的視圖,避免因為慢查詢引發(fā)鎖邊等問題。
國內(nèi)維護(hù)之小妙招
最后我給大家講講一個我們國內(nèi)維護(hù)的小經(jīng)驗。因為國際出口有限,我們維護(hù)海外項目的時候,經(jīng)常會發(fā)現(xiàn)因為線路擁堵出現(xiàn)丟包高達(dá) 60% 以上,甚至 100% 的情況,這導(dǎo)致運營和開發(fā)人員完全無法對外海項目進(jìn)行維護(hù)。
其實在國內(nèi)維護(hù)海外項目主要涉及到服務(wù)器登陸、數(shù)據(jù)庫連線、后臺登陸三方面,通過這三個方面基本可以完成正常的海外維護(hù)。而且這三個方面又都可以通過國內(nèi)的云廠商來處理,因為云廠商都有一定的國際出口,假如云廠商位于香港的服務(wù)器不丟包,那就可以在香港服務(wù)器上進(jìn)行代理操作。我們可以在香港服務(wù)器上面搭建一個跳板機,先用跳板機再訪問項目對應(yīng)的機器,從而減少丟包和卡頓問題的出現(xiàn)情況。
數(shù)據(jù)庫也是一樣的,通過對香港服務(wù)器進(jìn)行授權(quán),走香港服務(wù)器 SSH 通道進(jìn)行登陸的速度就會很快。后臺網(wǎng)站也可以在香港服務(wù)器上搭建一套反向代理,讓國內(nèi)的運營人員綁定 host 進(jìn)行登陸。或者修改局域網(wǎng)域名解析,將解析解析在香港的 IP 上讓國內(nèi)的運營人員能夠順暢的訪問海外項目。
以上是我分享所有的內(nèi)容,謝謝大家。