すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for MongoDB:MongoShake による MongoDB インスタンス間の片方向同期

最終更新日:Jul 21, 2026

MongoShake は、Alibaba Cloud が Go で開発したオープンソースのサービスとしてのプラットフォーム (PaaS) ツールです。ソース MongoDB インスタンスの oplog を読み取り、デスティネーションでリプレイすることで、データ分析、ディザスタリカバリ、アクティブ/アクティブのシナリオ向けの継続的な片方向同期を実現します。

MongoShake は、直接的なレプリケーションに加えて、SDK、Kafka、MetaQ を介したログサブスクリプションと消費をサポートしているため、ログサブスクリプション、データセンターの同期、非同期でのキャッシュエビクションといった用途に適しています。

詳細については、「MongoShake GitHub リポジトリ」をご参照ください。

対応トポロジ

ソース

デスティネーション

ECS インスタンス上のセルフマネージド MongoDB

ECS インスタンス上のセルフマネージド MongoDB

オンプレミスのセルフマネージド MongoDB

オンプレミスのセルフマネージド MongoDB

ApsaraDB for MongoDB インスタンス

ApsaraDB for MongoDB インスタンス

サードパーティクラウド MongoDB

サードパーティクラウド MongoDB

注意事項

  • 完全同期が完了する前に、ソースデータベースでデータ定義言語 (DDL) 操作を実行しないでください。データの不整合が発生する可能性があります。

  • local データベースは同期できません。admin データベースは同期できます。詳細については、「admin データベースからビジネスデータを移行する」をご参照ください。

  • 接続文字列 URI のパスワードに @ を含めることはできません。パスワードに @ が含まれている場合、接続に失敗します。

  • ソースがシャードクラスターインスタンスの場合、DDL 同期はサポートされていません。

必要な権限

ロール

必要な権限

ソース MongoDB インスタンス

readAnyDatabase、local データベースの read、mongoshake データベースの readWrite

宛先 MongoDB インスタンス

readWriteAnyDatabase、または宛先データベースの readWrite

MongoShake は、増分同期の開始時に、ソースインスタンスに mongoshake データベースを自動的に作成します。

MongoDB データベースユーザーを管理するには、「DMS を使用した MongoDB データベースユーザーの管理」または「db.createUser コマンド」をご参照ください。

前提条件

開始する前に、以下を確認してください。

  • ソース ApsaraDB for MongoDB レプリカセットインスタンスは、仮想プライベートクラウド (VPC) を使用している必要があります。クラシックネットワークを使用している場合は、まず VPC に切り替える必要があります。

  • ネットワーク遅延を最小限に抑えるため、ソースと同じ VPC 内に宛先 ApsaraDB for MongoDB レプリカセットインスタンスがあること。詳細については、「レプリカセットインスタンスを作成する」をご参照ください。

  • MongoShake を実行するために、ソース MongoDB インスタンスと同じ VPC 内に ECS インスタンスがあること。詳細については、「ECS インスタンスを作成する」をご参照ください。

  • ECS インスタンスのプライベート IP アドレスが、ソースと宛先の両方の MongoDB インスタンスのホワイトリストに追加されていること。詳細については、「ホワイトリストを変更する」をご参照ください。

ネットワークがこれらの要件を満たしていない場合は、両方の MongoDB インスタンスでパブリックエンドポイントを申請し、ECS インスタンスのパブリック IP アドレスを両方のホワイトリストに追加してください。詳細については、「パブリックエンドポイントを申請する」および「ホワイトリストを変更する」をご参照ください。

一方向同期の設定

この手順では、MongoShake を /test/mongoshake ディレクトリにインストールします。

  1. ECS インスタンスにログインします。利用可能なログイン方法については、「ECS サーバーへのログイン方法の概要」をご参照ください。

  2. MongoShake をダウンロードし、アーカイブの名前を変更します:

    このリンクから MongoShake 2.8.7 をダウンロードできます。最新バージョンについては、リリースページをご参照ください。
    wget "https://github.com/alibaba/MongoShake/releases/download/release-v2.8.7/mongo-shake-v2.8.7.tgz" -O mongoshake.tar.gz
  3. アーカイブを展開し、インストールディレクトリに移動します:

    tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.8.7 /test/mongoshake && cd /test/mongoshake
  4. 接続文字列と同期モードを設定します。collector.conf を開きます:

    パラメーター

    説明

    mongo_urls

    ソース MongoDB インスタンスの接続文字列 URI です。レイテンシーを最小限に抑えるには、VPC エンドポイントを使用します。パスワードには @ を含めることはできません。URI 形式については、「レプリカセットインスタンスの接続に関する説明」をご参照ください。

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

    tunnel.address

    宛先 MongoDB インスタンスの接続文字列 URI。レイテンシーを最小限に抑えるには、VPC エンドポイントを使用します。パスワードに @ を含めることはできません。URI 形式については、「レプリカセットインスタンスの接続説明」をご参照ください。

    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

    vi 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]

    キーシグナルは finish full sync, start incr sync です。この行が表示された後は、使用上の注意をご参照の上、ソースで DDL 操作を実行しないでください。

