日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用MongoShake實現MongoDB實例間的單向同步

重要

本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。

通過阿里云自研的MongoShake開源工具,您可以實現MongoDB數據庫間的數據同步,該功能可用于數據分析、災備和多活等業務場景。本文以云數據庫MongoDB實例間的數據實時同步為例介紹配置流程。

MongoShake介紹

MongoShake是阿里云以Golang語言編寫的通用平臺型服務工具,它通過讀取MongoDBOplog操作日志來復制MongoDB的數據以實現特定需求。

MongoShake還提供了日志數據的訂閱和消費功能,可通過SDK、Kafka、MetaQ等方式的靈活對接,適用于日志訂閱、數據中心同步、Cache異步淘汰等場景。

說明

如需了解更多MongoShake相關信息,請參見MongoDB-shake Github主頁

支持的數據源

源數據庫

目標數據庫

ECS上的自建MongoDB數據庫

ECS上的自建MongoDB數據庫

本地自建的MongoDB數據庫

本地自建的MongoDB數據庫

阿里云MongoDB實例

阿里云MongoDB實例

第三方云MongoDB數據庫

第三方云MongoDB數據庫

注意事項

  • 在全量數據同步完成之前,請勿對源庫進行DDL操作,否則可能導致數據不一致。

  • 不支持同步adminlocal數據庫。

數據庫用戶的權限要求

同步的數據源

所需權限

MongoDB實例

readAnyDatabase權限、local庫的read權限和mongoshake庫的readWrite權限。

說明

mongoshake庫會在增量同步開始時由MongoShake程序自動在源實例中創建。

目標MongoDB實例

readWriteAnyDatabase權限或目標庫的readWrite權限。

說明

關于MongoDB數據庫用戶的創建及授權操作請參見使用DMS管理MongoDB數據庫用戶db.createUser命令介紹

準備工作

  1. 為達到最理想的同步性能,請確保源端MongoDB副本集實例的網絡類型為專有網絡VPC,如果是經典網絡,請切換成專有網絡VPC。更多信息,請參見經典網絡切換為專有網絡

  2. 創建作為同步目標端的MongoDB副本集實例,在創建的時候請選擇與源端MongoDB副本集實例相同的專有網絡VPC,以獲取最低的網絡延遲。更多信息,請參見創建副本集實例

  3. 創建用于運行MongoShakeECS實例,在創建的時候請選擇與源端MongoDB副本集實例相同的專有網絡VPC,以獲取最低的網絡延遲。更多信息,請參見創建ECS實例

  4. ECS的內網IP地址加入至源端和目標端MongoDB實例的白名單中,并確保ECS可以連接源端和目標端MongoDB實例。 更多信息,請參見修改白名單

說明

如果您沒有達到上述網絡類型的要求,可以分別申請源端和目標端MongoDB實例的公網連接地址,并將ECS的公網地址加入至源端和目標端MongoDB實例的白名單中,通過公網地址進行同步操作。更多信息,請參見申請公網連接地址修改白名單

操作步驟

