兩萬人線上伺服器架構和一些公有云使用心得

weixin_33709219發表於2016-11-27

感謝各大公有云不斷的技術創新,使得人(zhi)丁(you)稀(1)少(ge)的我們,能夠在三個月內完成支援線上2萬人的伺服器組,以支撐即將到來的江湖X資料片“世界服”。�

本文主要寫給程式猿看,所以會有大量的晦(zhuang)澀(bi)語句,不感興趣的還是跳過吧。。吐槽在最後

正文

本文主要是短句子的羅列。

組成

我們一個標準的伺服器組,由以下部分組成:

  1. 兩個負載均衡,一個掛目錄服,一個掛遊戲服;負載均衡由阿里保證雙可用區高可用;
  2. 至少兩個目錄服ECS,分別在兩個可用區;
  3. 至少兩個遊戲服ECS,分別在兩個可用區;
  4. 至少一個管理服ECS;
  5. 至少有一個例項充當所有ECS的備用;
  6. 三個Mysql資料庫,賬號mysql,資料mysql,統計mysql,阿里保證雙可用區高可用;
  7. 兩個Redis,資料redis和公共redis,阿里保證雙可用區高可用;

要點

  • 為了與客戶端程式碼語言的一致性(U3D),我們後臺都是用.Net實現的,所以所有例項都是windows例項,逼格比linux少了90%,易用性提升90%(PS:VS是世界上最好的IDE);
  • 將所有線上玩家的存檔資料(約500kB/人),放在一個高效能的支援事物的資料redis裡面,由這個redis來充當“公共記憶體”,給多個遊戲服ECS使用;
  • 玩家離線一定時間之後,將存檔資料序列化存入Mysql;玩家再上線的時候,從mysql取出資料反序列化放入redis;
  • 所有的統計資料和不需要多次查詢的資料,放入一個專用的“統計Mysql”;
  • 所有的玩法級別的東西,例如PVP,世界boss,好友系統等,都放入一個redis裡面,我們稱為“公共redis”,這個redis其實是當資料庫使用,redis本身就支援持久化(用阿里預設的備份功能就行);
  • 所有伺服器配置放在mysql裡,目錄服和遊戲服初始化的時候會去資料庫載入配置;
  • 目錄服處理玩家註冊、登入,以及遊戲版本、伺服器狀態和熱更包的下發;
  • 遊戲服主要是保持與玩家的socket長連線,並與mysql/redis互動資料,自身記憶體不儲存任何狀態資訊;
  • 管理服主要是用來管理所有的mysql和redis,並計算一些玩法級別的東西,例如PVP結算,世界boss結算,客服後臺,郵件公告等;

優缺點

  • 遊戲服ECS不儲存任何狀態,不需要考慮同步、加鎖等問題,隨點隨用,一秒重啟不是夢(手遊裡,秒級的資料丟失是可以接受的);
  • 通過redis和mysql的原生事務來保證原子性,不需要coding來實現,省時省事效率高,雖然效能低下,不過效能,夠用就行;
  • 充分利用公有云的高可用性和一切便利性,能不自己做的堅決不自己做,能花(xiao)錢解決的堅決不花時間;(這一點大家算算程式猿工資就知道哪個划算了,現在一個例項才多少錢);
  • 參考上點,這麼做的一個缺點就是花費稍微大了點(多了redis的花費,很貴;多了一些例項,因為CPU沒用滿,可以用效能換空間),從一千塊一個月變成了兩三千一個月,一年多出了一個程式設計師的月薪(手動滑稽);

Redis相關

  • 江湖X每個線上玩家,對“公共redis”,會產生大概每秒2-3的QPS(最早的設計,好蠢,還不能改);
  • 阿里雲和Ucloud目前的主備版redis,能支援6萬的QPS;
  • 單臺例項連線redis,能達到2萬的QPS,四臺例項的時候,每臺1萬5的QPS;
  • 一個玩家在redis中的資料,平均為500k(好蠢,同上);
  • 所以,一個16G的redis,能支援1.5-2萬線上,3萬左右的資料保有量;
  • 以20萬日活來計算,玩家離線3小時,就需要把資料從redis移到mysql;
  • 單臺例項能支援5000-7000的線上使用者;
  • 如果單臺16G例項扛不住,考慮加多個redis,只需要維護一個使用者所在redis的表就行,一個使用者只能在一個redis裡;
  • redis儘量用hash,能比key-value快一半;
  • servicestack.redis,推薦4.0版本以上,事務回撥很完善;
  • 阿里不支援sync命令,無法自建slave例項;Ucloud支援sync命令,所以slave可以走起;
  • Ucloud的redis沒有密碼。。沒有密碼。。。所以不小心一個flushall,就哭吧,適合小公司;
  • 阿里最近上了叢集版的redis,最小16G,QPS令人髮指(幾十萬),不過不支援事務。。。。如果自己在程式端實現了redis事務而不用原生事務(米哈遊就自己寫的),那麼用叢集版redis,幾十萬線上不是夢啊,以後會不會是一個叢集redis,掛著幾十臺1核1G的例項,最便宜的1核1G只要33/月,10臺330,能跑幾萬個TCP長連線;

