感謝各大公有云不斷的技術創新,使得人(zhi)丁(you)稀(1)少(ge)的我們,能夠在三個月內完成支持在線2萬人的服務器組,以支撐即將到來的江湖X資料片“世界服”。?
本文主要寫給程序猿看,所以會有大量的晦(zhuang)澀(bi)語句,不感興趣的還是跳過吧。。吐槽在最后
正文
本文主要是短句子的羅列。
組成:
我們一個標準的服務器組,由以下部分組成:
- 兩個負載均衡,一個掛目錄服,一個掛游戲服;負載均衡由阿里保證雙可用區高可用;
- 至少兩個目錄服ECS,分別在兩個可用區;
- 至少兩個游戲服ECS,分別在兩個可用區;
- 至少一個管理服ECS;
- 至少有一個實例充當所有ECS的備用;
- 三個Mysql數據庫,賬號mysql,數據mysql,統計mysql,阿里保證雙可用區高可用;
- 兩個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%,電信威武;
- 華為云,功能少,貴;
- 比格云,宣傳得很有逼格,不敢用,有待時間驗證其穩定性;
- 京東云,聯系過,沒叼我們;
- 騰訊云,持續關注,有可能會要用(應用寶上游戲必須架在騰訊云上);
- 百度云,等等,這不是存小黃片的么?