本文從三個方面來為大家介紹資料庫遊戲行業最佳實踐:
- 遊戲架構中資料庫的應用和需求分析
- 遊戲中Redis/Tair的技術水位
- MongoDB的遊戲最佳實踐
一、遊戲架構中資料庫的應用和需求分析
遊戲主流架構有三種:1.分區分服。2.全區全服。3.全球同服。
1.1 Alibaba Cloud Database in gaming servers (分區分服)

見上圖從上、中、下三路來介紹:
上路是當使用者登陸擷取遊戲帳号時,能擷取伺服器的分區資訊和版本資訊等,使用者的帳号和訂單等存在關系型資料庫PolarDB裡。使用者分區分服和資訊緩存到Redis/Tair的資料庫裡,紅色是資料庫用法,黃色是緩存的使用場景。
中路是遊戲核心GameServer強計算型資料結構。遊戲中的經驗和裝備會定期刷入資料庫中。遊戲資料的人物角色存儲以Json半結構化寫到資料庫裡,資料可以使用PolarDB和MongoDB。在GameServer有分布式鎖、排行榜、選角記錄等,會引入Redis 服務或阿裡雲的Tair。
下路很重要,遊戲中有很多活動,大量的日志記錄被存放到一個分析性資料庫中。比如遊戲投放活動後想看是否有效果,就要分析資料庫形成的報表。分析性資料庫很重要的作用是反作弊,防黃牛/防刷等。要做資料分析需要導入不同源,比如日志、角色、賬号等。阿裡雲的AnalyticDB最适合做這個工作。
見圖檔右上角,分區分服遊戲有點到點和跨服對戰等互動資訊,這種消息系統使用Lindorm服務區存儲。
1.2 Alibaba Cloud Database in gaming servers (全球同服)
全球同服是各大遊戲廠商重點投入的一個的架構。因為使用多種遊戲平台比如PC、手機、Switch和PlayStation等遊戲主機進行無縫的遊戲和互動,會将使用者的體驗提升到一個非常出色的水準,國内也有這種遊戲在全球大賣。
全球同服的架構特點是使用集中式的資料庫,前端不同區域的遊戲中心會将資料集中的寫到統一的資料庫中。全球同服技術的核心是每個區域的Cache Server,它是提升遊戲體驗的核心,會定期的将資料批量刷入後端資料庫,也會将資料庫中更新的條目更新到其他服。
1.3遊戲行業對資料庫的整體需求
遊戲行業本身高度依賴記憶體計算和網絡資源,然後才是資料庫。我走訪過很多遊戲客戶,記得有一位遊戲大廠CTO和我說:“遊戲裡最遠的距離,不是資料到資料庫的距離,而是聯通到電信的距離”。
但雖然遊戲行業整體上對資料庫性能要求并不高,但是它對資料庫的穩定性、平滑性和可運維程度要求非常高。
首先就是擴縮容的平滑性。由于阿裡的資料庫技術開始是圍繞電商發展起來的,而電商系統和遊戲系統這兩個行業在使用緩存和記憶體資料庫的方式上卻高非常不一樣。舉個例子說,電商對資料庫容錯的需求大都是“早死早超生”的哲學,做fast fail。如果通路資料失敗,資料層需要做快速失敗而不能卡住。這樣使用者才能快速重試,但是如果我們把這個邏輯套到遊戲服務中,如果通路一次兩次資料庫庫失敗了就把連接配接給斷了遊戲使用者可能就直接被踢出這局遊戲了。
是以我們專門在可擴充和高可用上做了連接配接保持能力,不但擴縮容不斷連結,在阿裡雲叢集版Redis/Tair上即使高可用事件發生,比如Tair後端資料庫做了切換,前端仍然可以保持連接配接不斷。在Tair的擴縮容事件中,對業務側的抖動可以達到100ms左右,基本接近無感。像PolarDB存儲計算分離的雲原生資料庫也具備切換和HA不斷連結的能力。這樣在平滑性上就有保障了,對于使用者的遊戲體驗來說也是一個非常大的進步。
另外一個場景是,雖然遊戲行業對資料庫的整體性能要求并不太苛刻。但是遊戲使用者也有萬人團戰、新區上線等熱門活動,這種對資料庫整體的抗壓能力和平滑可擴充能力要求很高。
全球同服的遊戲對資料庫的需求逐漸走向了跨域多活,現代資料庫的跨域多活也成為資料庫内置的核心能力之一,能夠極大的簡化使用者的使用場景。
1.4遊戲行業更青睐雲資料庫
遊戲行業是一個疊代速度極高的行業。在一些核心的服務能力上,比如在阿裡雲Tair上,它的存儲結構更接近客戶的資料更接近ORM,它提供了一些封裝好的分布式鎖、分布式排行榜、計數服務等能夠讓遊戲高速疊代起來。
同樣,遊戲使用者是資料庫運維操作最多的行業之一。這和遊戲本身的業務特點相關,比如有些分區分服的遊戲,它的營運和拉新模式就是開新服,合舊服這種。遊戲的營運活動頻繁,運維大量資料搬遷、資料清洗,有些分區分服的服務要經常合服、滾服和版本更新,發上去也要經常備份、回檔等。資料庫本身就要在資料庫核心上做增強,也要和周邊生态做互動。當代資料庫如果不把運維系統和生态系統當成一等公民去建設,逐漸的就會被市場淘汰。
在成本上池化資料庫能夠更好的在資源上做配置,達到更好的資源配置。在遊戲行業有兩塊成本被顯著低估了,一塊是運維成本,具備很高的彈性擴縮容的能力,可以極大的降低業務的成本開銷,比如Tair就可以随着使用者業務選擇記憶體引擎,如AEP引擎和SSD引擎。另外一塊是錯誤成本,本質上還是屬于研發成本的一部分,具備更好的可觀測性,能夠通過高效标準的生态工具同樣可以降低錯誤成本。
二、遊戲中Redis/Tair的技術水位
2.1 Redis/Tair目前遊戲能力技術水位大圖
在面臨穩定性,高速疊代和成本等問題時,雲資料庫有很大的優勢。在NoSQL資料庫領域,Tair和Mongo都支援Json的原生結構。另外非關系型資料庫針對遊戲高速疊代非常友好,比如在運維上Tair可以做任意時間點的資料恢複, Tair在擴縮容和容災上都具備連接配接保持能力。資料庫也支撐存算一體的能力,在Tair上具備非常多的資料子產品,可以友善遊戲使用者做分析和計算等。
Tair雲原生記憶體資料完全相容了Redis協定和指令。Redis是遊戲服務中必不可少的資料庫之一,上面的架構圖已經介紹過了,它可以服務緩存和記憶體資料庫兩種場景。
但是在原生的社群Redis上,它的探活和擴縮容都非常不平滑。在雲Redis上做有很大改良但是還是閃斷;到了Tair上就可以做到連接配接保持、高精度探活和切換;如果自運維Redis在備份恢複上,就隻能全人肉運維了。雲Redis可以通過很好的基礎設施無感覺和自動化搞掉,Tair可以很好的保證資料安全和任意時間點的恢複。針對AEP/SSD引擎,還有可調節的版同步能力在上線中,可以更好的适應資料無損場景。
雲資料庫具備更好的可觀測性,比如Redis裡面一旦遇到大Key,熱Key就很難觀察到。雲資料庫在核心上極大的提升了可觀測性,在Tair上就有更好的可控制性,比如熱點在雲Redis上可以被發現,在Tair上就可以使用加速能力能夠瞬間将單個Key的讀能力提升幾十倍。這個能力來自于電商系統中的熱點散列技術,是一個簡化版,但在與服務中針對遊戲的場景做了更靈活的優化配置能力。遊戲中并不會出現像電商系統中出現全民搶茅台這種數百萬級别的熱點通路,而查詢緩存足以讓遊戲業務更好的應對突發事件和洪峰挑戰。
Redis經常工作在同步鍊路,慢了就會直接影響體驗。遊戲裡面遇到就要先頂過去再說,後續慢慢查慢慢修。還是那句話,雖然遊戲對資料庫性能要求并不高,但是保險一定要有。
在加速開發上,自運維的Redis可以運作一些Redislabs設計的企業級子產品,但是這些子產品雲廠商不能用。Tair上做了特别多的業内常用的多資料子產品,有一些是完全相容Redislabs子產品,比如遊戲裡面常用的Json子產品完全相容reJSON。TairZset是一個多元度排行榜,也可以使用我們提供的SDK做一個可擴充、高性能的分布式排行榜,它也是基于TairZset。在上線中的是TairSearch,它相容Elasticsearch的文法,可以對存放在Tair的内容做全文索引和分詞,這樣結合Tair引擎的強大能力可以做到一個非常好的遊戲體驗。
2.2場景: Tair的全球多活在遊戲中的使用
下面介紹幾個場景,第一個場景就是資料庫多活。這個場景在全區全服的遊戲裡面應用的非常廣泛。
說一個切身體會,就是最近一個老牌的遊戲大廠,上線了一個全球同服的遊戲。它把一個20年前的遊戲重制了一下,把分區分服改成了全球同服,結果非常不成功,直到今天,就是現在你去玩的時候,登陸的時候都在排隊。很遺憾我是這個遊戲的骨灰級玩家,我的黑眼圈大多數是因為工作導緻,最近加重了其實和這個遊戲很有關系。
前兩天在論壇上,他們的技術經理寫了一篇非常長大概3000多個單詞的文章,解釋了為什麼會出問題。我仔細去閱讀體會了好幾遍,其實都是在解釋業務資料在面臨全球多活時的技術挑戰。既要好的體驗,又要保證資料一緻。如果沒有一個全球多活的資料庫,那麼即使是一個技術和策劃都非常強的老牌遊戲公司也同樣會陷入困境。
如果我不是因為情懷,真的就把這個遊戲退掉了,天天掉線回檔是無法忍受的。使用Tair等全球多活資料庫能夠給使用者一個很好的體驗,可以讓全球多活遊戲有非常好的體感。
圖中就是一個遊戲客戶的典型用法,中美遊戲伺服器的商場漫遊。
2.3場景: 任意時間點資料恢複(PITR)
第二個場景是任意時間點的資料庫恢複。這個場景最早是防止删庫跑路的場景。在遊戲行業裡用途非常廣泛,比如遊戲發版本,出問題能夠迅速復原。同時我們也挖掘了遊戲客戶的回報和建議,在任意時間點恢複的時候,可以選擇性的恢複部分Key/Key Pattern,也可以選擇性的丢棄某種類型的Key/Key Pattern都支援。這個Key級别的PITR就是專門為遊戲行業定制開發的,資料庫産品能夠多貼着遊戲的業務場景做一些能力,那麼業務的幸福感提升還是很高的,也降低了犯錯機會。
2.4 Tair(Redis企業版)支援的資料結構子產品 (modules)
Tair作為企業級的Redis,它的一個典型的特點就是支援非常多的擴充子產品,既包括簡單易用可以提升幸福感的資料結構,也包括一些行業級整體解決方案。在本次分享中我隻簡單說一下畫圈的這幾個,它們在遊戲開發中經常遇到。
2.5場景:高性能分布式鎖(CAS/CAD)
所有網際網路應用都需要分布式鎖做類似于資源競争的處理。我們在Redis場景下發現業内有非常多的分布式鎖的實踐案例,但很多都實作的有問題。主要技術點就是分布式鎖删除不對,有可能會導緻業務側的資源争搶失效。我們在Tair引擎裡做了分布式鎖,隻需要設定一下就能減少犯錯的成本。阿裡集團内部、遊戲和網際網路行業分布式鎖用得很多,這個Tairstring子產品已經開源沒有限制了,使用者用Redis套上去就可以用,可以獲得比較好的收益。
2.6場景:多級排序和分布式排行榜
Redis的排行榜是所有遊戲繞不開的問題,排行榜的問題是大Key很難做并行的擴充,遊戲裡的排行榜會故意設計地比較深,特别不容易點到,Redis的排行榜最痛的是容易形成大Key和隻能為一維資料進行排序,攜帶的額外資料有限。
我們也給遊戲裡多元度的排序做了子產品,通過子產品的擴充做分布式排行榜,服務能力通過分片數和整體的資源上升做到平衡擴充,為遊戲使用者解決大查詢的問題。
同樣TairZset子產品也已經開源了,結合着Tair的SDK中分布式排行榜,使用者可以很容易的應用可擴充高性能排行榜這個基礎設施。也不需要維護一個專門的排行榜團隊,畢竟一些中小型遊戲公司并沒有精力去投資一個專業的排行榜團隊。
從以上的介紹我們可以看到,資料庫核心能夠幫助沉澱一些能力到引擎中,那麼就能夠極大的簡化業務的開發,這對于遊戲行業的高速疊代是非常重要的。在2017年曾經在資料庫行業内掀起過一場轟轟烈烈的Multi-Model運動即多模資料庫。多模能力大背景上就是資料庫在對行業做深耕,而Tair提供的這些能力即是阿裡雲上諸多客戶的真實需求,也同樣是阿裡内部系統使用最多的資料結構。
2.7遊戲的雲資料庫周邊設施(DTS/DAS)
關于遊戲的合服、滾服操作,過去都做的非常原始。要麼是自己做備份、清洗和合并,要麼就是自己寫個長SQL去做資料變更。這些工具、方法要麼是按照約定,要麼就是祖傳腳本口口相傳。有些原始的雲服務還要提個合服工單什麼的。在當代資料庫生态裡資料的訂閱(CDC)和轉換清晰(ETL)已經是資料庫生态的一部分,它通過标準的全量和增量訂閱,可視化的進行過濾、映射等算子标準化的支援掉。
阿裡的DTS即完整的支援Tair的Binlog協定。整個資料滾動和運維的成本會非常低廉,并且可控制。生态工具仍舊是諸多資料庫的護城河,也同樣是一等公民需要建設。
像Redis或Tair高速資料庫服務時可觀測性很重要。遊戲出現大Key可能稍縱即逝,我們DAS平台提供非常好的可觀測服務可以看到實時場景。DAS的可觀測、可控制、審計優化件的動态帶寬可以幫助使用者減輕運維操作。
三、MongoDB的遊戲最佳實踐
3.1使用MongoDB應對遊戲資料庫常見痛點
MongoDB遊戲架構原生是Mongo去支援,Mongo是原生支援Json結構,适合遊戲存使用者資料。
3.2從開發運維視角看阿裡雲MongoDB
MongoDB适合遊戲的結構化存儲,無論分區分服場景還是全球同服,規格比較全可以自己配置。MongoDB到了阿裡雲的雲上後,結合雲化設施能力會更強,做快照備份恢複雲化設施實作秒級快照。擴縮容能力彈性好,雲化設施做Scale、up down等都是非常平滑的。同時MongoDB端到端的安全解決方案也非常多,也更加标準化和便捷,同樣可以用作很好的防作弊,防機器人場景。
以上就是我對阿裡雲資料庫在遊戲行業使用的一個簡單總結,謝謝大家!