MongoDB遷移到Cosmos DB以支援數百萬使用者 - Saket

banq發表於2021-11-19

Glance 遊戲中心是 Glance 應用程式中的一個部分 : 上百款遊戲的目的地。任何想要快速娛樂的人都可以在這裡玩遊戲。它涵蓋了各種型別的遊戲,如益智、賽車、冒險、策略等。這些遊戲通常是基於 HTML5 的簡單遊戲,無需安裝即可玩。玩家還可以參加正在進行的錦標賽並與其他玩家競爭;最終贏得獎品等。
 

問題陳述
我們有休閒摹針對比賽都跑,每天增加使用者參與度和獎勵他們根據他們的隊伍我們的鎖屏上埃姆斯。每個遊戲及其相應的錦標賽都有一個排行榜,其資料當前儲存在自託管的 Mongo DB 中。排行榜顯示頂級玩家以及他們的分數、您當前的分數和您的排名。這是在玩家之間創造競爭的一個特別重要的螢幕。手頭的問題是將我們的排行榜擴大 100 倍,使我們能夠執行多個併發錦標賽,目前這些錦標賽受到單個節點非分片 MongoDB 的限制。
 

規模
每天有數百萬使用者訪問遊戲中心。排行榜 MongoDB 目前擁有超過 3 個集合的超過 1000 萬個文件。後端服務接收大約 500 QPS 的流量,進而以大約 1000 QPS 的速度訪問資料庫,包括讀取和寫入。
考慮的解決方案

  • 將當前 MongoDB 橫向擴充套件為多節點分片叢集
  • 使用完全託管的雲資料庫

我們繼續使用後者並使用Cosmos DB,原因如下:
  • 更易於擴充套件、維護和支援
  • 在我們的預算內沒有重大的成本差異
  • 無停機時間且易於遷移
  • 不再需要手動進行每日資料備份轉儲
  • 團隊熟悉 Azure 生態系統,在相同的基礎上再新增一個更容易

 

執行遷移
首先介紹一下 COSMOS DB
Cosmos DB 為我們提供了多個介面和 API,可以輕鬆地從其他資料庫(如 MySQL、Cassandra、MongoDB 等)遷移……在我們的例子中,我們選擇了 Azure Cosmos DB 的 API for MongoDB v4,我們只需要替換程式碼中的 DB 連線字串,我們很高興去。
所有資料庫操作的成本由 Azure Cosmos DB 規範化,並以請求單位(或簡稱 RU)表示。請求單位是一種效能貨幣,它抽象了執行 Azure Cosmos DB 支援的資料庫操作所需的 CPU、IOPS 和記憶體等系統資源。
核心 API 和查詢

  • 獲取比賽的使用者分數
  • 獲取使用者在錦標賽中的排名
  • 獲得錦標賽的前 N ​​位領袖
  • 更新錦標賽的使用者分數

 
在COSMOS中選擇索引和分割槽鍵
老MongoDB的資料模型具有收藏tournamentHighScore包含欄位ID,使用者id,tournamentId,高分和一些更多的後設資料。
新的 Cosmos DB 包含與上述相同的欄位,以及一個額外的合成分割槽鍵,我們將其構建為錦標賽 ID_userId以最佳化點讀取/更新以及在邏輯/物理分割槽之間均勻分佈資料以避免熱分割槽。
以下索引已新增到 Cosmos DB 的集合中:
  1. 錦標賽ID(單鍵索引)
  2. highScore(單鍵索引)
  3. 錦標賽ID:1,高分:-1(複合指數)

新增 1 和 2 以最佳化排名查詢,該查詢計算得分大於您的使用者數量,新增 3 以有效獲得錦標賽的前 N ​​位領先者。請注意,與 MongoDB 不同的是,複合索引僅用於對結果進行排序的查詢,對於其他多個欄位的查詢,單鍵索引工作得很好。
 

零當機遷移

  • 所有的讀取和寫入都是透過 MongoDB 進行的。
  • 我們與 Cosmos DB 建立新連線,並開始對兩個資料庫的雙重寫入,同時仍從 MongoDB 讀取。
  • 現在,我們需要將資料從 MongoDB 遷移到 Cosmos DB 以完全複製資料。

使用 Azure資料庫遷移服務是一種直接且可靠的資料傳輸方式,但它不支援我們的 MongoDB 版本。
作為上述解決方案,我們在排行榜服務中公開了一個端點,該端點從 MongoDB 批次讀取資料並將其寫入 Cosmos DB。兩個資料庫的主鍵都在程式碼中生成,從而防止對 Cosmos DB 的任何重複寫入。此端點在遷移結束後被刪除
  • 資料遷移後,我們將讀取從 MongoDB 切換到 Cosmos DB,同時仍然寫入前者進行備份。
  • 經過進一步監控,我們停止了對 MongoDB 的所有寫入,並丟棄了舊資料庫。

相關文章