前沿分享|阿里雲高階技術專家 王若(百潤): 資料庫遊戲行業最佳實踐

阿里雲開發者發表於2021-12-03
簡介:在遊戲的開發和運營當中,資料庫的使用場景非常多。面對遊戲訪問壓力、遊戲合服場景、遊戲排行榜等場景, 阿里云為使用者提供了最佳解決方案。

本文從三個方面來為大家介紹資料庫遊戲行業最佳實踐:

  • 遊戲架構中資料庫的應用和需求分析
  • 遊戲中Redis/Tair的技術水位
  • MongoDB的遊戲最佳實踐

一、遊戲架構中資料庫的應用和需求分析

遊戲主流架構有三種:1.分割槽分服。2.全區全服。3.全球同服。

1.1 Alibaba Cloud Database in gaming servers (分割槽分服)

 title=

見上圖從上、中、下三路來介紹:

上路是當使用者登陸獲取遊戲帳號時,能獲取伺服器的分割槽資訊和版本資訊等,使用者的帳號和訂單等存在關係型資料庫PolarDB裡。使用者分割槽分服和資訊快取到Redis/Tair的資料庫裡,紅色是資料庫用法,黃色是快取的使用場景。

中路是遊戲核心GameServer強計算型資料結構。遊戲中的經驗和裝備會定期刷入資料庫中。遊戲資料的人物角色儲存以Json半結構化寫到資料庫裡,資料可以使用PolarDB和MongoDB。在GameServer有分散式鎖、排行榜、選角記錄等,會引入Redis 服務或阿里雲的Tair。

下路很重要,遊戲中有很多活動,大量的日誌記錄被存放到一個分析性資料庫中。比如遊戲投放活動後想看是否有效果,就要分析資料庫形成的報表。分析性資料庫很重要的作用是反作弊,防黃牛/防刷等。要做資料分析需要匯入不同源,比如日誌、角色、賬號等。阿里雲的AnalyticDB最適合做這個工作。

見圖片右上角,分割槽分服遊戲有點到點和跨服對戰等互動資訊,這種訊息系統使用Lindorm服務區儲存。

1.2 Alibaba Cloud Database in gaming servers (全球同服)

 title=

全球同服是各大遊戲廠商重點投入的一個的架構。因為使用多種遊戲平臺比如PC、手機、Switch和PlayStation等遊戲主機進行無縫的遊戲和互動,會將使用者的體驗提升到一個非常出色的水平,國內也有這種遊戲在全球大賣。

全球同服的架構特點是使用集中式的資料庫,前端不同區域的遊戲中心會將資料集中的寫到統一的資料庫中。全球同服技術的核心是每個區域的Cache Server,它是提升遊戲體驗的核心,會定期的將資料批量刷入後端資料庫,也會將資料庫中更新的條目更新到其他服。

1.3遊戲行業對資料庫的整體需求

 title=

遊戲行業本身高度依賴記憶體計算和網路資源,然後才是資料庫。我走訪過很多遊戲客戶,記得有一位遊戲大廠CTO和我說:“遊戲裡最遠的距離,不是資料到資料庫的距離,而是聯通到電信的距離”。

但雖然遊戲行業整體上對資料庫效能要求並不高,但是它對資料庫的穩定性、平滑性和可運維程度要求非常高。

首先就是擴縮容的平滑性。由於阿里的資料庫技術開始是圍繞電商發展起來的,而電商系統和遊戲系統這兩個行業在使用快取和記憶體資料庫的方式上卻高非常不一樣。舉個例子說,電商對資料庫容錯的需求大都是“早死早超生”的哲學,做fast fail。如果訪問資料失敗,資料層需要做快速失敗而不能卡住。這樣使用者才能快速重試,但是如果我們把這個邏輯套到遊戲服務中,如果訪問一次兩次資料庫庫失敗了就把連線給斷了遊戲使用者可能就直接被踢出這局遊戲了。

所以我們專門在可擴充套件和高可用上做了連線保持能力,不但擴縮容不斷連結,在阿里雲叢集版Redis/Tair上即使高可用事件發生,比如Tair後端資料庫做了切換,前端仍然可以保持連線不斷。在Tair的擴縮容事件中,對業務側的抖動可以達到100ms左右,基本接近無感。像PolarDB儲存計算分離的雲原生資料庫也具備切換和HA不斷連結的能力。這樣在平滑性上就有保障了,對於使用者的遊戲體驗來說也是一個非常大的進步。