同期ステータスの監視

増分同期が開始されたら、新しいターミナルを開き、次のコマンドを実行します:

cd /test/mongoshake && ./mongoshake-stat --port=9100
mongoshake-stat は Python スクリプトです。実行する前に Python 2.7 をインストールしてください。詳細については、Python 公式サイトをご参照ください。

出力例:

Monitoring output

パラメーター

説明

logs_get/sec

1 秒あたりの oplog 取得数

logs_repl/sec

1 秒あたりの oplog リプレイ操作数

logs_success/sec

1 秒あたりの成功した oplog リプレイ操作数

lsn.time

最後に送信した oplog のタイムスタンプ

lsn_ack.time

宛先が書き込みを確認した時点のタイムスタンプ

lsn_ckpt.time

チェックポイントが永続化された時点のタイムスタンプ

now.time

現在時刻

replset

ソースレプリカセットの名前

admin データベースからのビジネスデータの移行

MongoDB では、admin データベースにビジネスデータを保存することは推奨していません。ロック動作や内部コマンドとの競合により、パフォーマンスが低下する可能性があるためです。

MongoShake は、admin データベースから admin 以外のデータベースへデータを同期できます。上記の手順に従い、ステップ 4 でcollector.conf に以下を追加してください。

filter.pass.special.db = admin

# admin データベースのすべてのコレクションを newDB に移行します
transform.namespace = admin:newDB

# または、特定のコレクションを移行します
# (複数のルールを設定できます)
transform.namespace = admin.abc:target.def

設定リファレンス

表 1. collector.conf のパラメーター

カテゴリ

パラメーター

説明

conf.version

設定ファイルのバージョン番号。変更しないでください。

conf.version = 4

グローバル

id

同期タスク ID。ログ名、チェックポイントデータベース名、および宛先データベース名として使用されます。

id = mongoshake

master_quorum

高可用性オプション。2 つのノードが同じソースから同期する場合、プライマリ MongoShake ノードで true に設定します。デフォルト: false

master_quorum = false

full_sync.http_port

完全同期ステータスを表示するための HTTP ポートです。デフォルト: 9101

full_sync.http_port = 9101

incr_sync.http_port

増分同期ステータスを表示するための HTTP ポート。デフォルト: 9100

incr_sync.http_port = 9100

system_profile_port

内部スタック情報を表示するためのプロファイリングポート。

system_profile_port = 9200

log.level

ログレベル。有効な値は errorwarninginfodebug です。デフォルトは 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 インスタンスの接続文字列 URI。レイテンシーを最小限に抑えるには、VPC エンドポイントを使用します。URI 形式については、「レプリカセットインスタンスの接続に関する説明」または「シャードクラスターインスタンスの接続に関する説明」をご参照ください。

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

mongo_cs_url

Configサーバーのエンドポイント。ソースがシャードクラスターインスタンスの場合に必要です。「シャードのエンドポイントの申請」をご参照ください。

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

mongos のエンドポイント。ソースがシャードクラスターインスタンスの場合に必要です。複数のアドレスはカンマで区切ります。「シャードのエンドポイントの申請」をご参照ください。

mongo_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

宛先エンドポイント。フォーマットは tunnel の値によって異なります: direct → MongoDB 接続文字列 URI; rpc → RPC 受信側アドレス; tcp → TCP 受信側アドレス; file → ファイルパス; kafkatopic@brokers1,brokers2; mock → 空白にします。

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

tunnel.message

チャネルのデータ形式です。tunnelkafka または file の場合にのみ有効です。raw: 集計モード (デフォルト)、json: 直接読み取り可能な JSON 形式、bson: BSON バイナリ形式。デフォルト: raw

tunnel.message = raw

mongo_connect_mode

接続モード。tunneldirect の場合にのみ有効です。primary: プライマリノードからプルします。secondaryPreferred: セカンダリノードからプルします。standalone: 指定された単一ノードからプルします。デフォルト: secondaryPreferred

mongo_connect_mode = secondaryPreferred

filter.namespace.black

同期から除外する名前空間。複数の値はセミコロン (;) で区切ります。名前空間はデータベース名とコレクションまたはインデックス名の組み合わせであり、たとえば 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 同期を有効にします。ソースがシャードクラスターインスタンスの場合、サポートされていません。デフォルト: false

