Data Transmission Service (DTS) を使用して、ソースデータベースをオフラインにすることなく、MongoDB レプリカセットから別のレプリカセットまたはシャードクラスターにデータを継続的に同期します。
サポートされるソースデータベースとターゲットデータベース
| ソース | 宛先 | 注 |
|---|---|---|
| ApsaraDB for MongoDB レプリカセットインスタンス | ApsaraDB for MongoDB レプリカセットまたはシャードクラスターインスタンス | このトピックでは、この組み合わせを例として使用します。 |
| Elastic Compute Service (ECS) インスタンス上の自己管理 MongoDB レプリカセット | ECS インスタンス上の自己管理 MongoDB レプリカセットまたはシャードクラスター | 同じ手順に従ってください。 |
| Express Connect、VPN Gateway、または Smart Access Gateway (SAG) 経由で接続された自己管理 MongoDB レプリカセット | Express Connect、VPN Gateway、または SAG 経由で接続された自己管理 MongoDB レプリカセットまたはシャードクラスター | 同じ手順に従ってください。 |
サポートされている MongoDB のバージョンの組み合わせについては、「データ同期シナリオの概要」をご参照ください。ターゲットのバージョンは、ソースのバージョンと同じか、それ以降である必要があります。
前提条件
開始する前に、以下を確認してください:
ソースの ApsaraDB for MongoDB レプリカセットインスタンスと、ターゲットのレプリカセットまたはシャードクラスターインスタンスの両方を作成済みであること。詳細については、「レプリカセットインスタンスの作成」および「シャードクラスターインスタンスの作成」をご参照ください。
ターゲットインスタンスの利用可能なストレージ容量が、ソースインスタンスの総データサイズより少なくとも 10% 大きいことを確認済みであること。
(シャードクラスターをターゲットとする場合) シャーディング対象のデータベースとコレクションを作成し、シャーディングを設定し、バランサーを有効にし、事前シャーディングを実行済みであること。詳細については、「シャードのパフォーマンスを最大化するためのシャーディング設定」をご参照ください。
事前シャーディングは、同期データをシャードに分散し、データスキューを防ぎます。ソースデータにシャードキーを追加できない場合は、「MongoDB (シャードキーなし) を MongoDB (シャードクラスターアーキテクチャ) に同期する」をご参照ください。
課金
| 同期タイプ | 料金 |
|---|---|
| スキーマ同期と完全データ同期 | 無料 |
| 増分データ同期 | 課金対象です。「課金概要」をご参照ください。 |
サポートされる同期トポロジ
一方向 1 対 1 同期
一方向 1 対多同期
一方向多対 1 同期
一方向カスケード同期
詳細については、「同期トポロジ」をご参照ください。
同期タイプ
| タイプ | DTS が同期する内容 |
|---|---|
| スキーマ同期 | 選択したオブジェクトのスキーマをソースからターゲットへ |
| 完全データ同期 | 選択したオブジェクトの履歴データ。サポートされるオブジェクト:データベースとコレクション。 |
| 増分データ同期 | 完全同期完了後の継続的な変更。サポートされる操作:CREATE COLLECTION、CREATE INDEX、DROP DATABASE、DROP COLLECTION、DROP INDEX、RENAME COLLECTION、およびドキュメントレベルの挿入、更新、削除。タスク開始後に作成されたデータベースは含まれません。トランザクションは単一のレコードに変換され、トランザクションコンテキストは保持されません。oplog の使用DTS タスクは、タスクの実行開始後に作成されたデータベースからの増分データを同期しません。DTS は、以下の操作によって生成された増分データを同期します:
change streams の使用DTS は、以下の操作によって生成された増分データを同期します:
|
制限事項
タスクを設定する前に、これらの制約を確認してください。これらに違反すると、タスクの失敗やデータの不整合が発生する可能性があります。
ソースデータベースの要件
| 制約 | 詳細 |
|---|---|
| アウトバウンド帯域幅 | ソースサーバーには十分なアウトバウンド帯域幅が必要です。帯域幅が不足すると同期が遅くなります。 |
| プライマリキーまたは一意キー | コレクションには、フィールド値が重複しない PRIMARY KEY または UNIQUE 制約が必要です。そうでない場合、ターゲットに重複レコードが含まれる可能性があります。 |
| コレクション数 (ターゲットコレクションの編集時) | 同期オブジェクトとしてコレクションを選択し、ターゲットで名前を変更する予定の場合、タスクあたり最大 1,000 コレクションです。これ以上のコレクションがある場合は、複数のタスクを実行するか、データベースレベルで同期してください。 |
| 単一ドキュメントのサイズ | 16 MB を超えることはできません。より大きなドキュメントはタスクの失敗を引き起こします。 |
| サポートされていないソース | Azure Cosmos DB for MongoDB クラスターおよび Amazon DocumentDB エラスティッククラスターはサポートされていません。 |
| oplog または change streams | oplog を有効にし、少なくとも 7 日間のログを保持する必要があります。または、過去 7 日間をカバーする change streams を有効にしてください。どちらの条件も満たされない場合、DTS は変更をキャプチャできず、データ損失を引き起こす可能性があり、これは DTS の SLA の対象外です。可能な限り oplog を使用してください。change streams は MongoDB 4.0 以降が必要で、双方向同期をサポートしていません。非エラスティックな Amazon DocumentDB クラスターの場合、change streams を有効にし、移行方法を ChangeStream に、アーキテクチャをシャードクラスターに設定してください。 |
| TTL インデックス | TTL インデックスを持つコレクションは同期できません。同期を試みると、データの不整合が発生する可能性があります。 |
| 同期中のスキーマ変更 | スキーマ同期または完全データ同期の実行中は、データベースまたはコレクションのスキーマ (配列型の更新を含む) を変更しないでください。 |
| 完全同期のみの場合の書き込み | 増分同期を実行しない場合、完全データ同期中にソースデータベースに書き込まないでください。 |
ターゲットデータベースの要件
| 制約 | 詳細 |
|---|---|
| シャードクラスター:孤立ドキュメント | 開始前にすべての孤立ドキュメントをクリアしてください。孤立ドキュメントはパフォーマンスを低下させ、_id の競合やタスクの失敗を引き起こす可能性があります。 |
| シャードクラスター:シャードキー | 開始前にソースデータにシャードキーを追加してください。同期中、INSERT 操作にはシャードキーを含める必要があり、UPDATE 操作ではシャードキーを変更できません。 |
| レプリカセット:接続エンドポイント | Express Connect、VPN Gateway、SAG、パブリック IP アドレス、または Cloud Enterprise Network (CEN) を介して接続する場合、[ドメイン名または IP] および [ポート番号] をプライマリノードの IP アドレスとポートに設定するか、高可用性エンドポイントを使用します。詳細については、「高可用性 MongoDB データベースをソースまたはターゲットとして使用する DTS タスクの作成」をご参照ください。自己管理型 ECS インスタンスを介して接続する場合、[ポート番号] をプライマリノードのポートに設定します。 |
| 一意なインデックスまたは capped コレクション | 一意なインデックスまたは capped: true を持つコレクションは、シングルスレッドの書き込みのみをサポートします。これにより、増分同期中の同時リプレイが無効になり、レイテンシーが増加する可能性があります。 |
| 除外されるデータベース | DTS は admin または local データベースを同期しません。 |
| プライマリキーの競合 | ターゲットにソースと同じ _id を持つドキュメントがないことを確認してください。競合が存在する場合、タスクを開始する前にターゲットから競合するドキュメントを削除してください。 |
一般的な制約
| 制約 | 詳細 |
|---|---|
| パフォーマンスへの影響 | データを同期する前に、ソースおよびターゲットデータベースのパフォーマンスへの影響を評価してください。オフピーク時にデータを同期することを推奨します。完全データ同期中、DTS はソースおよびターゲットデータベースの読み取りおよび書き込みリソースを使用するため、データベースサーバーの負荷が増加する可能性があります。 |
| ストレージの拡張 | 完全同期中の同時書き込みは、コレクションの断片化を引き起こします。ターゲットのストレージは、ソースよりも 5%~10% 大きくなります。 |
| 他のソースからの書き込み | 同期中に他のソース (例えば、オンライン DDL 操作のために Data Management (DMS) を使用するなど) からターゲットに書き込まないでください。同時外部書き込みはデータ損失を引き起こす可能性があります。 |
| カウントクエリの構文 | ターゲットでドキュメントをカウントするには、db.$table_name.aggregate([{ $count:"myCount"}]) を使用してください。 |
| タスクの回復 | DTS タスクが失敗した場合、DTS サポートは 8 時間以内に復旧を試みます。回復中にタスクが再起動されたり、タスクパラメーターが変更されたりする場合があります。データベースパラメーターは変更されません。 |
| 接続失敗時の再試行時間 | 有効範囲:10~1,440 分。デフォルト:720 分。30 分より大きい値を設定してください。この期間内に接続が回復した場合、DTS はタスクを再開します。複数のタスクが同じソースまたはターゲットを共有する場合、最も短い再試行時間が適用されます。再試行中も DTS インスタンスの料金は発生し続けます。 |
| その他の問題に対する再試行時間 | 有効範囲:1~1,440 分。デフォルト:10 分。10 分より大きい値を設定してください。接続失敗時の再試行時間よりも短くする必要があります。 |
自己管理 MongoDB の制約
ソースデータベースが自己管理 MongoDB インスタンスの場合、以下に注意してください:
| 制約 | 詳細 |
|---|---|
| プライマリ/セカンダリ スイッチオーバー | タスク実行中にソースでプライマリ/セカンダリ スイッチオーバーが発生した場合、タスクは失敗します。 |
| 同期レイテンシーの精度 | DTS は、ターゲットの最新同期データのタイムスタンプとソースの現在のタイムスタンプに基づいてレイテンシーを計算します。ソースで長期間更新がない場合、報告されるレイテンシーは不正確になる可能性があります。レイテンシーの読み取りをリセットするには、ソースで更新を実行してください。データベース全体を同期オブジェクトとして選択した場合、1 秒ごとに更新されるハートビートテーブルを作成できます。 |
データ同期タスクの設定
ステップ 1:データ同期タスクページへの移動
Data Management (DMS) コンソールにログインします。
上部のナビゲーションバーで、[Data + AI] をクリックします。
左側のナビゲーションウィンドウで、[DTS (DTS)] > [データ同期] を選択します。
手順は DMS コンソールモードによって異なる場合があります。「シンプルモード」および「DMS コンソールのレイアウトとスタイルをカスタマイズする」をご参照ください。新しい DTS コンソールのデータ同期タスクページに直接アクセスすることもできます。
ステップ 2:リージョンの選択
データ同期タスクの右側で、同期インスタンスが存在するリージョンを選択します。
新しい DTS コンソールでは、上部のナビゲーションバーからリージョンを選択します。
ステップ 3:ソースデータベースとターゲットデータベースの設定
[タスクの作成] をクリックします。タスクの作成ページで、以下の表で説明されているパラメーターを設定します。
ソースデータベースとターゲットデータベースを設定した後、次に進む前にページに表示される制限事項をお読みください。このステップをスキップすると、タスクの失敗やデータの不整合が発生する可能性があります。
ソースデータベース
| パラメーター | 説明 |
|---|---|
| タスク名 | DTS タスクの名前。DTS はデフォルトの名前を生成します。タスクを識別しやすくするために、わかりやすい名前を指定してください。名前は一意である必要はありません。 |
| DMS データベースインスタンスの選択 | 既存のデータベースインスタンスを選択してパラメーターを自動入力するか、空白のままにして以下のパラメーターを手動で設定します。 |
| データベースタイプ | [MongoDB] を選択します。 |
| アクセス方法 | [Alibaba Cloud インスタンス] を選択します。 |
| インスタンスリージョン | ソースインスタンスが存在するリージョン。 |
| Alibaba Cloud アカウント間でのデータレプリケーション | 同一アカウントでの同期の場合は [いいえ] を選択します。 |
| アーキテクチャ | [レプリカセット] を選択します。 |
| インスタンス ID | ソースの ApsaraDB for MongoDB インスタンスの ID。 |
| 認証データベース | アカウントの認証情報を保存するデータベース。デフォルト:admin。 |
| データベースアカウント | ソースデータベース、config データベース、admin データベース、および local データベースへの読み取りアクセス権を持つアカウント。 |
| データベースパスワード | データベースアカウントのパスワード。 |
| 暗号化 | [非暗号化] または [SSL 暗号化] を選択します。このパラメーターはレプリカセットインスタンスにのみ適用されます。自己管理レプリカセットで [SSL 暗号化] を選択した場合、CA 証明書をアップロードして接続を検証できます。 |
ターゲットデータベース
| パラメーター | 説明 |
|---|---|
| DMS データベースインスタンスの選択 | 既存のデータベースインスタンスを選択してパラメーターを自動入力するか、空白のままにして以下のパラメーターを手動で設定します。 |
| データベースタイプ | [MongoDB] を選択します。 |
| アクセス方法 | [Alibaba Cloud インスタンス] を選択します。 |
| インスタンスリージョン | ターゲットインスタンスが存在するリージョン。 |
| アーキテクチャ | ターゲットインスタンスのアーキテクチャ (レプリカセットまたはシャードクラスター)。 |
| インスタンス ID | ターゲットの ApsaraDB for MongoDB インスタンスの ID。 |
| 認証データベース | アカウントの認証情報を保存するデータベース。デフォルト:admin。 |
| データベースアカウント | dbAdminAnyDatabase 権限、ターゲットデータベースへの読み書きアクセス権、および local データベースへの読み取りアクセス権を持つアカウント。 |
| データベースパスワード | データベースアカウントのパスワード。 |
| 暗号化 | [非暗号化] または [SSL 暗号化] を選択します。このパラメーターはレプリカセットインスタンスにのみ適用されます。自己管理レプリカセットで [SSL 暗号化] を選択した場合、CA 証明書をアップロードして接続を検証できます。 |
ステップ 4:接続性テスト
[接続性をテストして続行] をクリックします。
DTS は、自動的にそのサーバーの CIDR ブロックを Alibaba Cloud データベースインスタンスのホワイトリスト、または ECS でホストされるデータベースのセキュリティグループルールに追加します。オンプレミスデータセンター内またはサードパーティプロバイダーがホストする自己管理データベースの場合、DTS サーバーの CIDR ブロックをデータベースのホワイトリストに手動で追加します。詳細については、「DTS サーバーの CIDR ブロックを追加する」をご参照ください。
DTS の CIDR ブロックをホワイトリストやセキュリティグループルールに追加すると、セキュリティリスクが生じます。続行する前に、強力な認証情報の使用、公開ポートの制限、API 呼び出しの認証、ホワイトリストルールの定期的な見直し、不正な CIDR ブロックの削除などの予防措置を講じてください。より高いセキュリティを確保するためには、パブリック IP アクセスを使用する代わりに、Express Connect、VPN Gateway、または SAG を介して接続してください。
ステップ 5:オブジェクトの選択と設定
以下のパラメーターを設定します:
| パラメーター | 説明 |
|---|---|
| 同期タイプ | [スキーマ同期]、[完全データ同期]、および [増分データ同期] を選択します。増分データ同期はデフォルトで選択されています。スキーマ同期と完全同期が最初に実行され、完全同期が完了した後に増分同期が開始されます。詳細については、「同期タイプ」をご参照ください。 |
| 競合するテーブルの処理モード | 事前チェックしてエラーを報告同期対象オブジェクトの名前変更:開始前にソースとターゲットで同じ名前のコレクションがあるかチェックします。競合が存在する場合、タスクは開始されません。名前の競合を解決するには、オブジェクト名マッピング機能を使用します。詳細については、「」をご参照ください。エラーを無視して続行:競合チェックをスキップします。ターゲットのレコードがソースのレコードと同じプライマリキーまたは一意キーの値を持つ場合、ターゲットのレコードが保持され、ソースのレコードはスキップされます。これにより、データの不整合が発生する可能性があります。 |
| 同期トポロジ | [一方向同期] を選択します。 |
| ターゲットインスタンスでのオブジェクト名の大文字/小文字 | 送信先におけるデータベースおよびコレクション名の大文字小文字を制御します。デフォルト値: DTS デフォルトポリシー。詳細については、「オブジェクト名の大文字小文字の指定」をご参照ください。 |
| ソースオブジェクト | 同期するデータベースまたはコレクションを選択し、 |
| 選択済みオブジェクト | 単一のオブジェクトの名前を変更するには、そのオブジェクトを右クリックします。複数のオブジェクトを一度に名前変更するには、[一括編集] をクリックします。「オブジェクト名のマッピング」をご参照ください。WHERE 条件でデータをフィルターするには、オブジェクトを右クリックします。「フィルター条件の設定」をご参照ください。 |
ステップ 6:詳細設定の構成
[次へ:詳細設定] をクリックし、以下を設定します:
データ検証
詳細については、「データ検証を設定する」をご参照ください。
詳細設定
| パラメーター | 説明 |
|---|---|
| タスクスケジューリング用の専用クラスター | デフォルトでは、DTS は共有クラスターを使用します。安定性を高めるには、専用クラスターを購入してください。詳細については、「DTS 専用クラスターとは」をご参照ください。 |
| アラートの設定 | [いいえ]: アラートは発生しません。[はい]: アラートの設定。レイテンシーしきい値と通知連絡先を指定します。モニタリングとアラートの設定をご参照ください。 |
| 接続失敗時の再試行時間 | 接続失敗後に DTS が再試行する時間。範囲:10~1,440 分。デフォルト:720 分。30 分より大きい値を設定してください。この期間内に接続が回復した場合、DTS はタスクを再開します。複数のタスクが同じソースまたはターゲットを共有する場合、最も短い再試行時間が適用されます。再試行中も DTS インスタンスの料金は発生し続けます。 |
| その他の問題に対する再試行時間 | DDL または DML の失敗後に DTS が再試行する時間。範囲:1~1,440 分。デフォルト:10 分。10 分より大きい値を設定してください。接続失敗時の再試行時間よりも短くする必要があります。 |
| 完全データ移行のスロットリングを有効にする | 完全データ同期中のソースおよびターゲットへの読み書き負荷を制限します。[ソースデータベースへの 1 秒あたりのクエリ数 (QPS)]、[完全データ移行の RPS]、および [完全移行のデータ移行速度 (MB/s)] を設定します。[完全データ同期] が選択されている場合にのみ表示されます。 |
| 増分データ同期のスロットリングを有効にする | 増分同期中の負荷を制限します。[増分データ同期の RPS] と [増分同期のデータ同期速度 (MB/s)] を設定します。 |
| 環境タグ | DTS インスタンスを識別するためのタグ。オプション。 |
| ETL の設定 | はい: 抽出・変換・書き出し (ETL) を有効化し、データ処理文を入力します。詳しくは、「ETL の設定」をご参照ください。いいえ: ETL をスキップします。ETL の概要については、「ETL とは何か」をご参照ください。 |
ステップ 7:設定の保存と事前チェックの実行
[次へ:タスク設定を保存して事前チェック] をクリックします。
このタスクの OpenAPI パラメーターをプレビューするには、ボタンにカーソルを合わせ、クリックする前に [OpenAPI パラメーターのプレビュー] をクリックします。
DTS はタスク開始前に事前チェックを実行します。事前チェックが失敗した場合:
失敗した各項目の横にある [詳細の表示] をクリックし、問題を解決してから [再度事前チェック] をクリックします。
安全に無視できるアラート項目については、[アラート詳細の確認] > [無視] > [OK] をクリックし、その後 [再度事前チェック] をクリックします。アラートを無視すると、データの不整合が発生する可能性があります。
ステップ 8:事前チェックの完了を待つ
成功率が 100% に達するまで待ち、[次へ:インスタンスの購入] をクリックします。
ステップ 9:同期インスタンスの購入
以下のパラメーターを設定します:
| パラメーター | 説明 |
|---|---|
| 課金方法 | サブスクリプション:固定期間分を前払いします。長期利用の場合、よりコスト効率が良いです。従量課金:時間単位で課金されます。短期利用の場合、より柔軟です。不要になったらインスタンスをリリースして課金を停止します。 |
| リソースグループ設定 | インスタンスのリソースグループ。デフォルト:[デフォルトリソースグループ]。詳細については、「Resource Management とは」をご参照ください。 |
| インスタンスクラス | 同期速度はインスタンスクラスによって異なります。データ量とレイテンシ要件に基づいて選択してください。詳細については、「データ同期インスタンスのインスタンスクラス」をご参照ください。 |
| サブスクリプション期間 | サブスクリプション課金方法でのみ利用可能です。オプション:1~9 か月、1 年、2 年、3 年、または 5 年。 |
ステップ 10:タスクの開始
[Data Transmission Service (従量課金) サービス規約] を読み、選択します。
[購入して開始] をクリックします。
確認ダイアログで、[OK] をクリックします。
タスクがタスクリストに表示されます。そこから進捗を監視します。
次のステップ
よくある質問
データベースにデータを書き込んでいないのに、タスクのレイテンシーやデータの不整合が発生するのはなぜですか?
原因:MongoDB コレクションの TTL インデックスの自動削除メカニズムと DTS のデータ同期メカニズムの間の競合が、同期または移行タスクでレイテンシーとデータの不整合を引き起こす可能性があります。
増分書き込み中の DELETE 操作の欠落による効率低下:ソースインスタンスの TTL インデックスが期限切れのデータを削除すると、Oplog に DELETE レコードが生成されます。DTS はこの DELETE 操作を同期します。ターゲットインスタンスの TTL インデックスがすでに同じデータを削除している場合、DTS からの DELETE 操作は削除対象のデータを見つけられません。MongoDB エンジンは予期しない数の影響行を返し、これにより例外処理プロセスがトリガーされ、移行効率が低下します。
期限切れデータの非同期削除によるデータの不整合:TTL インデックスはデータをリアルタイムで削除しません。期限切れのデータがターゲットインスタンスで既に削除されているにもかかわらず、ソースインスタンスにはまだ存在する可能性があります。これにより、データの不整合が発生します。
例:
MongoDB の Oplog または ChangeStream は、UPDATE 操作に対して更新されたフィールドのみを記録します。更新前後の完全なドキュメントは記録しません。したがって、UPDATE 操作がターゲットで対象データを見つけられない場合、DTS はその操作を無視します。
タイミング
ソースインスタンス
ターゲットインスタンス
1
サービスがデータを挿入
2
DTS は INSERT 操作を同期します。
3
データは期限切れだが、TTL インデックスによってまだ削除されていない
4
サービスがデータを更新 (例:TTL インデックスフィールドを更新して有効期限を変更)
5
TTL インデックスがデータを削除
6
DTS が UPDATE を同期するが、データが見つからないため操作は無視される
結果として、このドキュメントはターゲットの MongoDB インスタンスから欠落します。
解決策:効率と一貫性を確保するために、同期または移行中にターゲットの TTL インデックスの有効期限を一時的に変更する必要があります。詳細については、「MongoDB がソースの場合に TTL インデックスを持つコレクションを同期/移行するためのベストプラクティス」をご参照ください。