另外一個場景是,雖然遊戲行業對資料庫的整體效能要求並不太苛刻。但是遊戲使用者也有萬人團戰、新區上線等熱門活動,這種對資料庫整體的抗壓能力和平滑可擴充套件能力要求很高。

全球同服的遊戲對資料庫的需求逐步走向了跨域多活,現代資料庫的跨域多活也成為資料庫內建的核心能力之一,能夠極大的簡化使用者的使用場景。

1.4遊戲行業更青睞雲資料庫

 title=

遊戲行業是一個迭代速度極高的行業。在一些核心的服務能力上,比如在阿里雲Tair上,它的儲存結構更接近客戶的資料更接近ORM,它提供了一些封裝好的分散式鎖、分散式排行榜、計數服務等能夠讓遊戲高速迭代起來。

同樣,遊戲使用者是資料庫運維操作最多的行業之一。這和遊戲本身的業務特點相關,比如有些分割槽分服的遊戲,它的運營和拉新模式就是開新服,合舊服這種。遊戲的運營活動頻繁,運維大量資料搬遷、資料清洗,有些分割槽分服的服務要經常合服、滾服和版本更新,發上去也要經常備份、回檔等。資料庫本身就要在資料庫核心上做增強,也要和周邊生態做互動。當代資料庫如果不把運維繫統和生態系統當成一等公民去建設,逐步的就會被市場淘汰。

在成本上池化資料庫能夠更好的在資源上做配置,達到更好的資源配置。在遊戲行業有兩塊成本被顯著低估了,一塊是運維成本,具備很高的彈性擴縮容的能力,可以極大的降低業務的成本開銷,比如Tair就可以隨著使用者業務選擇記憶體引擎,如AEP引擎和SSD引擎。另外一塊是錯誤成本,本質上還是屬於研發成本的一部分,具備更好的可觀測性,能夠通過高效標準的生態工具同樣可以降低錯誤成本。

二、遊戲中Redis/Tair的技術水位

2.1 Redis/Tair當前遊戲能力技術水位大圖

 title=

在面臨穩定性,高速迭代和成本等問題時,雲資料庫有很大的優勢。在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的全球多活在遊戲中的使用

 title=

下面介紹幾個場景,第一個場景就是資料庫多活。這個場景在全區全服的遊戲裡面應用的非常廣泛。

說一個切身體會,就是最近一個老牌的遊戲大廠,上線了一個全球同服的遊戲。它把一個20年前的遊戲重製了一下,把分割槽分服改成了全球同服,結果非常不成功,直到今天,就是現在你去玩的時候,登陸的時候都在排隊。很遺憾我是這個遊戲的骨灰級玩家,我的黑眼圈大多數是因為工作導致,最近加重了其實和這個遊戲很有關係。

前兩天在論壇上,他們的技術經理寫了一篇非常長大概3000多個單詞的文章,解釋了為什麼會出問題。我仔細去閱讀體會了好幾遍,其實都是在解釋業務資料在面臨全球多活時的技術挑戰。既要好的體驗,又要保證資料一致。如果沒有一個全球多活的資料庫,那麼即使是一個技術和策劃都非常強的老牌遊戲公司也同樣會陷入困境。

如果我不是因為情懷,真的就把這個遊戲退掉了,天天掉線回檔是無法忍受的。使用Tair等全球多活資料庫能夠給使用者一個很好的體驗,可以讓全球多活遊戲有非常好的體感。

圖中就是一個遊戲客戶的典型用法,中美遊戲伺服器的商場漫遊。

2.3場景: 任意時間點資料恢復(PITR)

 title=

第二個場景是任意時間點的資料庫恢復。這個場景最早是防止刪庫跑路的場景。在遊戲行業裡用途非常廣泛,比如遊戲發版本,出問題能夠迅速回滾。同時我們也挖掘了遊戲客戶的反饋和建議,在任意時間點恢復的時候,可以選擇性的恢復部分Key/Key Pattern,也可以選擇性的丟棄某種型別的Key/Key Pattern都支援。這個Key級別的PITR就是專門為遊戲行業定製開發的,資料庫產品能夠多貼著遊戲的業務場景做一些能力,那麼業務的幸福感提升還是很高的,也降低了犯錯機會。

2.4 Tair(Redis企業版)支援的資料結構模組 (modules)

 title=

Tair作為企業級的Redis,它的一個典型的特點就是支援非常多的擴充套件模組,既包括簡單易用可以提升幸福感的資料結構,也包括一些行業級整體解決方案。在本次分享中我只簡單說一下畫圈的這幾個,它們在遊戲開發中經常遇到。

