Alibaba Cloudが開発したオープンソースのMongoShakeツールを使用して、MongoDBデータベース間でデータを同期できます。 このツールは、データ分析、ディザスタリカバリ、アクティブ /アクティブレプリケーションなどのシナリオで使用できます。 このトピックでは、ApsaraDB for MongoDBレプリカセットインスタンス間でデータをリアルタイムで同期するようにMongoShakeを設定する方法について説明します。
MongoShake の概要
MongoShakeは、Alibaba CloudによってGo言語で記述された、汎用のサービスとしてのプラットフォーム (PaaS) ツールです。 MongoShakeは、MongoDBデータベースのoplogを読み取り、特定の要件を満たすためにoplogに基づいてデータを複製します。
MongoShakeでは、MongoDBログをサブスクライブして使用することもできます。 SDK、Kafka、MetaQなどの複数の方法を使用してMongoShakeに接続できます。 MongoShakeは、ログサブスクリプション、データセンター間のデータ同期、非同期キャッシュの削除などのシナリオに適しています。
MongoShakeの詳細については、GitHubのMongoShakeホームページをご覧ください。
サポートされるデータソース
ソースデータベース | 宛先データベース |
ECSでホストされる自己管理型MongoDBデータベース | ECSでホストされる自己管理型MongoDBデータベース |
オンプレミスマシンでホストされる自己管理型MongoDBデータベース | オンプレミスマシンでホストされる自己管理型MongoDBデータベース |
ApsaraDB for MongoDB インスタンス | ApsaraDB for MongoDB インスタンス |
サードパーティのクラウド上のMongoDBデータベース | サードパーティのクラウド上のMongoDBデータベース |
使用上の注意
完全なデータ同期が完了する前に、ソースデータベースでデータ定義言語 (DDL) 操作を実行しないでください。 DDL 操作を実行すると、データの不整合が発生する可能性があります。
MongoShakeを使用して、管理データベースとローカルデータベースのデータを同期することはできません。
データベースに必要な権限
同期するデータソース | 必要な権限 |
同期元の ApsaraDB for MongoDB インスタンス | readAnyDatabase権限、ローカルデータベースの読み取り権限、およびmongoshakeデータベースの読み取り /書き込み権限 説明 mongoshakeデータベースは、増分同期タスクの開始時に、MongoShakeによってソースで作成されます。 |
同期先の ApsaraDB for MongoDB インスタンス | ターゲットデータベースに対するreadWriteAnyDatabaseの権限またはreadWrite権限 |
MongoDBユーザーを作成および権限付与する方法の詳細については、「MongoDBデータベースユーザーの権限の管理」または「db.createUser() 」をご参照ください。
準備
最高の同期パフォーマンスを得るために、ソースApsaraDB For MongoDBレプリカセットインスタンスが仮想プライベートクラウド (VPC) にあることを確認してください。 ソースインスタンスがクラシックネットワークにある場合は、ネットワークタイプをVPCに切り替えます。 詳細については、「ApsaraDB For MongoDBインスタンスのネットワークタイプをクラシックネットワークからVPCに切り替える」をご参照ください。
同期先としてApsaraDB for MongoDBレプリカセットインスタンスを作成します。 ソースApsaraDB for MongoDBレプリカセットインスタンスで使用されているVPCと同じVPCを選択して、ネットワーク遅延を最小限に抑えます。 詳細については、「レプリカセットインスタンスの作成」をご参照ください。
Elastic Compute Service (ECS) インスタンスを作成してMongoShakeを実行します。 ソースApsaraDB for MongoDBインスタンスで使用されているVPCと同じVPCを選択して、ネットワーク遅延を最小限に抑えます。 詳細は、「ECSインスタンスの作成」をご参照ください。
ECSインスタンスのプライベートIPアドレスを、ソースおよびターゲットのApsaraDB for MongoDBインスタンスのホワイトリストに追加します。 ECS インスタンスが同期元および同期先の ApsaraDB for MongoDB インスタンスに接続できることを確認してください。 詳細については、「ApsaraDB For MongoDBインスタンスのIPアドレスホワイトリストの変更」をご参照ください。
ネットワークタイプが上記の要件を満たしていない場合、ソースおよびターゲットApsaraDB for MongoDBインスタンスのパブリックエンドポイントを申請できます。 次に、ECSインスタンスのパブリックIPアドレスを、ソースおよびターゲットのApsaraDB for MongoDBインスタンスのホワイトリストに追加します。 このようにして、インターネット経由でデータを同期できます。 詳細については、「パブリックエンドポイントの申請」および「ApsaraDB For MongoDBインスタンスのIPアドレスホワイトリストの変更」をご参照ください。
手順
この例では、デフォルトで /test/mongoshakeディレクトリがMongoShakeのインストールディレクトリとして使用されます。
Elastic Compute Service (ECS) インスタンスにログインします。
説明ビジネスシナリオに基づいて接続方法を選択できます。 詳細については、「接続方法の概要」をご参照ください。
次のコマンドを実行して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 V2.4.16のダウンロードURLを使用します。 MongoShakeの最新バージョンをダウンロードするには、リリースにアクセスしてください。
次のコマンドを実行して、MongoShakeパッケージを /test/mongoshakeディレクトリに解凍します。
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.4.16 /test/mongoshake && cd /test/mongoshake/mongo-shake-v2.4.16
vi collector.conf
コマンドを実行し、MongoShakeのcollector.conf設定ファイルを変更します。 次の表に、ApsaraDB for MongoDBインスタンス間でデータを同期するために設定する必要があるパラメーターを示します。パラメーター
説明
例
mongo_urls
ソースApsaraDB for MongoDBインスタンスの接続文字列URI。 データベースアカウントはtestで、データベースはadminです。
説明ネットワーク遅延を最小限に抑えるために、VPCエンドポイントを使用することを推奨します。
接続文字列URIの形式の詳細については、「レプリカセットインスタンスへの接続」をご参照ください。
mongo_urls = mongodb:// test:**** @ dds-bp19f409d7512 **** .mongodb.rds.aliyuncs.com:3717、dds-bp19f409d7512 **** .mongodb.rds.aliyuncs.com:3717
説明パスワードにat signs (@) を含めることはできません。 そうしないと、接続が失敗する可能性があります。
tunnel.address
ターゲットApsaraDB for MongoDBインスタンスの接続文字列URI。 データベースアカウントはtestで、データベースはadminです。
説明ネットワーク遅延を最小限に抑えるために、VPCエンドポイントを使用することを推奨します。
接続文字列URIの形式の詳細については、「レプリカセットインスタンスへの接続」をご参照ください。
tunnel.address = mongodb:// test:**** @ dds-bp19f409d7512 **** .mongodb.rds.aliyuncs.com:3717、dds-bp19f409d7512 **** .mongodb.rds.aliyuncs.com:3717
説明パスワードにat signs (@) を含めることはできません。 そうしないと、接続が失敗する可能性があります。
sync_mode
データの同期方法。 有効な値:
all: 完全データ同期と増分データ同期の両方を実行します。
full: 完全なデータ同期のみを実行します。
incr: 増分データ同期のみを実行します。
説明デフォルト値: incr。
sync_mode=すべて
説明collector.conf設定ファイルのすべてのパラメーターの詳細については、このトピックの付録を参照してください。
次のコマンドを実行してデータ同期タスクを開始し、ログ情報を生成します。
. /collector.linux -conf=collector.conf -verbose
ログ情報を確認します。 次のログが表示されると、完全なデータ同期が完了し、増分データ同期が開始されます。
[09:38:57 CST 2019/06/20] [INFO] (mongoshake/collector.(* ReplicationCoordinator).Run:80) 完全同期を終了し、timestamp: fullBeginTs[1560994443] 、fullFinishTs[1560994737]
MongoShake のステータスをモニターする
増分データ同期の開始後、コマンドラインウィンドウを開いて MongoShake をモニターできます。
cd /test/mongoshake &&。/mongoshake-stat -- port=9100
mongoshake-stat
はPythonスクリプトです。 スクリプトを実行する前に、Python 2.7をインストールします。 詳細については、Python公式Webサイトをご覧ください。
MongoShakeのモニタリング情報の例を次の図に示します。
上記の監視情報に含まれるパラメーターを次の表に示します。
パラメーター | 説明 |
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 | ソースデータベースが存在するレプリカセットインスタンスの名前。 |
付録
カテゴリ | パラメーター | 説明 | 例 |
N/A | conf.version | 設定ファイルのバージョン。 Do not change the value. |
|
グローバル設定オプション | id | 同期タスクのID。 この値はカスタマイズ可能です。 グローバル構成には、ログファイル名、チェックポイント情報を格納するデータベースの名前、およびターゲットデータベースの名前が含まれます。 |
|
master_quorum | MongoShakeノードが高可用性シナリオのアクティブノードであるかどうかを指定します。 アクティブなMongoShakeノードとスタンバイMongoShakeノードを使用して同じデータベースのデータを同期する場合、アクティブなMongoShakeノードに対してこのパラメーターを 有効な値:
説明 デフォルト値:false |
| |
full_sync.http_port | インターネット上のMongoShakeで完全なデータ同期のステータスを表示するために使用されるHTTPポート。 説明 デフォルト値: 9101 |
| |
incr_sync.http_port | インターネット上のMongoShakeで増分データ同期のステータスを表示するために使用されるHTTPポート。 説明 デフォルト値: 9100 |
| |
system_profile_port | 内部スタック情報の表示に使用されるプロファイリングポート。 |
| |
log.level | 生成されるログのレベル。 有効な値:
デフォルト値: info |
| |
log.dir | ログファイルとPIDファイルが保存されているディレクトリ。 このパラメーターを設定しない場合、ログファイルとPIDファイルは作業ディレクトリのログディレクトリに格納されます。 説明 このパラメーターは絶対パスに設定する必要があります。 |
| |
log.file | ログファイルの名前。 この値はカスタマイズ可能です。 説明 デフォルト値: collector.log。 |
| |
log.flush | すべてのログエントリを画面に表示するかどうかを指定します。 有効な値:
説明 デフォルト値:false |
| |
sync_mode | データの同期方法。 有効な値:
説明 デフォルト値: incr。 |
| |
mongo_urls | ソースApsaraDB for MongoDBインスタンスの接続文字列URI。 データベースアカウントはtestで、データベースはadminです。 説明
|
| |
mongo_cs_url | ConfigServerノードのエンドポイント。 ソースApsaraDB for MongoDBインスタンスがシャードクラスターインスタンスの場合、このパラメーターを設定する必要があります。 ConfigServerノードのエンドポイントを申請する方法の詳細については、「シャードまたはConfigServerノードのエンドポイントを申請する」をご参照ください。 データベースアカウントはtestで、データベースはadminです。 |
| |
mongo_s_url | mongosノードのエンドポイント。 ソースApsaraDB for MongoDBインスタンスがシャードクラスターインスタンスの場合、このパラメーターを設定する必要があります。 少なくとも1つのmongosノードのエンドポイントを指定する必要があります。 複数のmongosノードのエンドポイントをコンマ (,) で区切ります。 mongosノードのエンドポイントを申請する方法の詳細については、「シャードまたはConfigServerノードのエンドポイントを申請する」をご参照ください。 データベースアカウントはtestで、データベースはadminです。 |
| |
tunnel | 同期に使用されるトンネルのタイプ。 有効な値:
説明 デフォルト値: direct。 |
| |
tunnel.address | トンネルを介してターゲットApsaraDB for MongoDBインスタンスに接続するために使用されるアドレス。
データベースアカウントはtestで、データベースはadminです。 |
| |
tunnel.message | トンネルに書き込まれるデータのタイプ。 このパラメーターは、tunnelパラメーターが
説明 デフォルト値: raw。 |
| |
mongo_connect_mode | MongoShakeがデータをプルするノードのタイプ。 このパラメーターは、tunnelパラメーターが
説明 デフォルト値: secondaryPreferred。 |
| |
filter.namespace.black | データ同期用の名前空間ブラックリスト。 指定された名前空間は、同期先データベースに同期されません。 複数の名前空間はセミコロン (;) で区切ります。 説明 名前空間は、ApsaraDB for MongoDBのコレクションまたはインデックスの標準名です。 データベース名とコレクションまたはインデックス名で構成されます。 例: |
| |
filter.namespace.white | データ同期のホワイトリスト。 指定された名前空間のみがターゲットデータベースに同期されます。 複数の名前空間はセミコロン (;) で区切ります。 |
| |
filter.pass.special.db | データを同期先データベースに同期するための特別なデータベース。 複数の特殊データベースを指定できます。 デフォルトでは、admin、local、mongoshake、config、system.viewsなどの特別なデータベースのデータは同期されません。 このパラメーターを設定して、特別なデータベースのデータを同期できます。 複数のデータベース名をセミコロン (;) で区切ります。 |
| |
フィルター. ddl_enable | DDL操作を同期するかどうかを指定します。 有効な値:
説明 ソースApsaraDB for MongoDBインスタンスがシャードクラスターインスタンスの場合、このパラメーターをtrueに設定することはできません。 |
| |
checkpoint.storage.url | 再開可能な送信に使用されるチェックポイントの保存場所。 このパラメーターを設定しない場合、MongoShakeはソースApsaraDB for MongoDBインスタンスのタイプに基づいて、次のデータベースにチェックポイントを書き込みます。
データベースアカウントはtestで、データベースはadminです。 |
| |
checkpoint.storage.db | チェックポイントを格納するデータベースの名前。 説明 デフォルト値: mongoshake。 |
| |
checkpoint.storage.collection | チェックポイントを格納するコレクションの名前。 アクティブなMongoShakeノードとスタンバイのMongoShakeノードを使用して同じデータベースのデータを同期する場合、このコレクション名を変更して、重複するコレクション名による競合を回避できます。 説明 デフォルト値: ckpt_default。 |
| |
checkpoint.start_position | 再開可能な送信の開始位置。 チェックポイントが存在する場合、このパラメーターは無効です。 このパラメーターの値を 説明 デフォルト値: 1970-01-01T00:00:00Z。 |
| |
transform.nameスペース | 移行元データベースまたは移行先データベースのコレクションの名前を変更するためのルール。 たとえば、ターゲットデータベースのデータベース名とコレクション名を |
| |
フルデータ同期オプション | full_sync.reader.collection_parallel | MongoShakeによって一度に同時にプルできるコレクションの最大数。 |
|
full_sync.reader.write_document_parallel | コレクションの書き込みにMongoShakeによって使用される同時スレッドの数。 |
| |
full_sync.reader.document_batch_size | 一度にターゲットApsaraDB for MongoDBインスタンスに書き込まれるドキュメントの数。 たとえば、値128は、128のドキュメントが一度にターゲットApsaraDB For MongoDBインスタンスに書き込まれることを示します。 |
| |
full_sync.collection_exist_drop | 同期前にソースコレクションと同じ名前を持つターゲットデータベースのコレクションを削除するかどうかを指定します。 有効な値:
|
| |
full_sync.create_index | 同期完了後にインデックスを作成するかどうかを指定します。 有効な値:
|
| |
full_sync.executor.insert_on_dup_update | ターゲットデータベースのドキュメントの値がソースデータベースのドキュメントと同じ
|
| |
full_sync.executor.filter.orphan_document | ソースApsaraDB for MongoDBインスタンスがシャードクラスターインスタンスの場合、孤立したドキュメントを除外するかどうかを指定します。 有効な値:
|
| |
full_sync.executor.majority_enable | ターゲットApsaraDB for MongoDBインスタンスで多数決書き込み機能を有効にするかどうかを指定します。 有効な値:
|
| |
増分データ同期オプション | incr_sync.mongo_fetch_method | 増分データをプルするために使用されるメソッド。 有効な値:
デフォルト値: oplog |
|
incr_sync.oplog.gids | ApsaraDB for MongoDBインスタンスの双方向レプリケーションの実装に使用されるグローバルID。 |
| |
incr_sync.shard_key | 内部ワーカースレッドに同時要求を分散するために使用されるメソッド。 このパラメーター値は変更しないでください。 |
| |
incr_sync.worker | oplogの送信に使用される同時スレッドの数。 インスタンスが十分なパフォーマンスを提供する場合は、同時スレッドの数を増やすことができます。 説明 ソースApsaraDB for MongoDBインスタンスがシャードクラスターインスタンスの場合、同時スレッドの数はシャードの数と等しくなければなりません。 |
| |
incr_sync.worker.oplog_compressor | データを解凍してネットワーク帯域幅の使用を減らすかどうかを指定します。 有効な値:
説明 このパラメーターは、tunnelパラメーターが |
| |
incr_sync.target_delay | ソースとターゲットのApsaraDB for MongoDBインスタンス間でデータを同期するための遅延時間。 既定では、ソースデータベースの変更はターゲットデータベースにリアルタイムで同期されます。 無効な操作を回避するには、このパラメーターを設定して同期を遅延させます。 たとえば、 説明 値0は、データがリアルタイムで同期されることを示す。 |
| |
incr_sync.worker.batch_queue_size | MongoShakeで内部キューを設定するためのパラメーター。 特に必要がない限り、これらのパラメータを変更しないでください。 |
| |
incr_sync.adaptive.batching_max_size |
| ||
incr_sync.fetcher.buffer_capacity |
| ||
直接同期オプション (トンネルパラメータが | incr_sync.executor.upsert | ターゲットデータベースのドキュメントがソースデータベースのドキュメントと同じ
|
|
incr_sync.executor.insert_on_dup_update | ターゲットデータベースのドキュメントに、ソースデータベースのドキュメントと同じ
|
| |
incr_sync.conflict_write_to | 同期中に書き込みの競合が発生した場合に、競合するドキュメントを記録するかどうかを指定します。 有効な値:
|
| |
incr_sync.executor.majority_enable | ターゲットApsaraDB for MongoDBインスタンスで多数決書き込み機能を有効にするかどうかを指定します。 有効な値:
説明 多数決書き込み機能は、性能を損なう可能性がある。 |
|
よくある質問
詳細については、次をご参照ください: FAQ。