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 インスタンス |
|
宛先 MongoDB インスタンス |
|
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 ディレクトリにインストールします。
ECS インスタンスにログインします。利用可能なログイン方法については、「ECS サーバーへのログイン方法の概要」をご参照ください。
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アーカイブを展開し、インストールディレクトリに移動します:
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.8.7 /test/mongoshake && cd /test/mongoshake接続文字列と同期モードを設定します。
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:3717tunnel.address宛先 MongoDB インスタンスの接続文字列 URI。レイテンシーを最小限に抑えるには、VPC エンドポイントを使用します。パスワードに
@を含めることはできません。URI 形式については、「レプリカセットインスタンスの接続説明」をご参照ください。tunnel.address = mongodb://test:**@dds-bp19f409d7512.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512**.mongodb.rds.aliyuncs.com:3717sync_mode同期範囲。
allはフル同期の後に増分同期を実行し、fullはフル同期のみを実行し、incrは増分同期のみを実行します。デフォルト:incr。sync_mode = allvi 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]キーシグナルは
finish full sync, start incr syncです。この行が表示された後は、使用上の注意をご参照の上、ソースで DDL 操作を実行しないでください。
同期ステータスの監視
増分同期が開始されたら、新しいターミナルを開き、次のコマンドを実行します:
cd /test/mongoshake && ./mongoshake-stat --port=9100mongoshake-stat は Python スクリプトです。実行する前に Python 2.7 をインストールしてください。詳細については、Python 公式サイトをご参照ください。出力例:

パラメーター | 説明 |
| 1 秒あたりの oplog 取得数 |
| 1 秒あたりの oplog リプレイ操作数 |
| 1 秒あたりの成功した oplog リプレイ操作数 |
| 最後に送信した oplog のタイムスタンプ |
| 宛先が書き込みを確認した時点のタイムスタンプ |
| チェックポイントが永続化された時点のタイムスタンプ |
| 現在時刻 |
| ソースレプリカセットの名前 |
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 のパラメーター
カテゴリ | パラメーター | 説明 | 例 |
— |
| 設定ファイルのバージョン番号。変更しないでください。 |
|
グローバル |
| 同期タスク ID。ログ名、チェックポイントデータベース名、および宛先データベース名として使用されます。 |
|
| 高可用性オプション。2 つのノードが同じソースから同期する場合、プライマリ MongoShake ノードで |
| |
| 完全同期ステータスを表示するための HTTP ポートです。デフォルト: |
| |
| 増分同期ステータスを表示するための HTTP ポート。デフォルト: |
| |
| 内部スタック情報を表示するためのプロファイリングポート。 |
| |
| ログレベル。有効な値は |
| |
| ログファイルと PID ファイル用のディレクトリです。絶対パスである必要があります。デフォルトは、現在のパスにある |
| |
| ログファイル名。デフォルト: |
| |
| ログの更新レート。 |
| |
| 同期範囲。 |
| |
| ソース MongoDB インスタンスの接続文字列 URI。レイテンシーを最小限に抑えるには、VPC エンドポイントを使用します。URI 形式については、「レプリカセットインスタンスの接続に関する説明」または「シャードクラスターインスタンスの接続に関する説明」をご参照ください。 |
| |
| Configサーバーのエンドポイント。ソースがシャードクラスターインスタンスの場合に必要です。「シャードのエンドポイントの申請」をご参照ください。 |
| |
| mongos のエンドポイント。ソースがシャードクラスターインスタンスの場合に必要です。複数のアドレスはカンマで区切ります。「シャードのエンドポイントの申請」をご参照ください。 |
| |
| 同期用のチャネルタイプ。 |
| |
| 宛先エンドポイント。フォーマットは |
| |
| チャネルのデータ形式です。 |
| |
| 接続モード。 |
| |
| 同期から除外する名前空間。複数の値はセミコロン ( |
| |
| 同期する名前空間。指定した名前空間のみが同期されます。複数の値はセミコロン ( |
| |
| 通常は除外されるデータベース (admin、local、mongoshake、config、system.views など) を含めます。複数の値はセミコロン ( |
| |
| DDL 同期を有効にします。ソースがシャードクラスターインスタンスの場合、サポートされていません。デフォルト: |
| |
| 転送を再開するためのチェックポイントストレージのアドレス。設定されていない場合、MongoShake は mongoshake データベース (レプリカセットソース) または Configサーバーの admin データベース (シャードクラスターソース) に書き込みます。 |
| |
| チェックポイント格納用のデータベース名。デフォルト: |
| |
| チェックポイントを保存するためのコレクション名です。2 つの MongoShake ノードが同じソースから同期する場合、名前の競合を防ぐためにこの値を変更します。デフォルト値: |
| |
| レジューム伝送の開始位置。チェックポイントが既に存在する場合は無視されます。形式: |
| |
| 宛先に書き込む前に、ソースデータベースまたはコレクションの名前を変更します。 たとえば、 |
| |
フル同期 |
| 同時に取得するコレクションの最大数。 |
|
| コレクションあたりの同時書き込みスレッド数。 |
| |
| 書き込みバッチごとに集約されるドキュメント数。 |
| |
| 宛先コレクションと送信元コレクションの名前が同じ場合の動作。 |
| |
| 同期後のインデックス作成。 |
| |
| 宛先に重複した |
| |
| ソースがシャードクラスターインスタンスの場合に、孤立したドキュメントをフィルターします。デフォルト: |
| |
| 宛先で majority write を有効にします。デフォルト: |
| |
増分同期 |
| 増分データをプルする方法。 |
|
| クラウドクラスターの双方向レプリケーションを設定するために使用されます。 |
| |
| 内部の同時実行メソッド。変更しないでください。 |
| |
| oplog を転送するための同時実行スレッド数。ソースがシャードクラスターインスタンスの場合、この値はシャードの数と等しくなければなりません。 |
| |
| 帯域幅消費を削減するためのデータ圧縮。 |
| |
| 変更が宛先に適用されるまでの遅延を秒単位で指定します。ゼロ以外の値を設定することで、誤操作を防止できます。たとえば、 |
| |
| 内部キューに関する設定。必要でない限り変更しないでください。 |
| |
|
| ||
|
| ||
MongoDB( |
|
|
|
|
|
| |
| 書き込み競合が発生した場合に競合ドキュメントを記録します。 |
| |
| 宛先でマジョリティ書き込みを有効にします。有効にするとパフォーマンスに影響します。デフォルト: |
|
よくある質問
まず GitHub の MongoShake FAQ をご確認ください。そこに記載されていない問題については、GitHub Issues で問題をレポートしてください。