Data Transmission Service (DTS) を使用すると、ある ApsaraDB RDS for PostgreSQL インスタンスから別のインスタンスへリアルタイムでデータを同期できます。このワークフローは、ディザスタリカバリ用のスタンバイインスタンス、読み書き分離用の読み取り専用レプリカ、クロスアカウントのデータベース移行、または本番環境と同期を保つ独立した分析インスタンスが必要な場合に使用します。
DTS は、スキーマ同期、完全データ同期、増分データ同期の 3 つの同期フェーズと、1 対 1、1 対多、カスケード、多対 1 の 4 つの一方向トポロジをサポートしています。
前提条件
開始する前に、以下を確認してください。
-
ソースと送信先の ApsaraDB RDS for PostgreSQL インスタンスの作成については、「ApsaraDB RDS for PostgreSQL インスタンスを作成する」をご参照ください。
-
宛先インスタンスのバージョンがソースインスタンスのバージョンと同じか、それ以降であること。宛先インスタンスのバージョンが古いと、互換性の問題が発生する可能性があります。
-
宛先インスタンスに十分な空きストレージ容量があること。ソースインスタンスの総データサイズを超える必要があります。
-
ソースインスタンスの
wal_levelパラメーターがlogicalに設定されていること。 -
WAL ログの保持期間が次のように設定されていること:
-
増分データ同期のみ:WAL ログを 24 時間以上保持する。
-
完全データ同期 + 増分データ同期:WAL ログを少なくとも 7 日間保持する。完全データ同期が完了した後、保持期間を 24 時間以上に短縮できます。
-
WAL ログの保持期間が不十分な場合、DTS がログを読み取れず、タスクが失敗し、データの不整合や損失につながる可能性があります。上記の要件に基づいて WAL ログの保持期間を設定してください。そうしない場合、DTS のサービスレベルアグリーメント (SLA) で保証されているサービスの信頼性やパフォーマンスが保証されないことがあります。
サポートされているソースと送信先のバージョンの組み合わせについては、「データ同期シナリオの概要」をご参照ください。
課金
| 同期タイプ | 料金 |
|---|---|
| スキーマ同期と完全データ同期 | 無料 |
| 増分データ同期 | 有料です。「課金概要」をご参照ください。 |
制限事項
開始する前に、これらの制限事項を確認してください。
ソースデータベースの要件
-
テーブルには PRIMARY KEY または UNIQUE 制約が必要で、すべてのフィールドが一意である必要があります。これらの制約がない場合、ターゲットデータベースに重複レコードが含まれる可能性があります。
[スキーマ同期] を選択せずに同期タスクを作成する場合、宛先テーブルはソーステーブルと同じ PRIMARY KEY または NOT NULL UNIQUE 制約を持つ必要があります。そうしないと、重複レコードが発生する可能性があります。
-
同期オブジェクトとしてテーブルを選択し、宛先でテーブル名や列名を変更する場合、1 つのタスクでサポートされるテーブルの最大数は 5,000 です。5,000 を超えるテーブルの場合は、複数のタスクにワークロードを分割するか、テーブルレベルではなくデータベースレベルで同期してください。
-
DTS は、一時テーブル、内部トリガー、または C 言語で書かれた特定の内部プロシージャや関数を同期できません。DTS は、COMPOSITE、ENUM、RANGE 型のカスタムパラメーターを同期できます。テーブルには PRIMARY KEY、FOREIGN KEY、UNIQUE、または CHECK 制約が必要です。
-
DTS は、ソースデータベース上に
dts_sync_というプレフィックスを持つレプリケーションスロットを作成し、過去 15 分間の増分ログにアクセスできるようにします。レプリケーションスロットが蓄積されると、ディスク領域を使い果たす可能性があります。論理レプリケーションがアクティブな場合は、ソースインスタンスにディスク使用率のアラームを設定してください。レプリケーションスロットのクリーンアップ動作:
-
DTS インスタンスがリリースされた後、スロットは自動的に削除されます。ただし、ソースデータベースのパスワードを変更した場合や、IP ホワイトリストから DTS の IP アドレスを削除した場合は、手動でスロットを削除する必要があります。
-
ソースでプライマリ/セカンダリのスイッチオーバーが発生した場合、セカンダリデータベースにログインして手動でスロットを削除してください。
-
-
DTS は、DDL 文、増分テーブルスキーマ、およびハートビート情報をキャプチャするために、ソースデータベースに以下の一次テーブルを作成します。同期が実行中はこれらを削除しないでください。DTS インスタンスがリリースされると自動的に削除されます:
public.dts_pg_class、public.dts_pg_attribute、public.dts_pg_type、public.dts_pg_enum、public.dts_postgres_heartbeat、public.dts_ddl_command、public.dts_args_session -
DTS は、同期遅延を正確に追跡するために、
dts_postgres_heartbeatという名前のハートビートテーブルをソースデータベースに追加します。 -
ソース ApsaraDB RDS for PostgreSQL インスタンスで同期を中断せずにプライマリ/セカンダリ スイッチオーバーを実行するには、まず Logical Replication Slot Failover 機能を有効にしてください。詳細については、「Logical Replication Slot Failover」をご参照ください。
-
単一の増分データ変更が 256 MB を超えると、実行中の同期インスタンスは失敗し、回復できません。タスクを再設定する必要があります。
-
スキーマ同期および完全データ同期中は、データベースまたはテーブルスキーマを変更する DDL 文を実行しないでください。実行するとタスクは失敗します。
-
増分データ同期中にソースデータベースで長時間実行トランザクションがあると、それらのトランザクションがコミットされる前に生成された WAL ログが蓄積され、ディスク領域を使い果たす可能性があります。
-
同期インスタンスの実行中にソースデータベースでメジャーバージョンアップが実行されると、インスタンスは失敗し、回復できません。タスクを再設定する必要があります。
その他の要件
-
1 つのタスクは 1 つのデータベースからのみデータを同期します。複数のデータベースを同期するには、それぞれに個別のタスクを作成してください。
-
DTS は、スキーマ間で継承関係を持つテーブルを同期できません。
-
同期オブジェクトとしてスキーマを選択した場合、そのスキーマ内の新規または名前変更されたテーブルにデータを書き込む前に、次のステートメントを実行してください:
ALTER TABLE schema.table REPLICA IDENTITY FULL;schemaとtableを実際の名前で置き換えてください。このステートメントはオフピーク時に実行し、テーブルをロックしないようにしてください。このステートメントの実行中にテーブルをロックすると、デッドロックが発生する可能性があります。 -
DTS はシーケンスなどのメタデータを検証しません。シーケンスの有効性は手動で確認してください。
-
ワークロードをターゲットデータベースに切り替える前に、宛先のシーケンスの開始値を更新してください。切り替え後、新しく書き込まれたシーケンスはソースの最大値から継続しません。
-
宛先アカウントが特権アカウントまたはスーパーユーザーアカウントで、同期対象のテーブルに外部キー、トリガー、またはイベントトリガーが含まれている場合、DTS はセッションレベルで
session_replication_roleを一時的にreplicaに設定します。宛先アカウントに必要な権限がない場合は、このパラメーターを手動でreplicaに設定してください。この間にソースでカスケード UPDATE または DELETE 操作を行うと、データの不整合が発生する可能性があります。タスクがリリースされた後、パラメーターをoriginに戻してください。 -
同期中に他のソースからターゲットデータベースにデータを書き込むと、データの不整合が発生します。たとえば、他のソースがターゲットデータベースに書き込んでいる間に DMS からオンライン DDL 文を実行すると、データ損失が発生する可能性があります。
-
タスクが失敗した場合、DTS のテクニカルサポートは 8 時間以内に復旧を試みます。復旧中、タスクが再起動されたり、タスクパラメーター (データベースパラメーターではない) が変更されたりすることがあります。
特定のソースデータベースタイプに関する要件
ApsaraDB RDS for PostgreSQL ソース
同期の実行中にソースインスタンスのエンドポイントやゾーンを変更しないでください。変更するとタスクが失敗します。
自己管理型 PostgreSQL ソース
max_wal_senders と max_replication_slots の値は、それぞれ現在使用中のレプリケーションスロットの数と、このデータベース用に作成する予定の DTS インスタンスの数の合計よりも大きい必要があります。
Cloud SQL for PostgreSQL (Google Cloud) ソース
[データベースアカウント] を cloudsqlsuperuser 権限を持つアカウントに設定してください。同期するオブジェクトを選択する際は、そのアカウントが管理を許可されているオブジェクトのみを選択するか、それらのオブジェクトに対する OWNER 権限をそのアカウントに付与してください。
cloudsqlsuperuser 権限を持つアカウントは、同じ権限を持つ他のアカウントが所有するデータを管理できません。
サポートされているオブジェクト
| オブジェクトタイプ | 詳細 |
|---|---|
| SCHEMA と TABLE | PRIMARY KEY、UNIQUE KEY、FOREIGN KEY、組み込みデータ型、および DEFAULT 制約を含みます |
| VIEW、PROCEDURE、FUNCTION、RULE、SEQUENCE、EXTENSION、TRIGGER、AGGREGATE、INDEX、OPERATOR、DOMAIN | PROCEDURE には PostgreSQL V11 以降が必要です |
同期可能な SQL 操作
| タイプ | ステートメント |
|---|---|
| DML | INSERT、UPDATE、DELETE |
| DDL | 下記をご参照ください |
DDL 同期は、2020 年 10 月 1 日以降に作成されたタスクでのみ利用可能です。
2023年5月12日より前に作成されたタスクの場合、タスクを設定する前に、DDL 情報を取得するためのトリガーと関数をソースデータベースに作成する必要があります。詳細については、「トリガーと関数を使用して PostgreSQL データベースの増分 DDL 移行を実装する」をご参照ください。
DDL 同期を行うには、ソースインスタンスに、マイナーエンジンバージョンが 20210228 以降の特権データベースアカウントが必要です。詳細については、「マイナーエンジンバージョンを更新する」をご参照ください。
サポートされている DDL 文:
-
CREATE TABLE および DROP TABLE
-
ALTER TABLE: RENAME TABLE、ADD COLUMN、ADD COLUMN DEFAULT、ALTER COLUMN TYPE、DROP COLUMN、ADD CONSTRAINT、ADD CONSTRAINT CHECK、ALTER COLUMN DROP DEFAULT
-
TRUNCATE TABLE (ソースが自己管理型 PostgreSQL バージョン 11 以降の場合のみ)
-
CREATE INDEX ON TABLE
DDL の制限事項:
-
2023年5月12日より前に作成されたデータ同期タスクを使用して DDL 操作を同期するには、データ同期タスクを設定する前に、ソースデータベースにトリガーと関数を作成して DDL 情報をキャプチャする必要があります。 詳細については、「トリガーと関数を使用して PostgreSQL データベースの増分 DDL 移行を実装する」をご参照ください。
-
BIT 型のデータは増分データ同期中に同期できません。
-
CASCADE や RESTRICT などの追加の DDL 句は同期されません。
-
SET session_replication_role = replicaを実行するセッションからの DDL 文は同期されません。 -
関数を呼び出して実行される DDL 文は同期されません。
-
トランザクションに DML 文と DDL 文の両方が含まれている場合、DDL 文は同期されません。
-
同期範囲外のオブジェクトに対する DDL 文は同期されません。
同期タスクの作成
ステップ 1:データ同期ページを開く
DTS コンソールまたは DMS コンソールのいずれかを使用します。
DTS コンソール
DMS コンソール
ステップ 2:タスクの作成
-
[タスクの作成] をクリックします。
-
ページの右上隅に [新しい設定ページ] ボタンが表示されている場合は、それをクリックします。
代わりに [前のバージョンに戻る] が表示されている場合は、このステップをスキップしてください。新しい設定ページと以前の設定ページは若干異なる場合があります。新しいバージョンを使用してください。
ステップ 3:ソースデータベースとターゲットデータベースの設定
両方のデータベースを設定した後、ページに表示される [制限事項] をお読みください。これをスキップすると、タスクが失敗したり、データの不整合が発生したりする可能性があります。
|
セクション |
パラメーター |
説明 |
|
N/A |
タスク名 |
DTS は自動的にタスク名を生成します。識別しやすいように、わかりやすい名前を指定することを推奨します。名前は一意である必要はありません。 |
|
移行元データベース |
データベースタイプ |
ソースデータベースのタイプです。[PostgreSQL] を選択します。 |
|
アクセス方法 |
ソースデータベースのアクセス方法です。[Alibaba Cloud インスタンス] を選択します。 |
|
|
インスタンスリージョン |
ソースの ApsaraDB RDS for PostgreSQL インスタンスが存在するリージョンです。 |
|
|
Alibaba Cloud アカウント間でデータを複製 |
この例では、現在の Alibaba Cloud アカウントに属するデータベースインスタンスを使用します。× を選択します。 |
|
|
[インスタンス ID] |
ソースの ApsaraDB RDS for PostgreSQL インスタンスの ID です。 |
|
|
データベース名 |
ソースの ApsaraDB RDS for PostgreSQL インスタンスでオブジェクトが同期されるデータベースの名前です。 |
|
|
データベースアカウント |
ソースの ApsaraDB RDS for PostgreSQL インスタンスのデータベースアカウントです。データベースのオーナーである特権アカウントを指定してください。ApsaraDB RDS for PostgreSQL インスタンスのアカウントを作成し、アカウントに権限を付与する方法については、「アカウントの作成」および「データベースの作成」をご参照ください。 説明
ソースインスタンスが ApsaraDB RDS for PostgreSQL V9.4 インスタンスで、DML 操作のみを同期する場合、データベースアカウントには REPLICATION 権限のみが必要です。 |
|
|
データベースパスワード |
データベースアカウントに対応するパスワードを入力します。 |
|
|
暗号化 |
ソースデータベースへの接続を暗号化するかどうかを指定します。ビジネス要件に基づいてこのパラメーターを設定できます。この例では、非暗号化 が選択されています。 ソースデータベースへの SSL 暗号化接続を確立したい場合は、次の手順を実行します:SSL 暗号化 を選択し、必要に応じて CA 証明書、クライアント証明書、および クライアント証明書の秘密鍵 をアップロードし、次に クライアント証明書の秘密鍵のパスワード を指定します。 説明
|
|
|
移行先データベース |
データベースタイプ |
ターゲットデータベースのタイプです。[PostgreSQL] を選択します。 |
|
アクセス方法 |
ターゲットデータベースのアクセス方法です。[Alibaba Cloud インスタンス] を選択します。 |
|
|
インスタンスリージョン |
宛先の ApsaraDB RDS for PostgreSQL インスタンスが存在するリージョンです。 |
|
|
インスタンス ID |
宛先の ApsaraDB RDS for PostgreSQL インスタンスの ID です。 |
|
|
データベース名 |
宛先の ApsaraDB RDS for PostgreSQL インスタンスでオブジェクトが同期されるデータベースの名前です。 |
|
|
データベースアカウント |
宛先の ApsaraDB RDS for PostgreSQL インスタンスのデータベースアカウントです。アカウントはスキーマに対するオーナー権限を持つ必要があります。ApsaraDB RDS for PostgreSQL インスタンスのアカウントを作成する方法については、「アカウントの作成」をご参照ください。 |
|
|
データベースパスワード |
データベースアカウントに対応するパスワードを入力します。 |
|
|
暗号化 |
ソースデータベースへの接続を暗号化するかどうかを指定します。ビジネス要件に基づいてこのパラメーターを設定できます。この例では、非暗号化 が選択されています。 ソースデータベースへの SSL 暗号化接続を確立したい場合は、次の手順を実行します:SSL 暗号化 を選択し、必要に応じて CA 証明書、クライアント証明書、および クライアント証明書の秘密鍵 をアップロードし、次に クライアント証明書の秘密鍵のパスワード を指定します。 説明
|
ステップ 4:接続テスト
ページ下部の [接続テストと次へ] をクリックします。
DTS サーバーの CIDR ブロックを両方のデータベースのセキュリティ設定に追加する必要があります。「DTS サーバーの CIDR ブロックを追加する」をご参照ください。いずれかのデータベースが自己管理型で、アクセス方法として [Alibaba Cloud インスタンス] が設定されていない場合は、[DTS サーバーの CIDR ブロック] ダイアログで [接続テスト] をクリックします。
ステップ 5:同期オブジェクトの設定
[オブジェクトの設定] ステップで、次のパラメーターを設定します:
| パラメーター | 説明 |
|---|---|
| [同期タイプ] | [増分データ同期] がデフォルトで選択されています。増分同期のベースラインとして既存データを同期するために、[スキーマ同期] と [完全データ同期] も選択します。[スキーマ同期] を選択すると、DTS は外部キーを含むテーブルスキーマを同期します。 |
| 同期トポロジ | [一方向同期] を選択します。 |
| [競合するテーブルの処理モード] | 事前チェックとエラー報告 (デフォルト): ソースと送信先に同じ名前のテーブルが存在する場合、事前チェックは失敗します。必要に応じて オブジェクト名マッピング を使用して、送信先で競合するテーブルの名前を変更します。エラーを無視して続行: 名前の競合チェックをスキップします。フル同期中、プライマリキーまたは一意キーの値が一致する送信先の既存のレコードは保持されます。増分同期中、それらは上書きされます。スキーマが異なる場合、初期化が部分的に失敗する可能性があります。注意してご使用ください。 |
| 移行先インスタンスでのオブジェクト名の大文字/小文字 | 送信先でのデータベース名、テーブル名、およびカラム名の大文字と小文字の区別を制御します。デフォルトは [DTS デフォルトポリシー] です。詳細については、「オブジェクト名の大文字と小文字の区別の指定」をご参照ください。 |
| ソースオブジェクト | 列、テーブル、またはスキーマを選択し、矢印アイコンをクリックして [選択済みオブジェクト] に移動します。 |
| [選択済みオブジェクト] | オブジェクトを右クリックすると、名前の変更 (「単一オブジェクトの名前をマップする」をご参照ください)、SQL 操作によるフィルター、または WHERE 条件の追加 (「フィルター条件を設定する」をご参照ください) ができます。 複数のオブジェクトを一度に名前変更するには、[一括編集] をクリックします。 オブジェクトの名前を変更すると、依存オブジェクトの同期が中断される場合があることに注意してください。 |
ステップ 6:詳細設定
[次へ:詳細設定] をクリックし、以下を設定します:
| パラメーター | 説明 |
|---|---|
| [タスクスケジューリング用の専用クラスター] | デフォルトでは、DTS は共有クラスターを使用します。タスクの安定性を高めるには、専用クラスターを購入してください。詳細については、「DTS 専用クラスターとは」をご参照ください。 |
| [接続失敗時の再試行時間] | 接続失敗後に DTS が再試行する時間です。有効範囲:10~1440 分。デフォルト:720 分。少なくとも 30 分に設定してください。この時間内に DTS が再接続するとタスクは再開されますが、そうでない場合はタスクは失敗します。複数のタスクが同じソースまたは宛先を共有する場合、最も短い再試行時間が適用されます。再試行中も DTS インスタンスの料金は発生し続けます。 |
| [その他の問題に対する再試行時間] | DDL または DML の失敗後に DTS が再試行する時間です。有効範囲:1~1440 分。デフォルト:10 分。少なくとも 10 分に設定してください。この値は [接続失敗時の再試行時間] よりも小さくする必要があります。 |
| [完全データ移行のレート制限を有効化] | 完全同期中の負荷を軽減するために、ソースデータベースへの QPS、完全データ移行の RPS、または移行速度 (MB/s) を制限します。[完全データ同期] が選択されている場合にのみ表示されます。 |
| [増分データ同期のレート制限を有効化] | 増分同期の RPS または同期速度 (MB/s) を制限して、宛先の負荷を軽減します。 |
| 環境タグ | DTS インスタンスを識別するためのオプションのタグです。 |
| ETL を設定 | 転送中のデータを変換するには、抽出・変換・書き出し (ETL) 機能を有効にします。データ処理文を入力するには、[はい]アラート通知設定を選択します。詳細については、「データ移行またはデータ同期タスクで ETL を設定する」をご参照ください。 |
| 監視とアラート | タスクが失敗した場合、またはレイテンシーがしきい値を超えた場合にアラートを設定します。[はい] を選択して、アラートのしきい値と通知連絡先を設定します。詳細については、「DTS タスクの作成時にモニタリングとアラートを設定する」をご参照ください。 |
ステップ 7:データ検証の設定 (オプション)
[次のステップ: データ検証] をクリックして検証を設定します。詳細については、「データ検証タスクを設定する」をご参照ください。
ステップ 8:事前チェックの実行
[次へ:タスク設定を保存して事前チェック] をクリックします。
このタスク設定の API パラメーターをプレビューするには、ボタンにカーソルを合わせ、[OpenAPI パラメーターのプレビュー] をクリックしてから進んでください。
DTS はタスクを開始する前に事前チェックを実行します。事前チェックが失敗した場合:
-
失敗した各項目の横にある [詳細の表示] をクリックし、問題を解決してから [再事前チェック] をクリックします。
-
無視できるアラートが表示された項目がある場合は、[アラート詳細の確認] > [無視] > [OK] をクリックし、[再事前チェック] をクリックします。アラートを無視すると、データの不整合につながる可能性があります。
ステップ 9:インスタンスの購入と開始
-
[成功率] が [100%] に達するまで待ち、[次へ:インスタンスの購入] をクリックします。
-
購入ページで、以下を設定します:
セクション
パラメーター
説明
[新しいインスタンスクラス]
課金方法
-
サブスクリプション:データ同期インスタンスを作成する際にサブスクリプション料金を支払います。サブスクリプション課金方法は、長期利用の場合、従量課金方法よりも費用対効果が高くなります。
-
従量課金:従量課金インスタンスは時間単位で課金されます。従量課金方法は短期利用に適しています。従量課金のデータ同期インスタンスが不要になった場合は、インスタンスをリリースしてコストを削減できます。
リソースグループ設定
データ同期インスタンスが属するリソースグループで、デフォルト値は デフォルトリソースグループ です。 詳細については、「Resource Management とは」をご参照ください。
インスタンスクラス
DTS では、同期速度の異なるインスタンスクラスが提供されています。ビジネス要件に基づいてインスタンスクラスを選択できます。詳細については、「データ同期インスタンスのインスタンスクラス」をご参照ください。
サブスクリプション期間
サブスクリプション課金方法を選択した場合、サブスクリプション期間と作成したいデータ同期インスタンスの数を指定します。サブスクリプション期間は 1~9 ヶ月、1 年、2 年、3 年、または 5 年です。
注このパラメーターは、[サブスクリプション] 課金方法を選択した場合にのみ利用可能です。
-
-
[Data Transmission Service (従量課金) 利用規約] を読み、同意します。
-
[購入して開始] をクリックし、ダイアログで [OK] をクリックします。
タスクリストでタスクの進捗状況を確認します。
タスク開始後の操作
タスクが開始された後、タスクリストで同期遅延を監視します。ワークロードを宛先に切り替える前に:
-
ターゲットデータベースのシーケンスの開始値を更新してください。切り替え後、新しいシーケンス値はソースの最大値から継続しません。
-
DTS のみを使用してターゲットデータベースにテーブルデータを書き込む場合、同期中にソーステーブルをロックすることなく、DMS を使用してオンライン DDL 操作を実行できます。 詳細については、「テーブルをロックせずにスキーマを変更する」をご参照ください。
サポートされている同期トポロジについては、「同期トポロジ」をご参照ください。