2.5場景:高效能分散式鎖(CAS/CAD)

 title=

所有網際網路應用都需要分散式鎖做類似於資源競爭的處理。我們在Redis場景下發現業內有非常多的分散式鎖的實踐案例,但很多都實現的有問題。主要技術點就是分散式鎖刪除不對,有可能會導致業務側的資源爭搶失效。我們在Tair引擎裡做了分散式鎖,只需要設定一下就能減少犯錯的成本。阿里集團內部、遊戲和網際網路行業分散式鎖用得很多,這個Tairstring模組已經開源沒有限制了,使用者用Redis套上去就可以用,可以獲得比較好的收益。

2.6場景:多級排序和分散式排行榜

 title=

Redis的排行榜是所有遊戲繞不開的問題,排行榜的問題是大Key很難做並行的擴充套件,遊戲裡的排行榜會故意設計地比較深,特別不容易點到,Redis的排行榜最痛的是容易形成大Key和只能為一維資料進行排序,攜帶的額外資料有限。

我們也給遊戲裡多維度的排序做了模組,通過模組的擴充套件做分散式排行榜,服務能力通過分片數和整體的資源上升做到平衡擴充套件,為遊戲使用者解決大查詢的問題。

同樣TairZset模組也已經開源了,結合著Tair的SDK中分散式排行榜,使用者可以很容易的應用可擴充套件高效能排行榜這個基礎設施。也不需要維護一個專門的排行榜團隊,畢竟一些中小型遊戲公司並沒有精力去投資一個專業的排行榜團隊。

從以上的介紹我們可以看到,資料庫核心能夠幫助沉澱一些能力到引擎中,那麼就能夠極大的簡化業務的開發,這對於遊戲行業的高速迭代是非常重要的。在2017年曾經在資料庫行業內掀起過一場轟轟烈烈的Multi-Model運動即多模資料庫。多模能力大背景上就是資料庫在對行業做深耕,而Tair提供的這些能力即是阿里雲上諸多客戶的真實需求,也同樣是阿里內部系統使用最多的資料結構。

2.7遊戲的雲資料庫周邊設施(DTS/DAS)

 title=

關於遊戲的合服、滾服操作,過去都做的非常原始。要麼是自己做備份、清洗和合並,要麼就是自己寫個長SQL去做資料變更。這些工具、方法要麼是按照約定,要麼就是祖傳指令碼口口相傳。有些原始的雲服務還要提個合服工單什麼的。在當代資料庫生態裡資料的訂閱(CDC)和轉換清晰(ETL)已經是資料庫生態的一部分,它通過標準的全量和增量訂閱,視覺化的進行過濾、對映等運算元標準化的支援掉。

阿里的DTS即完整的支援Tair的Binlog協議。整個資料滾動和運維的成本會非常低廉,並且可控制。生態工具仍舊是諸多資料庫的護城河,也同樣是一等公民需要建設。

像Redis或Tair高速資料庫服務時可觀測性很重要。遊戲出現大Key可能稍縱即逝,我們DAS平臺提供非常好的可觀測服務可以看到實時場景。DAS的可觀測、可控制、審計優化件的動態頻寬可以幫助使用者減輕運維操作。

三、MongoDB的遊戲最佳實踐

3.1使用MongoDB應對遊戲資料庫常見痛點

 title=

MongoDB遊戲框架原生是Mongo去支援,Mongo是原生支援Json結構,適合遊戲存使用者資料。

3.2從開發運維視角看阿里雲MongoDB

 title=

MongoDB適合遊戲的結構化儲存,無論分割槽分服場景還是全球同服,規格比較全可以自己配置。MongoDB到了阿里雲的雲上後,結合雲化設施能力會更強,做快照備份恢復雲化設施實現秒級快照。擴縮容能力彈性好,雲化設施做Scale、up down等都是非常平滑的。同時MongoDB端到端的安全解決方案也非常多,也更加標準化和便捷,同樣可以用作很好的防作弊,防機器人場景。

以上就是我對阿里雲資料庫在遊戲行業使用的一個簡單總結,謝謝大家!

版權宣告:本文內容由阿里雲實名註冊使用者自發貢獻,版權歸原作者所有,阿里雲開發者社群不擁有其著作權,亦不承擔相應法律責任。具體規則請檢視《阿里雲開發者社群使用者服務協議》和《阿里雲開發者社群智慧財產權保護指引》。如果您發現本社群中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社群將立刻刪除涉嫌侵權內容。

相關文章