本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
通過阿里云自研的MongoShake開源工具,您可以實現MongoDB數據庫間的數據同步,該功能可用于數據分析、災備和多活等業務場景。本文以云數據庫MongoDB實例間的數據實時同步為例介紹配置流程。
MongoShake介紹
MongoShake是阿里云以Golang語言編寫的通用平臺型服務工具,它通過讀取MongoDB的Oplog操作日志來復制MongoDB的數據以實現特定需求。
MongoShake還提供了日志數據的訂閱和消費功能,可通過SDK、Kafka、MetaQ等方式的靈活對接,適用于日志訂閱、數據中心同步、Cache異步淘汰等場景。
如需了解更多MongoShake相關信息,請參見MongoDB-shake Github主頁。
支持的數據源
源數據庫 | 目標數據庫 |
ECS上的自建MongoDB數據庫 | ECS上的自建MongoDB數據庫 |
本地自建的MongoDB數據庫 | 本地自建的MongoDB數據庫 |
阿里云MongoDB實例 | 阿里云MongoDB實例 |
第三方云MongoDB數據庫 | 第三方云MongoDB數據庫 |
注意事項
在全量數據同步完成之前,請勿對源庫進行DDL操作,否則可能導致數據不一致。
不支持同步admin和local數據庫。
數據庫用戶的權限要求
同步的數據源 | 所需權限 |
源MongoDB實例 | readAnyDatabase權限、local庫的read權限和mongoshake庫的readWrite權限。 說明 mongoshake庫會在增量同步開始時由MongoShake程序自動在源實例中創建。 |
目標MongoDB實例 | readWriteAnyDatabase權限或目標庫的readWrite權限。 |
關于MongoDB數據庫用戶的創建及授權操作請參見使用DMS管理MongoDB數據庫用戶或db.createUser命令介紹。
準備工作
為達到最理想的同步性能,請確保源端MongoDB副本集實例的網絡類型為專有網絡VPC,如果是經典網絡,請切換成專有網絡VPC。更多信息,請參見經典網絡切換為專有網絡。
創建作為同步目標端的MongoDB副本集實例,在創建的時候請選擇與源端MongoDB副本集實例相同的專有網絡VPC,以獲取最低的網絡延遲。更多信息,請參見創建副本集實例。
創建用于運行MongoShake的ECS實例,在創建的時候請選擇與源端MongoDB副本集實例相同的專有網絡VPC,以獲取最低的網絡延遲。更多信息,請參見創建ECS實例。
將ECS的內網IP地址加入至源端和目標端MongoDB實例的白名單中,并確保ECS可以連接源端和目標端MongoDB實例。 更多信息,請參見修改白名單。
操作步驟
本操作示例默認以/test/mongoshake目錄作為MongoShake的安裝目錄。
登錄ECS服務器。
說明您可以根據業務場景選擇對應的登錄方法,具體請參見登錄ECS服務器概覽。
執行如下命令下載MongoShake程序并重命名為
mongoshake.tar.gz
。wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/196977/jp_ja/1608863913991/mongo-shake-v2.4.16.tar.gz" -O mongoshake.tar.gz
說明本文提供的鏈接是MongoShake 2.4.16版本,如需下載最新版本的MongoShake,請參見releases頁面。
執行如下命令在將MongoShake解壓到/test/mongoshake目錄中。
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.4.16 /test/mongoshake && cd /test/mongoshake/mongo-shake-v2.4.16
執行
vi collector.conf
命令,修改MongoShake的配置文件collector.conf,涉及的主要參數說明如下表所示。參數
說明
示例值
mongo_urls
源端MongoDB實例的ConnectionStringURI格式連接地址,數據庫賬號為test,所屬數據庫為admin。
說明建議通過專有網絡地址進行互連,以獲取最低的網絡延遲。
關于ConnectionStringURI格式詳情請參見副本集實例連接說明。
mongo_urls = mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717
說明密碼中不得包含艾特(@)字符,否則會導致連接失敗。
tunnel.address
目標端MongoDB實例的ConnectionStringURI格式連接地址,數據庫賬號為test,所屬數據庫為admin。
說明建議通過專有網絡地址進行互連,以獲取最低的網絡延遲。
關于ConnectionStringURI格式詳情請參見副本集實例連接說明。
tunnel.address = mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717
說明密碼中不得包含艾特(@)字符,否則會導致連接失敗。
sync_mode
數據同步的方式,取值:
all:執行全量數據同步和增量數據同步。
full:僅執行全量數據同步。
incr:僅執行增量數據同步。
說明默認值為incr。
sync_mode = all
說明關于collector.conf全量參數說明,請參見附件中的collector.conf全量參數說明。
執行下述命令啟動同步任務,并打印日志信息。
./collector.linux -conf=collector.conf -verbose
觀察打印的日志信息,當出現如下日志時,即代表全量數據同步已完成,并進入增量數據同步模式。
[09:38:57 CST 2019/06/20] [INFO] (mongoshake/collector.(*ReplicationCoordinator).Run:80) finish full sync, start incr sync with timestamp: fullBeginTs[1560994443], fullFinishTs[1560994737]
監控MongoShake狀態
增量數據同步開始后,您可以再開啟一個命令行窗口,通過如下命令來監控MongoShake。
cd /test/mongoshake && ./mongoshake-stat --port=9100
mongoshake-stat
是一個Python腳本,執行之前請先安裝Python 2.7版本,詳情請參見Python官網。
監控輸出示例:
參數說明:
參數 | 說明 |
logs_get/sec | 每秒獲取的oplog數量。 |
logs_repl/sec | 每秒執行重放操作的oplog數量。 |
logs_success/sec | 每秒成功執行重放操作的oplog數量。 |
lsn.time | 最后發送oplog的時間。 |
lsn_ack.time | 目標端確認寫入的時間。 |
lsn_ckpt.time | CheckPoint持久化的時間。 |
now.time | 當前時間。 |
replset | 源數據庫的副本集名稱。 |
附件
表 1. collector.conf全量參數說明
參數目錄 | 參數 | 說明 | 示例值 |
無 | conf.version | 當前配置文件的版本號,請不要修改該值。 |
|
全局配置選項 | id | 同步任務的ID,可自定義。主要用于本次任務的日志名稱、斷點續傳(checkpoint)位點信息存儲的數據庫名稱、同步到目的端的數據庫名稱等。 |
|
master_quorum | 高可用選項。當主備MongoShake同時從一個源端同步數據時,主MongoShake中需要設置該參數為 取值:
說明 默認值為false。 |
| |
full_sync.http_port | HTTP端口,開放該端口可通過外網查看MongoShake的當前全量同步狀態。 說明 默認值為9101。 |
| |
incr_sync.http_port | HTTP端口,開放該端口可通過外網查看MongoShake的當前增量同步狀態。 說明 默認值為9100。 |
| |
system_profile_port | Profiling端口,用于查看內部堆棧信息。 |
| |
log.level | 日志的等級,取值:
默認值:info。 |
| |
log.dir | 日志文件和pid文件的目錄,不設置則默認使用當前路徑的logs目錄。 說明 本參數的路徑必須設置為絕對路徑。 |
| |
log.file | 日志文件的名稱,可自定義。 說明 默認值為collector.log。 |
| |
log.flush | 日志在屏幕上的刷新頻率。取值:
說明 默認值為false。 |
| |
sync_mode | 數據同步的方式,取值:
說明 默認值為incr。 |
| |
mongo_urls | 源端MongoDB實例的ConnectionStringURI格式連接地址。示例中數據庫賬號為test,所屬數據庫為admin。 說明
|
| |
mongo_cs_url | 如果源端的MongoDB類型為分片集群實例,需要輸入ConfigServer(CS)節點的連接地址。如何申請ConfigServer節點的連接地址請參見申請Shard或ConfigServer節點連接地址。 示例中數據庫賬號為test,所屬數據庫為admin。 |
| |
mongo_s_url | 如果源端的MongoDB類型為分片集群實例,需要輸入至少一個Mongos節點的連接地址,多個Mongos地址之間以英文逗號(,)分隔。如何申請Mongos節點的連接地址請參見申請Shard或ConfigServer節點連接地址。 示例中數據庫賬號為test,所屬數據庫為admin。 |
| |
tunnel | 同步的通道類型。取值:
說明 默認值為direct。 |
| |
tunnel.address | 目標端的連接地址,支持如下地址:
示例中數據庫賬號為test,所屬數據庫為admin。 |
| |
tunnel.message | 通道數據的類型,僅限tunnel參數為
說明 默認值為raw。 |
| |
mongo_connect_mode | MongoDB實例的連接模式,僅限tunnel參數為
說明 默認值為secondaryPreferred。 |
| |
filter.namespace.black | 指定數據同步的黑名單,這些指定的命名空間不會被同步至目標數據庫,多個命名空間用英文分號(;)分隔。 說明 命名空間是指MongoDB中集合或索引的規范名稱,是由數據庫名稱和集合或索引名稱的組合,例如 |
| |
filter.namespace.white | 指定數據同步的白名單,只有這些指定的命名空間會被同步至目標數據庫,多個命名空間用英文分號(;)分隔。 |
| |
filter.pass.special.db | 啟用特殊庫的同步。正常同步過程中,admin、local、mongoshake、config、system.views等庫會被系統過濾掉,您可以在有特殊需求時啟用上述庫的同步。多個庫名用英文分號(;)分隔。 |
| |
filter.ddl_enable | 是否開啟DDL同步。取值:
說明 源端為MongoDB分片集群實例時不支持開啟。 |
| |
checkpoint.storage.url | 配置Checkpoint存儲地址,用于支持斷點續傳。如不配置,程序將根據實例類型寫入如下對應的數據庫:
示例中數據庫賬號為test,所屬數據庫為admin。 |
| |
checkpoint.storage.db | Checkpoint存儲的數據庫名。 說明 默認為mongoshake。 |
| |
checkpoint.storage.collection | Checkpoint存儲的集合名。在開啟主備MongoShake同時從一個源端同步數據時,可以修改該表名以防止表名重復引起沖突。 說明 默認為ckpt_default。 |
| |
checkpoint.start_position | 斷點續傳的開始位置,如果checkpoint位點已經存在則本參數無效。取值的格式: 說明 默認值為1970-01-01T00:00:00Z。 |
| |
transform.namespace | 將源庫的庫名或集合名重新命名并同步到目的庫。如:將源庫中的 |
| |
全量數據同步選項 | full_sync.reader.collection_parallel | 設置MongoShake單次最多并發拉取多少個集合。 |
|
full_sync.reader.write_document_parallel | 設置MongoShake對單個集合寫入的并發線程數。 |
| |
full_sync.reader.document_batch_size | 設置MongoShake對目的端單次寫入文檔的聚合(batch)大小。如:128表示單次聚合128個文檔后再寫入。 |
| |
full_sync.collection_exist_drop | 設置目的庫存在同名集合時的處理方式。取值:
|
| |
full_sync.create_index | 完成同步后是否創建索引。取值:
|
| |
full_sync.executor.insert_on_dup_update | 目的庫中有
|
| |
full_sync.executor.filter.orphan_document | 源端為分片集群實例時,是否過濾孤立文檔(Orphaned document)。取值:
|
| |
full_sync.executor.majority_enable | 是否啟用目的端的多數寫(Majority write)功能。取值:
|
| |
增量數據同步選項 | incr_sync.mongo_fetch_method | 配置增量數據拉取方法。取值:
默認值:oplog |
|
incr_sync.oplog.gids | 用于云上集群搭建雙向復制。 |
| |
incr_sync.shard_key | MongoShake內部處理并發的方式。請勿修改該參數。 |
| |
incr_sync.worker | 傳輸oplog的并發線程數。如果主機性能足夠,可以提高線程數。 說明 如果是分片集群實例,線程數必須等同于分片(shard)數量。 |
| |
incr_sync.worker.oplog_compressor | 啟用壓縮數據功能以減少網絡帶寬消耗。取值:
說明 本參數僅限于tunnel參數非 |
| |
incr_sync.target_delay | 設置源端與目的端的延遲同步。通常源端中的變更會實時同步到目的端,為了防止誤操作,您可以通過設置本參數達到延遲同步的目的。如: 說明 0表示不啟用延遲同步。 |
| |
incr_sync.worker.batch_queue_size | MongoShake內部隊列的配置參數。如無特殊情況請勿修改。 |
| |
incr_sync.adaptive.batching_max_size |
| ||
incr_sync.fetcher.buffer_capacity |
| ||
MongoDB同步選項(僅適用于 | incr_sync.executor.upsert | 當
|
|
incr_sync.executor.insert_on_dup_update | 當
|
| |
incr_sync.conflict_write_to | 同步時如果存在寫沖突,是否記錄沖突文檔。取值:
|
| |
incr_sync.executor.majority_enable | 是否在目的端啟用多數寫(Majority write)。取值:
說明 如果啟用則會對性能造成一定影響。 |
|
常見問題
請參見MongoShake常見問題。