1.背景
?目前,文檔型數據庫由于靈活的schema和接近關系型數據庫的訪問特點,被廣泛應用,尤其是游戲、互聯網金融等行業的客戶使用MongoDB構建了大量應用程序,比如游戲客戶用來處理玩家的屬性信息;又如股票APP用來存儲與時間線相關的行情數據。隨著時間的推移和業務的發展,MongoDB庫越來越大,大庫治理是必須面臨的問題。
?一般來講,大庫治理有如下幾種方案。一是做冷熱數據隔離,將數據根據使用頻率分為熱、溫、冷、凍級別,超過一定時間的冷數據,轉儲到另一個冷庫或低成本存儲的數據庫;熱庫只保留近期訪問頻繁的數據;二是做垂直拆分,比如大系統有多個集合,按照模塊進行垂直劃分,把不同模塊對應的集合拆分到不同庫,實現數據量和訪問量的垂直分離;三是做水平拆分,比如選擇userid的哈希值,將大的集合水平拆分到多個庫,實現整體存儲和計算能力的擴展。第四,也有部分業務,它的歷史數據的使命完成,走完生命周期,可以直接刪除。這4種方案,各有利弊,且需要根據實際業務場景進行選型。而很多場景下,客戶會選擇水平sharding,主要原因如下:
-
很多業務需要經常查詢歷史數據,水平sharding不需要刪除或分離歷史數據;
-
長遠來看,水平sharding的擴展性更好,可以支撐更大的業務規模。
?DocumentDB Elastic Cluster是亞馬遜云科技提供的一個很好的支持水平sharding的云數據庫服務。本文,主要針對客戶從MongoDB副本集架構遷移到DocumentDB Elastic Cluster的過程中,如何進行海量數據遷移的問題,進行研究,并提供最佳實踐。
2.可選遷移方案
?眾所周知,含有大數據量的數據庫的遷移,是比較有挑戰性的問題。數據庫在不斷的讀寫,不僅需要在目標庫完成當前全量數據的初始化,也需要把初始化期間的數據變化同步到新庫。以下是遷移方案示意圖:

?MongoDB記錄文檔變化的方式有兩種:oplog和change stream。由于,oplog或change stream的存儲空間是有限的,因此全量初始化階段的遷移速度是必須要考慮的因素。另外,增量同步階段的速度也必須大于源數據庫的變化速度,這樣才能實現新舊數據庫的數據一致。這兩個階段,我們都需要依賴穩定、高效的工具來完成。尤其在大型數據庫的遷移時,甚至要配合一定的數據遷移策略(比如并行、壓縮;冷、熱數據分別遷移;不同集合分別遷移等)。
亞馬遜云科技有3種可行的遷移方案:
-
AWS DMS全量+增量遷移
-
Mongoshake全量+增量遷移
-
Mongodump/mongorestore+DMS增量遷
方案1:AWS DMS全量+增量
?DMS是亞馬遜云科技的一項云服務,允許遷移關系數據庫、MongoDB數據庫和其他類型的數據存儲。可以使用DMS執行一次性遷移,或復制源庫正在進行的更改以保持源和目標同步。DMS在全量遷移階段提供了Auto segmentation和Range segmentation的方式來并行加速遷移;在CDC增量階段,3.5 bet版也支持并發方式寫入DocumentDB。
方案2:Mongoshake全量+增量
?開源的Mongoshake,也支持遷移寫入DocumentDB。由于它屬于開源產品,優勢是社區活躍,遇到問題可以定制開發解決,遷移速度較快;劣勢是遇到問題可以獲得的技術支持力度較低,用戶需要自己定位或求助社區。
方案3:Mongodump/mongorestore+DMS增量
?mongodump是MongoDB官方提供的備份工具,它可以從MongoDB數據庫讀取數據,并生成BSON文件,然后通過mongorestore工具恢復到MongoDB。它也同樣支持從DocuemntDB備份數據。而mongodb-database-tools的6.1版本也支持恢復到DocumentDB Elastic Cluster。這種方案的優勢是穩定快速,缺點是增量同步能力不足。但是,可以借助DMS的增量同步能力。重點是需要選擇好增量同步的起始位點,防止數據丟失。
以上三種方案,各有優缺點,如下表。

使用DMS托管服務,用戶配置遷移任務最方便,整個遷移過程,日志清晰、速度直觀,可觀測性較好。Mongoshake在增量寫入DocumentDB環節速度略慢,在TPS較高的場景不適用;而mongodump和mongorestore在MongoDB大數據庫遷移場景上,速度比DMS full load更快。大庫遷移是否成功的一個非常重要因素是遷移速度。
原標題:大型MongoDB數據庫遷移到DocumentDB Elastic Cluster的最佳實踐
原鏈接:https://aws.amazon.com/cn/blogs/china/best-practices-for-migrating-large-mongodb-databases-to-documentdb-elastic-cluster/