網路相關

  • 由於主要的計算都發生在客戶端,因此江湖X的網路負載很小;
  • 歷史遺留原因,我們採用Scut來做多使用者管理和網路分發(socket),並且到目前為止,表現不錯;
  • 採用負載均衡,並且按量付費,是目前最適合我們的解決方案;(負載均衡一般都能支援幾十萬的TCP連線)
  • 熱更包地址由目錄服下發給客戶端,客戶端去CDN上下載;
  • 阿里的cdn越來越好用,秒級回源,不過有時候也會掛掉(今年掛過一次);
  • 阿里出過一個事情,就是某臺例項的IP被中國移動給ban了,導致所有移動玩家上不去伺服器;
  • 一般玩家說掉線頻繁,第一反應都是問對方,“你是不是中國移動4G“,95%都是;

Mysql相關

  • Mysql還挺貴的;
  • 一個使用者一秒才0.3次QPS,所以2核4G的mysql應該夠我們用了;
  • mysql和redis可用區切換,程式要自動重連(感謝servicestack);半年內,有一個mysql切換過一次;
  • 定期看一下慢日誌,說不定就找到一些漏網之魚沒有建索引;
  • Ucloud的Mysql,回檔會損壞blob資料,原因未明,需要問一下;

計算相關

  • 除了rank系統,計算量都幾乎沒有;
  • 資料從redis移動到mysql計算量比較大,交給管理服;
  • rank系統的戰鬥計算,需要在服務端進行,準備引入MQ,通過MQ來進行計算任務的下發和結果的採集;
  • 一些定點結算(遍歷所有玩家)的任務,都在管理服做,例如排行榜結算、世界boss結算,活動結算;
  • CPU比較過一次,各家相同價位都差不多;

磁碟相關

  • 對磁碟I/O沒有任何要求,所以阿里雲用起來沒有問題(阿里雲的磁碟I/O就是辣雞,ssd盤都比不過ucloud的普通盤)

各家吐槽

  • 阿里,對磁碟沒有要求的話,阿里是最佳選擇了,穩定性,易用性很好,價格不貴,就是服務差,店大欺客,買了就不能退(包月),退還要手續費(包年),以前吃不完的還不能打包(不能降配),就是一黑店啊;另外,高可用和高併發,阿里說第二,沒人敢說第一;
  • Ucloud,阿里降價之後,價格大概是阿里的80%。優點很明顯,服務好,還有,包月包年機器隨時可以退,並且只計算髮生費用,這簡直逆天啊;缺點也很明顯,可用區少啊。。全國只有北京有多可用區,還資源緊張;我們需要的華南只有一個可用區,只好揮淚斬馬謖;還有就是太靈活,以致不敢用,特別公司大了,風險比較大,例如mysql給root許可權,redis無法設定密碼等;
  • Azure,聽說用它的人才能準確發音,反正我發不準。這是世界上唯一的一�個公有云,產品文件是由程式猿完成的,並且,還是機翻成的中文。這都還好,增加的是學習成本,但是,價格是阿里雲的兩倍是幾個意思?
  • AWS,如果要有海外服,我們首選就是AWS,沒什麼好說的;額,同理,國內的AWS,也沒什麼好說的,”不敢“用;並且,機房在北京和銀川,離廣東太遠了,電信南北光纖,最近每個月要故障兩次,丟包15%,電信威武;
  • 華為雲,功能少,貴;
  • 比格雲,宣傳得很有逼格,不敢用,有待時間驗證其穩定性;
  • 京東雲,聯絡過,沒叼我們;
  • 騰訊雲,持續關注,有可能會要用(應用寶上游戲必須架在騰訊雲上);
  • 百度雲,等等,這不是存小黃片的麼?

相關文章