本操作示例默認以/test/mongoshake目錄作為MongoShake的安裝目錄。

  1. 登錄ECS服務器。

    說明

    您可以根據業務場景選擇對應的登錄方法,具體請參見登錄ECS服務器概覽

  2. 執行如下命令下載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頁面

  3. 執行如下命令在將MongoShake解壓到/test/mongoshake目錄中。

    tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.4.16 /test/mongoshake && cd /test/mongoshake/mongo-shake-v2.4.16
  4. 執行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全量參數說明。

  5. 執行下述命令啟動同步任務,并打印日志信息。

    ./collector.linux -conf=collector.conf -verbose
  6. 觀察打印的日志信息,當出現如下日志時,即代表全量數據同步已完成,并進入增量數據同步模式。

    [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

當前配置文件的版本號,請不要修改該值。

conf.version = 4

全局配置選項

id

同步任務的ID,可自定義。主要用于本次任務的日志名稱、斷點續傳(checkpoint)位點信息存儲的數據庫名稱、同步到目的端的數據庫名稱等。

id = mongoshake

master_quorum

高可用選項。當主備MongoShake同時從一個源端同步數據時,主MongoShake中需要設置該參數為true

取值:

  • true:開啟

  • false:關閉

說明

默認值為false。

master_quorum = false

full_sync.http_port

HTTP端口,開放該端口可通過外網查看MongoShake的當前全量同步狀態。

說明

默認值為9101。

full_sync.http_port = 9101

incr_sync.http_port

HTTP端口,開放該端口可通過外網查看MongoShake的當前增量同步狀態。

說明

默認值為9100。

incr_sync.http_port = 9100

system_profile_port

Profiling端口,用于查看內部堆棧信息。

system_profile_port = 9200

log.level

日志的等級,取值:

  • error:包含錯誤級別信息的日志。

  • warning:包含警告級別信息的日志。

  • info:反饋當前系統狀態的日志。

  • debug:包含調試信息的日志。

默認值:info。

log.level = info

log.dir

日志文件和pid文件的目錄,不設置則默認使用當前路徑的logs目錄。

說明

本參數的路徑必須設置為絕對路徑。

log.dir = ./logs/

log.file

日志文件的名稱,可自定義。

說明

默認值為collector.log。

log.file = collector.log

log.flush

日志在屏幕上的刷新頻率。取值:

  • true:打印每一條日志(對性能有影響)。

  • false:不一定能打印日志,但是保證性能。

說明

默認值為false。

log.flush = false

sync_mode

數據同步的方式,取值:

  • all:執行全量數據同步和增量數據同步。

  • full:僅執行全量數據同步。

  • incr:僅執行增量數據同步。

說明

默認值為incr。

sync_mode = all

mongo_urls

源端MongoDB實例的ConnectionStringURI格式連接地址。示例中數據庫賬號為test,所屬數據庫為admin。

說明

mongo_urls = mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717

mongo_cs_url

如果源端的MongoDB類型為分片集群實例,需要輸入ConfigServer(CS)節點的連接地址。如何申請ConfigServer節點的連接地址請參見申請ShardConfigServer節點連接地址

示例中數據庫賬號為test,所屬數據庫為admin。

mongo_cs_url = mongodb://test:****@dds-bp19f409d7512****-csxxx.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****-csxxx.mongodb.rds.aliyuncs.com:3717/admin

mongo_s_url

如果源端的MongoDB類型為分片集群實例,需要輸入至少一個Mongos節點的連接地址,多個Mongos地址之間以英文逗號(,)分隔。如何申請Mongos節點的連接地址請參見申請ShardConfigServer節點連接地址

示例中數據庫賬號為test,所屬數據庫為admin。

mongos_s_url = mongodb://test:****@s-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,s-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717/admin

tunnel

同步的通道類型。取值:

  • direct:直接同步到目標MongoDB實例。

  • rpc:通過NET/RPC方式同步。

  • tcp:通過TCP方式同步。

  • file:通過文件傳輸方式同步。

  • kafka:通過Kafka方式同步。

  • mock:僅用于測試,不寫入通道。

說明

默認值為direct。

tunnel = direct

tunnel.address

目標端的連接地址,支持如下地址:

  • turnel參數為direct時,請輸入目標端MongoDB實例的ConnectionStringURI格式連接地址。

  • turnel參數為rpc時,請輸入目標端實例rpc的接收地址。

  • turnel參數為tcp時,請輸入目標端實例的tcp接收地址。

  • turnel參數為file時,請輸入目標端實例數據的文件路徑。

  • turnel參數為kafka時,請輸入kafka的地址,例如topic@brokers1,brokers2

  • turnel參數為mock時,此參數不填。

示例中數據庫賬號為test,所屬數據庫為admin。

tunnel.address = mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717

tunnel.message

通道數據的類型,僅限tunnel參數為kafkafile時有效。取值:

  • raw:默認的類型,采用聚合的模式進行寫入和讀取。

  • json:以JSON格式寫入kafka,便于用戶直接讀取。

  • bson:以BSON二進制的格式寫入kafka。

說明

默認值為raw。

tunnel.message = raw

mongo_connect_mode

MongoDB實例的連接模式,僅限tunnel參數為direct時有效。取值:

  • primary:從primary節點中拉取數據。

  • secondaryPreferred:從secondary節點中拉取數據。

  • standalone:從指定的單個節點中拉取數據。

說明

默認值為secondaryPreferred。

mongo_connect_mode = secondaryPreferred

filter.namespace.black

指定數據同步的黑名單,這些指定的命名空間不會被同步至目標數據庫,多個命名空間用英文分號(;)分隔。

說明

命名空間是指MongoDB中集合或索引的規范名稱,是由數據庫名稱和集合或索引名稱的組合,例如mongodbtest.customer

filter.namespace.black = mongodbtest.customer;testdata.test123

filter.namespace.white

指定數據同步的白名單,只有這些指定的命名空間會被同步至目標數據庫,多個命名空間用英文分號(;)分隔。

filter.namespace.white = mongodbtest.customer;test123

filter.pass.special.db

啟用特殊庫的同步。正常同步過程中,admin、local、mongoshake、config、system.views等庫會被系統過濾掉,您可以在有特殊需求時啟用上述庫的同步。多個庫名用英文分號(;)分隔。

filter.pass.special.db = admin;mongoshake

filter.ddl_enable

是否開啟DDL同步。取值:

  • true:開啟

  • false:關閉

說明

源端為MongoDB分片集群實例時不支持開啟。

filter.ddl_enable = false

checkpoint.storage.url

配置Checkpoint存儲地址,用于支持斷點續傳。如不配置,程序將根據實例類型寫入如下對應的數據庫:

  • MongoDB副本集實例:寫入mongoshake庫中。

  • MongoDB分片集群實例:寫入ConfigServer節點的admin庫中。

示例中數據庫賬號為test,所屬數據庫為admin。

checkpoint.storage.url = mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717

checkpoint.storage.db

Checkpoint存儲的數據庫名。

說明

默認為mongoshake。

checkpoint.storage.db = mongoshake

checkpoint.storage.collection

Checkpoint存儲的集合名。在開啟主備MongoShake同時從一個源端同步數據時,可以修改該表名以防止表名重復引起沖突。

說明

默認為ckpt_default。

checkpoint.storage.collection = ckpt_default

checkpoint.start_position

斷點續傳的開始位置,如果checkpoint位點已經存在則本參數無效。取值的格式:YYYY-MM-DDTHH:MM:SSZ

說明

默認值為1970-01-01T00:00:00Z。

checkpoint.start_position = 1970-01-01T00:00:00Z

transform.namespace

將源庫的庫名或集合名重新命名并同步到目的庫。如:將源庫中的A庫.B集合重新命名成C庫.D集合并同步到目的庫。

transform.namespace = fromA.fromB:toC.toD

全量數據同步選項

full_sync.reader.collection_parallel

設置MongoShake單次最多并發拉取多少個集合。

full_sync.reader.collection_parallel = 6

full_sync.reader.write_document_parallel

設置MongoShake對單個集合寫入的并發線程數。

full_sync.reader.write_document_parallel = 8

full_sync.reader.document_batch_size

設置MongoShake對目的端單次寫入文檔的聚合(batch)大小。如:128表示單次聚合128個文檔后再寫入。

full_sync.reader.document_batch_size = 128

full_sync.collection_exist_drop

設置目的庫存在同名集合時的處理方式。取值:

  • true:先刪除目標重名集合再同步。

    警告

    此操作會刪除目的端的集合,請務必提前做好備份。

  • false:如檢測到目的庫中有重名集合則直接報錯退出。

full_sync.collection_exist_drop = true

full_sync.create_index

完成同步后是否創建索引。取值:

  • foreground:創建前臺索引

  • background:創建后臺索引

  • none:不創建索引

full_sync.create_index = none

full_sync.executor.insert_on_dup_update

目的庫中有_id重復字段時是否將INSERT語句更改為UPDATE語句。取值:

  • true:更改

  • false:不更改

full_sync.executor.insert_on_dup_update = false

full_sync.executor.filter.orphan_document

源端為分片集群實例時,是否過濾孤立文檔(Orphaned document)。取值:

  • true:過濾

  • false:不過濾

full_sync.executor.filter.orphan_document = false

full_sync.executor.majority_enable

是否啟用目的端的多數寫(Majority write)功能。取值:

  • true:啟用

  • false:不啟用

full_sync.executor.majority_enable = false

增量數據同步選項

incr_sync.mongo_fetch_method

配置增量數據拉取方法。取值:

  • oplog:從源庫中拉取oplog。

  • change_stream:從源庫中拉取change事件(僅支持MongoDB 4.0及以上版本)。

默認值:oplog

incr_sync.mongo_fetch_method = oplog

incr_sync.oplog.gids

用于云上集群搭建雙向復制。

incr_sync.oplog.gids = xxxxxxxxxxxx

incr_sync.shard_key

MongoShake內部處理并發的方式。請勿修改該參數。

incr_sync.shard_key = collection

incr_sync.worker

傳輸oplog的并發線程數。如果主機性能足夠,可以提高線程數。

說明

如果是分片集群實例,線程數必須等同于分片(shard)數量。

incr_sync.worker = 8

incr_sync.worker.oplog_compressor

啟用壓縮數據功能以減少網絡帶寬消耗。取值:

  • none:不壓縮

  • gzip:以gzip格式壓縮

  • zlib:以zlib格式壓縮

  • deflate:以deflate格式壓縮

說明

本參數僅限于tunnel參數非direct模式下使用。當tunneldirect時,請將本參數設置為none

incr_sync.worker.oplog_compressor = none

incr_sync.target_delay

設置源端與目的端的延遲同步。通常源端中的變更會實時同步到目的端,為了防止誤操作,您可以通過設置本參數達到延遲同步的目的。如:incr_sync.target_delay = 1800為設置30分鐘的延遲。單位:秒。

說明

0表示不啟用延遲同步。

incr_sync.target_delay = 1800

incr_sync.worker.batch_queue_size

MongoShake內部隊列的配置參數。如無特殊情況請勿修改。

incr_sync.worker.batch_queue_size = 64

incr_sync.adaptive.batching_max_size

incr_sync.adaptive.batching_max_size = 1024

incr_sync.fetcher.buffer_capacity

incr_sync.fetcher.buffer_capacity = 256

MongoDB同步選項(僅適用于direct模式)

incr_sync.executor.upsert

_id(重復字段)或唯一索引不存在時,是否將UPDATE語句更改為INSERT語句。取值:

  • true:更改

  • false:不更改

incr_sync.executor.upsert = false

incr_sync.executor.insert_on_dup_update

_id(重復字段)或唯一索引不存在時,是否將INSERT語句更改為UPDATE語句。取值:

  • true:更改

  • false:不更改

incr_sync.executor.insert_on_dup_update = false

incr_sync.conflict_write_to

同步時如果存在寫沖突,是否記錄沖突文檔。取值:

  • none:不記錄

  • db:將沖突日志寫入mongoshake_conflict

  • sdk:將沖突日志寫入sdk

incr_sync.conflict_write_to = none

incr_sync.executor.majority_enable

是否在目的端啟用多數寫(Majority write)。取值:

  • true:啟用

  • false:不啟用

說明

如果啟用則會對性能造成一定影響。

incr_sync.executor.majority_enable = false

常見問題

請參見MongoShake常見問題