MongoShake によるリアルタイム同期では、プライマリインスタンスでの誤操作 (コレクションの誤った削除や破損データの書き込みなど) が数秒以内にセカンダリインスタンスに複製されるため、対応する時間がありません。MongoShake 2.4.6 以降の incr_sync.target_delay パラメーターは、プライマリインスタンスとターゲットインスタンスの間に固定の遅延を導入します。これにより、問題のあるデータが到達する前に問題を検出し、同期を停止し、クリーンなセカンダリインスタンスにトラフィックをリダイレクトするための時間枠を確保できます。
本トピックでは、incr_sync.target_delay パラメーターについて説明します。MongoShake の一般的な設定については、「MongoShake を使用した ApsaraDB for MongoDB インスタンス間の一方向同期の実行」をご参照ください。前提条件
開始する前に、以下が準備できていることを確認してください。
MongoShake 2.4.6 以降。MongoShake のリリースページからダウンロードしてください。
Virtual Private Cloud (VPC) 内にあるソース ApsaraDB for MongoDB レプリカセットインスタンス。インスタンスがクラシックネットワーク上にある場合は、まずVPC へ切り替えてください。
ネットワーク遅延を最小限に抑えるため、ソースインスタンスと同じ VPC 内にあるターゲット ApsaraDB for MongoDB レプリカセットインスタンス。「レプリカセットインスタンスの作成」をご参照ください。
ネットワーク遅延を最小限に抑えるため、MongoShake を実行する同じ VPC 内の Elastic Compute Service (ECS) インスタンス。「ECS インスタンスの作成」をご参照ください。
MongoShake が接続できるように、ソースインスタンスとターゲットインスタンスの両方のホワイトリストに追加された ECS インスタンスのプライベート IP アドレス。「ホワイトリストの設定」をご参照ください。
お使いのネットワーク設定が VPC の要件を満たしていない場合は、両方のインスタンスのパブリックエンドポイントを申請し、代わりに ECS インスタンスのパブリック IP アドレスをホワイトリストに追加してください。「パブリックエンドポイントの申請」および「ホワイトリストの設定」をご参照ください。
仕組み
デフォルトでは、MongoShake はプライマリインスタンスの oplog を追跡し、ほぼリアルタイムでセカンダリインスタンスに変更を適用します。このため、誤操作はほぼ即座にセカンダリインスタンスに伝播します。
incr_sync.target_delay を設定すると、MongoShake は、変更を適用する前に指定された秒数だけ待機します。たとえば、遅延を 1,800 秒 (30 分) に設定した場合、現在の時刻が 10:00 であれば、セカンダリインスタンスは 09:30 時点のデータを反映します。09:30 のデータが適用される前に誤操作を検出した場合、同期を停止し、問題のあるデータが到達する前にセカンダリインスタンスにトラフィックをリダイレクトできます。
遅延同期の設定
以下の手順では、MongoShake ホストとして Ubuntu の ECS インスタンスを使用します。
ECS インスタンスにログインします。「ユーザー名とパスワードを使用した Linux インスタンスへの接続」をご参照ください。
MongoShake パッケージをダウンロードします。
wget <download-url>例:
wget https://github.com/alibaba/MongoShake/releases/download/v2.4.6/mongo-shake-2.4.6.tar.gz最新のダウンロード URL は、「MongoShake のリリースページ」で確認してください。
パッケージを展開します。
tar xvf <package-name>例:
tar xvf mongo-shake-2.4.6.tar.gzcollector.confを編集します。vi collector.confソースインスタンスとターゲットインスタンスの接続文字列、およびその他の必要なパラメーターを設定します。完全なパラメーターリファレンスについては、「MongoShake パラメーター」をご参照ください。
incr_sync.target_delayに、希望する遅延を秒単位で設定します。次の例では、30 分のバッファを設定します。incr_sync.target_delay = 1800collector.confを保存して閉じます。MongoShake を起動します。
./collector.linux -conf=collector.conf -verbose=1これで、MongoShake はプライマリインスタンスで発生した変更を 30 分後にセカンダリインスタンスに適用します。
誤操作からの回復
プライマリインスタンスで誤操作 (偶発的な書き込みやコレクションの削除など) が検出された場合は、以下の手順に従って、問題のあるデータがセカンダリインスタンスに到達する前に同期を停止し、その後、クリーンなセカンダリインスタンスにトラフィックをリダイレクトしてください。
プライマリインスタンスの oplog をクエリして、誤操作が発生した日時を特定します。次の例では、2020年6月1日から6月2日までのすべての oplog エントリを取得します。
use local // ローカルデータベースに切り替えます db.oplog.rs.find({"o.createTime": {$gte: new Date(2020,5,1), $lte: new Date(2020,5,2)}})完全な oplog のクエリ構文については、「MongoDB のドキュメント」をご参照ください。
ExitPointを挿入して、誤操作がセカンダリインスタンスに適用される前に、特定の時点で MongoShake を停止させます。curl -X POST --data '{"ExitPoint": <unix-timestamp>}' <mongoshake-host>:<port>/sentinel/options例:
curl -X POST --data '{"ExitPoint": 1593534600}' 127.0.0.1:9100/sentinel/optionsタイムスタンプ
1593534600は 2020年6月30日 16:30:00 に相当します。MongoShake は oplog 内でその時点に到達すると自動的に終了します。collector.confを開き、プライマリインスタンスとセカンダリインスタンスの IP アドレスを交換して、セカンダリインスタンスが新しい同期ソースになるようにします。MongoShake を再起動します。
./collector.linux -conf=collector.conf -verbose=1アプリケーションの接続文字列を新しいプライマリインスタンスにリダイレクトして、スイッチオーバーを完了します。
MongoShake のステータスの監視
監視手順については、「MongoShake のステータスの監視」をご参照ください。