MongoShake は、Alibaba Cloud が開発したオープンソースツールで、データ分析、ディザスタリカバリ、アクティブ/アクティブ レプリケーションなどのユースケースで MongoDB データベース間のデータを同期します。このトピックでは、ApsaraDB for MongoDB インスタンス間のリアルタイム同期を構成する方法について説明します。
MongoShake
MongoShake は、Alibaba Cloud が Go 言語で開発した汎用サービスツールです。MongoDB の操作ログ (oplog) を読み取り、宛先インスタンスでリプレイすることで、MongoDB からデータをレプリケートします。
MongoShake は、データサブスクリプションと消費の機能も提供します。SDK、Kafka、MetaQ と統合し、ログサブスクリプション、データセンター同期、非同期キャッシュエビクションなどのシナリオをサポートします。
詳細については、「MongoShake GitHub リポジトリ」をご参照ください。
サポートされるデータソース
ソース | デスティネーション |
ECS インスタンス上のセルフマネージド MongoDB データベース | ECS インスタンス上のセルフマネージド MongoDB データベース |
オンプレミスのセルフマネージド MongoDB データベース | オンプレミスのセルフマネージド MongoDB データベース |
ApsaraDB for MongoDB インスタンス | ApsaraDB for MongoDB インスタンス |
サードパーティクラウド MongoDB データベース | サードパーティクラウド MongoDB データベース |
注意事項
完全同期が完了する前に、ソースデータベースで DDL 操作を実行しないでください。実行すると、データの不整合が発生する可能性があります。
ローカルデータベースの同期はサポートされていません。admin データベースからデータを同期するには、「admin データベースから非 admin データベースへのビジネスデータの移行」をご参照ください。
必要な権限
ソース | 必要な権限 |
ソース MongoDB インスタンス |
説明 MongoShake プログラムは、増分同期の開始時に、ソースインスタンスに |
ターゲット MongoDB インスタンス |
|
MongoDB データベースユーザーの作成と権限付与の方法については、DMS を使用した MongoDB データベースユーザーの管理または db.createUser コマンドをご参照ください。
前提条件
同期パフォーマンスを最適化するために、ソース MongoDB レプリカセットインスタンスが VPC を使用していることを確認してください。クラシックネットワークを使用している場合は、ネットワークタイプを VPC に切り替えてください。詳細については、「インスタンスのネットワークタイプをクラシックネットワークからVPCに切り替える」をご参照ください。
宛先の MongoDB レプリカセットインスタンスを作成してください。ネットワーク遅延を最小限に抑えるために、宛先インスタンスをソースインスタンスと同じ VPC 内に作成してください。詳細については、「レプリカセットインスタンスの作成」をご参照ください。
MongoShake を実行するための ECS インスタンスを作成してください。ネットワーク遅延を最小限に抑えるために、ECS インスタンスをソースインスタンスと同じ VPC 内に作成してください。詳細については、「ECSインスタンスの作成」をご参照ください。
ECS インスタンスのプライベート IP アドレスを、ソースと宛先の両方の MongoDB インスタンスのホワイトリストに追加し、ECS インスタンスが両方のインスタンスに接続できることを確認してください。詳細については、「ホワイトリストの変更」をご参照ください。
ネットワーク設定が上記の要件を満たさない場合は、ソースと宛先の両方の MongoDB インスタンスにパブリックエンドポイントを申請できます。次に、ECS インスタンスのパブリック IP アドレスを両方の MongoDB インスタンスのホワイトリストに追加して、パブリックエンドポイント経由で同期を実行してください。詳細については、「パブリックエンドポイントの申請」および「ホワイトリストの変更」をご参照ください。
操作手順
この手順では、MongoShake が /test/mongoshake ディレクトリにインストールされていることを前提とします。
ECS インスタンスにログインします。
説明シナリオに基づいてログイン方法を選択できます。詳細については、「ECS サーバーのログイン方法の概要」をご参照ください。
次のコマンドを実行して MongoShake プログラムをダウンロードし、
mongoshake.tar.gzに名前を変更します。wget "https://github.com/alibaba/MongoShake/releases/download/release-v2.8.7/mongo-shake-v2.8.7.tgz" -O mongoshake.tar.gz説明このコマンドは MongoShake 2.8.7 をダウンロードします。最新バージョンをダウンロードするには、releases ページをご参照ください。
次のコマンドを実行して MongoShake パッケージを /test/mongoshake ディレクトリに展開します。
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.8.7 /test/mongoshake && cd /test/mongoshakevi collector.confコマンドを実行して、MongoShake の設定ファイル collector.conf を変更します。次の表に主要なパラメーターを示します。パラメーター
説明
例
mongo_urls
ソース MongoDB インスタンスの接続文字列 URI。この例では、データベースアカウントは admin データベース内の test です。
説明ネットワーク遅延を最小限に抑えるために、VPC エンドポイントの使用を推奨します。
接続文字列 URI の形式の詳細については、「レプリカセットインスタンスの接続の説明」をご参照ください。
mongo_urls = mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717説明パスワードにアットマーク (
@) を含めることはできません。含めると、接続に失敗します。tunnel.address
ターゲット MongoDB インスタンスの接続文字列 URI。この例では、データベースアカウントは admin データベース内の test です。
説明ネットワーク遅延を最小限に抑えるために、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説明collector.conf のパラメーターの一覧については、付録の「collector.conf parameters」セクションをご参照ください。
次のコマンドを実行して同期タスクを開始し、ログを出力します。
./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]
ステータスのモニタリング
増分同期が開始されたら、新しいターミナルウィンドウを開き、次のコマンドを実行します。
cd /test/mongoshake && ./mongoshake-stat --port=9100mongoshake-stat は Python スクリプトであり、Python 2.7 がインストールされている必要があります。詳細については、Python の公式 Web サイトをご参照ください。
出力例:
./mongoshake-stat --port=9100
logs_get/sec | logs_repl/sec | logs_success/sec | lsn.time | lsn_ack.time | lsn_ckpt.time | now.time | replset
none | none | none | 2019-06-20 10:34:14 | 2019-06-20 10:34:13 | 2019-06-20 10:33:36 | 2019-06-20 10:34:14 | mgset-10
545 | 768 | 768 | 2019-06-20 10:34:15 | 2019-06-20 10:34:15 | 2019-06-20 10:34:14 | 2019-06-20 10:34:15 | mgset-10
541 | 511 | 511 | 2019-06-20 10:34:15 | 2019-06-20 10:34:15 | 2019-06-20 10:34:14 | 2019-06-20 10:34:16 | mgset-10
639 | 512 | 512 | 2019-06-20 10:34:16 | 2019-06-20 10:34:16 | 2019-06-20 10:34:14 | 2019-06-20 10:34:17 | mgset-10
543 | 512 | 512 | 2019-06-20 10:34:17 | 2019-06-20 10:34:17 | 2019-06-20 10:34:14 | 2019-06-20 10:34:18 | mgset-10
546 | 768 | 768 | 2019-06-20 10:34:19 | 2019-06-20 10:34:19 | 2019-06-20 10:34:14 | 2019-06-20 10:34:19 | mgset-10
538 | 512 | 512 | 2019-06-20 10:34:20 | 2019-06-20 10:34:20 | 2019-06-20 10:34:19 | 2019-06-20 10:34:20 | mgset-10
550 | 511 | 511 | 2019-06-20 10:34:21 | 2019-06-20 10:34:21 | 2019-06-20 10:34:19 | 2019-06-20 10:34:21 | mgset-10
546 | 512 | 512 | 2019-06-20 10:34:22 | 2019-06-20 10:34:22 | 2019-06-20 10:34:19 | 2019-06-20 10:34:22 | mgset-10
531 | 512 | 512 | 2019-06-20 10:34:23 | 2019-06-20 10:34:23 | 2019-06-20 10:34:19 | 2019-06-20 10:34:23 | mgset-10
547 | 512 | 512 | 2019-06-20 10:34:24 | 2019-06-20 10:34:24 | 2019-06-20 10:34:19 | 2019-06-20 10:34:24 | mgset-10
541 | 512 | 512 | 2019-06-20 10:34:24 | 2019-06-20 10:34:24 | 2019-06-20 10:34:19 | 2019-06-20 10:34:25 | mgset-10パラメーターの説明:
パラメーター | 説明 |
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
# または、admin データベースの abc コレクションをターゲットデータベースの def コレクションに移行します。複数のルールを設定できます。
transform.namespace = admin.abc:target.def付録
表 1. collector.conf パラメーター
カテゴリ | パラメータ | 説明 | 例 |
該当なし | conf.version | 設定ファイルのバージョンです。この値は変更しないでください。 |
|
グローバルオプション | id | 同期タスクの ID です。この値はカスタマイズできます。ログファイル名、チェックポイント情報を保存するデータベース名、および宛先インスタンスのデータベース名に使用されます。 |
|
master_quorum | 高可用性オプション。プライマリおよびスタンバイの MongoShake ノードが同じソースからデータを同期する場合、プライマリ MongoShake ノードでこのパラメーターを 有効な値:
説明 デフォルト値は |
| |
full_sync.http_port | フル同期のステータスを表示するための HTTP ポートです。 説明 デフォルト値は |
| |
incr_sync.http_port | 増分同期のステータスを表示するための HTTP ポートです。 説明 デフォルト値は |
| |
system_profile_port | 内部スタック情報を表示するためのプロファイリングポートです。 |
| |
log.level | ログレベルです。有効な値:
デフォルト値は |
| |
log.dir | ログファイルと PID ファイルのディレクトリです。このパラメータが設定されていない場合、デフォルトで現在のパスにある 説明 このパラメータには絶対パスを指定する必要があります。 |
| |
log.file | ログファイルの名前です。この値はカスタマイズできます。 説明 デフォルト値は |
| |
log.flush | 画面へのログ出力の更新頻度です。有効な値:
説明 デフォルト値は |
| |
sync_mode | データ同期モードです。有効な値:
説明 デフォルト値は |
| |
mongo_urls | ソース MongoDB インスタンスの接続文字列 URI です。この例では、データベースアカウントは 説明
|
| |
mongo_cs_url | ソースがシャードクラスターインスタンスの場合、ConfigServer (CS) ノードの接続文字列 URI を指定する必要があります。ConfigServer ノードの接続文字列 URI を取得する方法については、シャードのエンドポイントの申請をご参照ください。 この例では、データベースアカウントは |
| |
mongo_s_url | ソースがシャードクラスターインスタンスの場合、少なくとも 1 つの mongos ノードの接続文字列 URI を指定する必要があります。複数の mongos アドレスはカンマ (,) で区切ります。mongos ノードの接続文字列 URI を取得する方法については、シャードのエンドポイントの申請をご参照ください。 この例では、データベースアカウントは |
| |
tunnel | 同期チャネルタイプです。有効な値:
説明 デフォルト値は |
| |
tunnel.address | 宛先のアドレスです。サポートされるアドレス形式は、
この例では、データベースアカウントは |
| |
tunnel.message | チャネルのデータ型。このパラメーターは、 tunnel が
説明 デフォルト値は |
| |
mongo_connect_mode | MongoDB インスタンスの接続モード。このパラメーターは、tunnel が
説明 デフォルト値は |
| |
filter.namespace.black | データ同期のブラックリストを指定します。指定された名前空間は宛先データベースに同期されません。複数の名前空間はセミコロン (;) で区切ります。 説明 名前空間とは、MongoDB のコレクションまたはインデックスの正規名であり、 |
| |
filter.namespace.white | データ同期のホワイトリストを指定します。指定された名前空間のみが宛先データベースに同期されます。複数の名前空間はセミコロン (;) で区切ります。 |
| |
filter.pass.special.db | 特殊なデータベースの同期を有効にします。デフォルトでは、 |
| |
filter.ddl_enable | DDL 同期を有効にするかどうかを指定します。有効な値:
説明 ソースがシャードクラスターインスタンスの場合、この機能はサポートされていません。 |
| |
checkpoint.storage.url | チェックポイントのストレージアドレスです。再開可能な同期をサポートするために使用します。このパラメータが設定されていない場合、プログラムはインスタンスタイプに基づいて次のいずれかのデータベースにチェックポイントを書き込みます:
この例では、データベースアカウントは |
| |
checkpoint.storage.db | チェックポイントを保存するデータベースの名前です。 説明 デフォルト値は |
| |
checkpoint.storage.collection | チェックポイントを保存するコレクションの名前です。プライマリとスタンバイの MongoShake ノードが同じソースからデータを同期する場合、競合を防ぐためにこのコレクション名を変更できます。 説明 デフォルト値は |
| |
checkpoint.start_position | 同期の開始位置です。このパラメーターは、チェックポイントが見つからない場合にのみ使用されます。形式は 説明 デフォルト値は |
| |
transform.namespace | ソースデータベースまたはコレクションの名前を変更し、宛先に同期します。たとえば、ソースインスタンスの |
| |
フル同期オプション | full_sync.reader.collection_parallel | MongoShake が同時に取得できるコレクションの最大数です。 |
|
full_sync.reader.write_document_parallel | MongoShake のコレクションごとの同時書き込みスレッド数です。 |
| |
full_sync.reader.document_batch_size | 宛先インスタンスにドキュメントを書き込むためのバッチサイズです。たとえば、値が 128 の場合、128 個のドキュメントがバッチ処理されてから書き込まれます。 |
| |
full_sync.collection_exist_drop | 宛先にソースコレクションと同じ名前のコレクションが存在する場合の処理を指定します。有効な値:
|
| |
full_sync.create_index | 同期完了後にインデックスを作成するかどうかを指定します。有効な値:
|
| |
full_sync.executor.insert_on_dup_update | 移行先データベースに重複する
|
| |
full_sync.executor.filter.orphan_document | ソースがシャードクラスターインスタンスの場合、孤立ドキュメントを除外するかどうかを指定します。有効な値:
|
| |
full_sync.executor.majority_enable | 宛先インスタンスでマジョリティ書き込みを有効にするかどうかを指定します。有効な値:
|
| |
増分同期オプション | incr_sync.mongo_fetch_method | 増分データを取得する方法です。有効な値:
デフォルト値は |
|
incr_sync.oplog.gids | クラウドクラスターの双方向レプリケーションを設定するために使用します。 |
| |
incr_sync.shard_key | MongoShake の内部並行処理方法です。このパラメータは変更しないでください。 |
| |
incr_sync.worker | oplog を転送するための同時スレッド数です。ホストのパフォーマンスが十分な場合、この値を増やすことができます。 説明 ソースがシャードクラスターインスタンスの場合、スレッド数はシャード数と等しくなければなりません。 |
| |
incr_sync.worker.oplog_compressor | データ圧縮を有効にして、ネットワーク帯域幅の消費を削減します。有効な値:
説明 このパラメーターは、 |
| |
incr_sync.target_delay | ソースからの変更がデスティネーションに適用されるまでの遅延時間 (秒) です。このパラメーターを設定することで、誤操作を防ぐことができます。たとえば、 説明 値が |
| |
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 | 宛先インスタンスでマジョリティ書き込みを有効にするかどうかを指定します。有効な値:
説明 この機能を有効にすると、パフォーマンスに影響を与える可能性があります。 |
|
よくある質問
MongoShake FAQ をご参照ください。MongoShake の使用中にその他の問題が発生した場合は、GitHub Issues でイシューを作成してください。