filter.ddl_enable = false

checkpoint.storage.url

転送を再開するためのチェックポイントストレージのアドレス。設定されていない場合、MongoShake は mongoshake データベース (レプリカセットソース) または Configサーバーの admin データベース (シャードクラスターソース) に書き込みます。

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

checkpoint.storage.db

チェックポイント格納用のデータベース名。デフォルト: mongoshake

checkpoint.storage.db = mongoshake

checkpoint.storage.collection

チェックポイントを保存するためのコレクション名です。2 つの MongoShake ノードが同じソースから同期する場合、名前の競合を防ぐためにこの値を変更します。デフォルト値: ckpt_default

checkpoint.storage.collection = ckpt_default

checkpoint.start_position

レジューム伝送の開始位置。チェックポイントが既に存在する場合は無視されます。形式: YYYY-MM-DDTHH:MM:SSZ。デフォルト: 1970-01-01T00:00:00Z

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

transform.namespace

宛先に書き込む前に、ソースデータベースまたはコレクションの名前を変更します。 たとえば、fromA.fromB:toC.toD は、データベース fromA 内のコレクション fromB の名前を、データベース toC 内のコレクション toD に変更します。

transform.namespace = fromA.fromB:toC.toD

フル同期

full_sync.reader.collection_parallel

同時に取得するコレクションの最大数。

full_sync.reader.collection_parallel = 6

full_sync.reader.write_document_parallel

コレクションあたりの同時書き込みスレッド数。

full_sync.reader.write_document_parallel = 8

full_sync.reader.document_batch_size

書き込みバッチごとに集約されるドキュメント数。

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 が存在する場合、INSERTUPDATE に変換します。デフォルト: false

full_sync.executor.insert_on_dup_update = false

full_sync.executor.filter.orphan_document

ソースがシャードクラスターインスタンスの場合に、孤立したドキュメントをフィルターします。デフォルト: false

full_sync.executor.filter.orphan_document = false

full_sync.executor.majority_enable

宛先で majority write を有効にします。デフォルト: false

full_sync.executor.majority_enable = false

増分同期

incr_sync.mongo_fetch_method

増分データをプルする方法。oplog:ソースから oplog をプルします。change_stream:変更イベントをプルします (MongoDB 4.0 以降が必要です)。デフォルト: oplog

incr_sync.mongo_fetch_method = oplog

incr_sync.oplog.gids

クラウドクラスターの双方向レプリケーションを設定するために使用されます。

incr_sync.oplog.gids = xxxxxxxxxxxx

incr_sync.shard_key

内部の同時実行メソッド。変更しないでください。

incr_sync.shard_key = collection

incr_sync.worker

oplog を転送するための同時実行スレッド数。ソースがシャードクラスターインスタンスの場合、この値はシャードの数と等しくなければなりません。

incr_sync.worker = 8

incr_sync.worker.oplog_compressor

帯域幅消費を削減するためのデータ圧縮。 none: 圧縮しません。gzipzlibdeflate: それぞれの形式で圧縮します。 tunneldirect ではない場合にのみ有効です。 tunneldirect の場合、この値を none に設定します。 デフォルト: none

incr_sync.worker.oplog_compressor = none

incr_sync.target_delay

変更が宛先に適用されるまでの遅延を秒単位で指定します。ゼロ以外の値を設定することで、誤操作を防止できます。たとえば、1800 を設定すると 30 分の遅延が発生します。0 に設定すると、遅延同期は無効になります。

incr_sync.target_delay = 1800

incr_sync.worker.batch_queue_size

内部キューに関する設定。必要でない限り変更しないでください。

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 またはユニークインデックスが存在しない場合、UPDATEINSERT に変換します。デフォルト: false

incr_sync.executor.upsert = false

incr_sync.executor.insert_on_dup_update

_id または一意のインデックスが存在しない場合に INSERTUPDATE に変換します。 デフォルト: false

incr_sync.executor.insert_on_dup_update = false

incr_sync.conflict_write_to

書き込み競合が発生した場合に競合ドキュメントを記録します。none: 記録しない。db: 競合ログを mongoshake_conflict に書き込む。sdk: 競合ログを SDK に書き込む。デフォルト: none

incr_sync.conflict_write_to = none

incr_sync.executor.majority_enable

宛先でマジョリティ書き込みを有効にします。有効にするとパフォーマンスに影響します。デフォルト: false

incr_sync.executor.majority_enable = false

よくある質問

まず GitHub の MongoShake FAQ をご確認ください。そこに記載されていない問題については、GitHub Issues で問題をレポートしてください。