Alibaba Cloud が開発した MongoShake ツールを使用して、ApsaraDB for MongoDB インスタンス間でデータを同期できます。 この機能は、データ分析、災害復旧、およびマルチアクティブシナリオに使用できます。 このトピックでは、レプリカセットインスタンス間で一方向データ同期を実行する方法について説明します。

レプリカセットインスタンス間で双方向データ同期を実装するには、チケットを起票する必要があります 。

MongoShake の概要

MongoShakeは、Alibaba Cloud が Go 言語で開発した汎用プラットフォームサービスツールです。 オペレーションログ (oplog) を読み取って ApsaraDB for MongoDB のデータをコピーし、特定の要件を満たすことができます。

MongoShake は、ログデータのサブスクリプションと消費もサポートしています。 MongoShakeは、SDK、Kafka、MetaQ など、さまざまな方法で接続できます。 ログサブスクリプション、データセンターの同期、非同期キャッシュエビクションなどのシナリオに適しています。

MongoShakeの詳細については、 GitHub の MongoShake ホームページをご参照ください。

サポートされるデータソース

同期元データベース 同期先データベース
  • ECS 上にユーザーが作成した MongoDB データベース
  • ユーザーが作成した MongoDB データベース
  • ApsaraDB for MongoDB インスタンス
  • クラウド上のサードパーティ製 MongoDB データベース
  • ECS 上にユーザーが作成した MongoDB データベース
  • ユーザーが作成した MongoDB データベース
  • ApsaraDB for MongoDB インスタンス
  • クラウド上のサードパーティ製 MongoDB データベース

このトピックでは、ApsaraDB for MongoDBインスタンス間のリアルタイムデータ同期の例で設定手順を説明します。 この手順は、ユーザーが作成したデータベース間のデータ同期にも適用できます。

注意事項

  • 完全なデータ同期が完了するまで、同期元データベースで DDL 操作を実行しないでください。 DDL 操作を実行すると、データの不整合が発生する可能性があります。
  • admin データベースとローカルデータベースの間でデータを同期することはできません。

データベースのユーザー権限

データソース 必要な権限
同期元の ApsaraDB for MongoDB インスタンス すべてのデータベースに対する読み取り、ローカルデータベースに対する読み取り、および mongoshake データベースに対する読み取りおよび書き込み権限。
同期先の ApsaraDB for MongoDB インスタンス すべてのデータベースに対する読み取りおよび書き込み権限、または同期先データベースに対する読み取りおよび書き込み権限。
MongoDBユーザーを作成および承認する方法の詳細については、 「DMSを使用してMongoDBユーザーを管理する」または「db.createUser()」をご参照ください。

準備作業

  1. 同期先として、ApsaraDB for MongoDBレプリカセットインスタンスを作成します。 詳細は、インスタンスの作成 をご参照ください。
    VPC経由で ECS に接続できるよう、ネットワークタイプを同期元のApsaraDB for MongoDB インスタンスと同じ VPC に設定します。
  2. MongoShakeを実行するECSインスタンスを作成します。 詳細については、「」「ECS インスタンスの作成」をご参照ください。
    ECS インスタンスのオペレーティングシステムを Linux に設定し、ネットワークタイプを新しく作成した ApsaraDB for MongoDB インスタンスと同じ VPC に設定します。
  3. ECS インスタンスの IP アドレスを、ソースおよび同期先 MongoDB インスタンスのホワイトリストに追加します。 ECS インスタンスが同期元および同期先の ApsaraDB for MongoDB インスタンスに接続できることを確認してください。
    ネットワーク経由の遅延を最小限に抑えるため、インスタンス間の接続には VPC を使用することを推奨します。

手順

  1. ECS インスタンスにログインします
  2. 以下のコマンドを実行して、MongoShake プログラムをダウンロードします。
    wget https://github.com/alibaba/MongoShake/releases/download/release-v2.0.7-20190817/mongo-shake-2.0.7.tar.gz
    最新の MongoShake プログラムをダウンロードすることを推奨します。 詳細については、Releases pageをご参照ください。
  3. 次のコマンドを実行して MongoShake プログラムを抽出します。
    tar xvf mongoshake-2.0.tar.gz
  4. コマンド vim を実行して、MongoShake のプロファイル collector.conf を編集します。 下表にパラメーター示します。
    パラメーター 説明 
    mongo_urls 同期元インスタンスの接続文字列 URI。
    • ネットワーク経由の遅延を最小限に抑えるため、インスタンス間の接続には内部接続文字列 URI を使用することを推奨します。
    • 接続文字列 URI の書式については、 「レプリカセットインスタンスの接続情報の取得」をご参照ください。
    mongo_urls = mongodb://root:Ftxxxxxx@dds-bpxxxxxxxx.mongodb.rds.aliyuncs.com:3717,dds-bpxxxxxxxx.mongodb.rds.aliyuncs.com:3717
    tunnel.address 同期先インスタンスの接続文字列 URI。 tunnel.address = mongodb://root:Ftxxxxxx@dds-bpxxxxxxxx.mongodb.rds.aliyuncs.com:3717,dds-bpxxxxxxxx.mongodb.rds.aliyuncs.com:3717
    sync_mode データの同期方法。 設定可能な値:
    • all:完全データ同期と増分データ同期の両方
    • document:完全なデータ同期のみ
    • oplog:増分データ同期のみ
    デフォルト値は、oplog です。
    sync_mode = all
    replayer.dml_only DML 操作のみを同期するかどうかを示します。 設定可能な値:
    • false
    • true
    デフォルト値は、true です。
    replayer.dml_only = false
    filter.namespace.black データ同期のブラックリスト。 指定された名前空間は、同期先データベースに同期されません。 複数の名前空間はセミコロン (;) で区切ります。
    名前空間は、ApsaraDB for MongoDBのコレクションまたはインデックスの標準名です。 データベース名とコレクション名またはインデックス名を組み合わせたものです ( 例: mongodbtest.customer )。
    filter.namespace.black = mongodbtest.customer;testdata.test123
    filter.namespace.white データ同期のホワイトリスト。 指定された名前空間のみ、同期先データベースに同期されます。 複数の名前空間はセミコロン (;) で区切ります。 filter.namespace.white = mongodbtest.customer;test123
  5. 次のコマンドを実行してデータ同期タスクを開始し、ログ情報を生成します。
    ./collector -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 をモニターできます。
./mongoshake-stat --port=9100

モニタリング出力の例:

モニタリング出力
パラメーター 説明 
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 同期元データベースのレプリカセットの名前。