天天看點

天生一對,當遊戲遇上MongoDB

天生一對,當遊戲遇上MongoDB

前端時間魔獸這個電影我相信大家都看過了哈,作為一個資深魔獸世界玩家(從公測時候就開始玩,當然現在是已經afk多年),我對這個電影還是可以給好評的,畢竟裡面的一些場景還原度還是蠻高的,特效也做得不錯。不過肯定也會有人覺得不滿意,畢竟魔獸的遊戲做得太成功了(我這裡主要指魔獸世界),恢弘的史詩劇情,創新的團隊副本設計,豐富的遊戲體驗,各種令人贊歎的細節。作為一個碼農,有時候我也會去思考魔獸世界這個遊戲背後他的一些設計和實作,比如他用什麼資料庫。當然真正用什麼資料庫這個我是不确定的,我們今天的主題是當遊戲遇上mongodb,是以我們隻聊遊戲如果采用mongodb作為資料庫有哪些好處。

以前玩魔獸世界的時候,每個禮拜二都要來一次停服維護。當時大家也習慣了,畢竟魔獸世界還是玩點卡的,遊戲時間都是自己花錢買的。但對于現在的免費遊戲來說,經常停服,可能玩家都會接受不了。對那些日流水好幾位數字的遊戲公司來說,時間就是金錢,停服維護可能就有種自己在不停燒錢的感覺。是以現在都要追求服務高可用,盡可能減少停服時間。資料庫服務通常也是整個遊戲服務中的一個重要環節。mongodb的副本集是一個相當成熟的高可用架構,它通過一主多備結構保證服務的可用性,當主當機後還存活的備會自動選舉出新的主。

天生一對,當遊戲遇上MongoDB

![replica_set_trigger_election]

說完高可用,我們來說說高可擴充方面。同樣還是魔獸世界,想必很多早期玩家都體驗過排隊,之是以要排隊,主要是因為服務能力不夠導緻。當然,這通常和資料庫無關,不過,一個好的架構師是不會允許有某個環節出現明顯的瓶頸的。mongodb由于其資料相對獨立的特性,相比于關系型資料庫,較容易進行水準擴充。其sharding架構已在很多生産環境中久經驗證,業内有些公司對其進一步優化後已在管理上百pb的資料。對于運維人員來說也是相當友好,動态擴容和負載均衡都是自動進行的,使用者隻需要選一個好的shard key即可。

天生一對,當遊戲遇上MongoDB
天生一對,當遊戲遇上MongoDB

營運遊戲有時候會面臨不得不對遊戲進行回檔這樣的痛苦選擇。因為程式不可避免會有bug的存在,如果有某個bug被惡意利用,亦或者是人皆會犯錯誤,某個gm不小心手抖發了大量rmb道具,都可能導緻較大的經濟損失出現。如果遊戲不是很完善,沒有一個更好的解決方案的情況下,這時候可能就要考慮對遊戲進行回檔了。對于資料庫資料的回檔來說,mongodb提供了一個延遲副本集節點的設定來解決這個問題。即,将某個節點配置成落後于最新資料一定的時間量。

天生一對,當遊戲遇上MongoDB

當然,這還是很粗粒度的,如果要精确回檔到延遲時間内或者更早的時間點,甚至是任意時間點,就還要在備份恢複這塊上做更多的工作。阿裡雲mongodb近期會推出任意時間點恢複的功能,以滿足包括這個場景在内的備份恢複需求,敬請關注。

現在有很多遊戲都采用滾服作為快速增加營收的一個營運手段。如果使用mongodb作為資料庫,可以利用其資料獨立帶來的好滾優勢。此外,阿裡雲資料庫mongodb的一個功能——從備份點建立執行個體,簡直就是專門為滾服打造的。隻需事先為一個新服初始化好執行個體,然後建立一個備份集,就可以根據這個初始備份集快速建立多個執行個體,進而達到快速開新服的目的。

天生一對,當遊戲遇上MongoDB