Data Transmission Service (DTS) を使用して、ApsaraDB for MongoDB レプリカセットから ApsaraDB RDS for MySQL インスタンスへデータを継続的に同期します。DTS は bson_value() 式を用いて MongoDB のドキュメント構造をリレーショナルテーブルにフラット化するため、各 MongoDB フィールドが MySQL の列にマッピングされます。
開始前の準備
MongoDB と MySQL では、根本的に異なるデータモデルが採用されています。開始前に、DTS がこのギャップをどのように埋めるかを理解してください。
MongoDB の ドキュメント は、MySQL の 行 と等価です。
MongoDB の コレクション は、MySQL の テーブル と等価です。
MongoDB のフィールドはネスト(階層的)ですが、MySQL の列はフラットです。DTS は
bson_value()式を用いて、ネストされたフィールドを個別の列にマッピングします。
前提条件
開始前に、以下の点を確認してください。
宛先の ApsaraDB RDS for MySQL インスタンスが作成済みであり、ソースデータベース内の全データサイズより十分な空きストレージ容量があること。詳細については、「ApsaraDB RDS for MySQL インスタンスの作成」をご参照ください。推奨される空きストレージ容量は、ソースデータベース内の全データサイズより少なくとも 10 % 大きい値です。
宛先インスタンスに、一意で複合でないプライマリキー列 を持つデータベースおよびテーブルが存在すること。「データベースの管理」をご参照ください。
宛先テーブルの列型が、同期対象となる MongoDB のデータ型と互換性があること。たとえば、MongoDB の
_idフィールドがObjectId型の場合、対応する MySQL 列はvarchar型である必要があります。宛先テーブルに、_id または _value という名前の列がないこと。
ソースが シャードクラスター の場合、すべてのシャードノードのエンドポイントが申請済みであること、およびすべてのシャードノードが同一のアカウントパスワードおよびエンドポイントを共有していること。「シャードのエンドポイント申請」をご参照ください。
必要な権限
DTS が各データベースに接続するために使用するデータベースアカウントに、以下の権限を付与してください。
| データベース | 必要な権限 | リファレンス |
|---|---|---|
| ソース ApsaraDB for MongoDB | ソースデータベース、admin データベース、および local データベースに対する読み取り権限 | アカウント管理 |
| 宛先 ApsaraDB RDS for MySQL | 宛先データベースに対する読み取りおよび書き込み権限 | アカウントを作成するおよびアカウントの権限を変更する |
制限事項
タスクの設定を行う前に、以下の制約事項を確認してください。
ソースデータベースの制約
ソースサーバーには十分なアウトバウンド帯域幅が必要です。帯域幅が低いと同期速度が低下します。
同期対象として選択できるのは コレクション のみです。データベースレベルでの同期はできません。
宛先でコレクション名を変更する場合、1 つのタスクで同期できるコレクション数は最大 1,000 個 です。それ以上のコレクションを同期する場合は、複数のタスクを作成してください。
DTS は、SRV エンドポイント経由で MongoDB に 接続できません。
以下のソースタイプは サポートされていません:スタンドアロンの ApsaraDB for MongoDB インスタンス、Azure Cosmos DB for MongoDB クラスター、Amazon DocumentDB エラスティッククラスター。
ソースデータベースには、oplog が有効化され、ログが最低 7 日間保持されるか、または過去 7 日間にわたって利用可能な チェンジストリーム が有効化されている必要があります。低レイテンシを実現するには、oplog(推奨)を使用してください。チェンジストリームを利用するには、MongoDB v4.0 以降が必要です。
シャードクラスターの制約
同期対象の各コレクションの
_idフィールドは一意である必要があります。Mongos ノードの数は 10 を超えてはいけません。
ソースには、孤立ドキュメントを含めてはいけません。詳しくは、「MongoDB ドキュメント」および「孤立ドキュメントの削除に関する FAQ」をご参照ください。
同期中に以下のコマンドを実行しないでください:
shardCollection、reshardCollection、unshardCollection、moveCollection、またはmovePrimary。バランサーがアクティブな場合、レイテンシが発生する可能性があります。
同期動作の制約
完全データ同期中は、データベースまたはコレクションのスキーマを変更したり、
ARRAY型のデータを変更したりしないでください。完全データ同期のみを実行する場合、タスク実行中はソースデータベースへの書き込みを行わないでください。
増分同期では、挿入、更新(
$setを介した更新)、および 削除 操作のみがサポートされます。トランザクションは保持されず、個別のレコードに変換されます。データに 4 バイト文字(絵文字など)が含まれる場合、宛先テーブルは
utf8mb4文字セットを使用する必要があります。DTS がスキーマ同期を処理する場合、宛先インスタンスのcharacter_set_serverパラメーターをutf8mb4に設定してください。DTS は、
admin、config、またはlocalデータベースからのデータ同期をサポートしていません。FLOATの精度はデフォルトで 38 桁、DOUBLEの精度はデフォルトで 308 桁です。DTS は値の取得にROUND(COLUMN,PRECISION)を適用します。デフォルトの精度が要件を満たすことを確認してください。完全データ同期中、同時実行の
INSERT操作により、宛先テーブルに断片化が発生し、ソースよりも高いストレージ使用量になる可能性があります。DTS は、過去 7 日以内に失敗したタスクを再開しようと試みます。ワークロードを宛先データベースに切り替える前に、失敗したタスクを停止またはリリースしてください。あるいは、
REVOKEステートメントを用いて、DTS の宛先データベースに対する書き込み権限を取り消すことで、再開時にソースデータが宛先データを上書きするのを防ぐことができます。増分同期のレイテンシは、宛先で最新に同期されたデータのタイムスタンプとソースの現在時刻との差に基づいて計算されます。長期間更新が行われていない場合、ソースで更新操作を実行してレイテンシの読み取りをリフレッシュしてください。
課金
| 同期タイプ | 料金 |
|---|---|
| 完全データ同期 | 無料 |
| 増分データ同期 | 課金されます。課金概要 |
データ同期タスクの作成
ステップ 1:データ同期ページを開く
DTS コンソールまたは Data Management Service (DMS) コンソールのいずれかを使用して、DTS タスクリストに移動します。
DTS コンソール
DTS コンソール にログインします。
左側ナビゲーションウィンドウで、データ同期 をクリックします。
左上隅で、同期タスクを実行するリージョンを選択します。
DMS コンソール
正確なナビゲーションパスは、DMS コンソールのモードとレイアウトによって異なります。詳細については、「簡易モード」および「DMS コンソールのレイアウトとスタイルのカスタマイズ」をご参照ください。
DMS コンソール にログインします。
上部ナビゲーションバーで、Data + AI の上にポインターを合わせ、DTS (DTS) > データ同期 を選択します。
データ同期タスク の右側にあるドロップダウンリストから、対象リージョンを選択します。
ステップ 2:ソースおよび宛先データベースの構成
タスクの作成 をクリックします。
(任意)右上隅に表示された場合、新規構成ページ をクリックします。以前のバージョンに戻る が既に表示されている場合は、このステップをスキップしてください。
以下のパラメーターを構成します。
| カテゴリ | パラメーター | 説明 |
|---|---|---|
| 該当なし | タスク名 | DTS が自動生成する名前です。識別しやすいように、説明的な名前を指定してください。タスク名は一意である必要はありません。 |
| ソースデータベース | 既存の接続を選択 | ドロップダウンリストから登録済みのインスタンスを選択するか、接続パラメーターを手動で構成してください。 |
| データベースタイプ | <MongoDB> を選択します。 | |
| アクセス方法 | <Alibaba Cloud インスタンス> を選択します。 | |
| インスタンスリージョン | ソース ApsaraDB for MongoDB インスタンスのリージョンです。 | |
| Alibaba Cloud アカウント間でのデータ複製 | 現在のアカウント内のインスタンスを使用する場合は、<いいえ> を選択します。 | |
| アーキテクチャ | <レプリカセット> を選択します。ソースが <シャードクラスター> の場合、<シャードアカウント> および <シャードパスワード> も指定してください。 | |
| 移行方法 | 低レイテンシを実現するには、推奨の <Oplog> を選択してください。oplog が利用できない場合は、<ChangeStream> を選択します。下記の注釈を参照して、制約事項を確認してください。 | |
| インスタンス ID | ソース ApsaraDB for MongoDB インスタンスの ID です。 | |
| 認証データベース | アカウント認証情報を格納する認証データベースです。デフォルトは admin です。 | |
| データベースアカウント | 必要な読み取り権限を持つアカウントです。 | |
| データベースパスワード | データベースアカウントのパスワードです。 | |
| 暗号化 | <非暗号化>、<SSL 暗号化>、または <Mongo Atlas SSL> を選択します。利用可能なオプションは、<アクセス方法> および <アーキテクチャ> の値によって異なります。DTS コンソールが適用可能なオプションを表示します。ソースデータベースが <レプリカセット> アーキテクチャを採用する自己管理 MongoDB データベースであり、<アクセス方法> が <Alibaba Cloud インスタンス> ではなく、<暗号化> が <SSL 暗号化> の場合、認証局 (CA) 証明書をアップロードして、ソースデータベースへの接続を検証できます。 | |
| 宛先データベース | 既存の接続を選択 | 登録済みのインスタンスを選択するか、接続パラメーターを手動で構成してください。 |
| データベースタイプ | <MySQL> を選択します。 | |
| アクセス方法 | <Alibaba Cloud インスタンス> を選択します。 | |
| インスタンスリージョン | 宛先 ApsaraDB RDS for MySQL インスタンスのリージョンです。 | |
| Alibaba Cloud アカウント間でのデータ複製 | 現在のアカウント内のインスタンスを使用する場合は、<いいえ> を選択します。 | |
| RDS インスタンス ID | 宛先 ApsaraDB RDS for MySQL インスタンスの ID です。 | |
| データベースアカウント | 必要な読み取りおよび書き込み権限を持つアカウントです。 | |
| データベースパスワード | データベースアカウントのパスワードです。 | |
| 暗号化 | [暗号化なし] または [SSL 暗号化] を選択します。SSL 暗号化を使用するには、まず送信先の RDS インスタンスで SSL を有効化する必要があります。詳細については、「クラウド証明書を使用して SSL 暗号化を有効化する」をご参照ください。 |
移行方法 の制約事項:
Oplog は、oplog が有効化されているすべての ApsaraDB for MongoDB インスタンスに対してデフォルトかつ推奨されるオプションです。ログの高速プルにより、同期レイテンシが低減されます。
ChangeStream を使用するには、MongoDB v4.0 以降が必要です。
ソースが非伸縮性の Amazon DocumentDB クラスターの場合、データベースの変更ストリームを有効にし、[移行方法] を ChangeStream に、[アーキテクチャ] を シャードクラスター に設定する必要があります。
「シャードクラスタ」を「アーキテクチャ」パラメーターで選択し、「移行方法」を ChangeStream に設定した場合、「シャードアカウント」および「シャードパスワード」のパラメーターを設定する必要はありません。
<アーキテクチャ> が <シャードクラスター> で、<移行方法> が <Oplog> の場合、<暗号化> のオプションとして <SSL 暗号化> は利用できません。
接続テストと続行 をクリックします。
DTS は、ソースデータベースおよびターゲットデータベースに到達できる必要があります。各データベースのセキュリティ設定に DTS サーバーの CIDR ブロックを追加します。詳細については、「DTS サーバーの CIDR ブロックを追加する」をご参照ください。自己管理データベースの場合は、[接続テスト] を [DTS サーバーの CIDR ブロック] ダイアログボックスでクリックします。
ステップ 3:オブジェクトの選択およびフィールドマッピングの構成
<オブジェクトの構成> ステップで、以下のオプションを設定します。
| 構成 | 説明 |
|---|---|
| 同期タイプ | 増分データ同期> がデフォルトで選択されています。増分同期を開始する前に既存データを同期するには、<完全データ同期> を選択します。<スキーマ同期> は利用できません。 |
| 競合するテーブルの処理モード | [事前チェックとエラー報告]: ソースと同じ名前のテーブルが送信先に存在する場合、事前チェックは失敗します。必要に応じて、オブジェクト名マッピングを使用してテーブル名を変更します。詳細については、「オブジェクト名マッピング」をご参照ください。[エラーを無視して続行]: 名前競合のチェックをスキップします。完全同期中は、送信先の競合するレコードは保持されます。増分同期中は、それらのレコードは上書きされます。注意して使用してください。 |
| 宛先インスタンスにおけるオブジェクト名の大文字小文字 | 宛先インスタンスでのデータベース名、テーブル名、および列名の大文字小文字を制御します。デフォルトは DTS デフォルトポリシー です。詳細については、「宛先インスタンスでのオブジェクト名の大文字小文字の指定」をご参照ください。 |
| ソースオブジェクト | [ソース オブジェクト] から 1 つ以上のコレクションを選択し、 |
<選択済みオブジェクト> で、MongoDB コレクションを MySQL テーブルにマッピングします。a. 宛先データベース名の変更: b. 宛先テーブル名の変更: c. フィールドマッピングの構成: DTS はコレクション内の各フィールドについて、
bson_value()式を自動生成します。マッピングが正しいことを確認した後、各列の <列名>、<型>、<長さ>、および <精度> を設定します。式内の MongoDB フィールド名を表示するには:<
""> 内の文字列がフィールド名です。たとえば、<bson_value("age")> は <age> フィールドをマッピングします。同期する必要がないフィールドを削除するには、その行の末尾にある
をクリックします。カスタム式を必要とするフィールドを追加するには:
任意の行の末尾で
をクリックし、次に [+ 列を追加] をクリックします。 
<列名>、<型>、<長さ>、および <精度> を設定します。
bson_value()式を [値の割り当て] に入力します。参考として、「フィールドマッピングの例」セクションをご覧ください。追加の列ごとに繰り返します。
[選択済みオブジェクト] でコレクションを右クリックします。

[テーブル名] を、送信先の MySQL インスタンス内のターゲットテーブルの名前に変更します。

(省略可)データの一部のみを同期するには、フィルター条件を指定します。詳細については、「フィルター条件を指定する」をご参照ください。

(オプション) [同期する DDL および DML 操作] で、増分同期中に同期する操作を選択します。

重要プライマリキー列には、<
bson_value("_id")> を割り当てます。ネストされたフィールドについては、<bson_value()> 内でカンマ区切りの引数を使用して完全なパスを指定します。たとえば、<bson_value("person","name")>(<bson_value("person")> ではなく)を使用して、<name> サブフィールドをマッピングします。親フィールドのみを使用すると、すべてのサブフィールドについて増分データが失われる可能性があります。OK をクリックし、次に <次へ:高度な設定> をクリックします。
ステップ 4:高度な設定の構成
| 構成 | 説明 |
|---|---|
| タスクスケジューリング用専用クラスター | DTS はデフォルトで共有クラスターを使用します。より高い安定性を実現するには、専用クラスターをご購入ください。詳細については、「DTS 専用クラスターとは」をご参照ください。 |
| 接続失敗時の再試行時間 | 接続失敗後に DTS が再試行する時間です。有効範囲:10~1440 分。デフォルト:720 分。30 分を超える値を設定することを推奨します。複数のタスクが同一のソースまたは宛先を共有する場合、最も短い再試行時間が適用されます。 |
| その他の問題発生時の再試行時間 | DDL または DML の失敗後に DTS が再試行する時間です。有効範囲:1~1440 分。デフォルト:10 分。10 分を超える値を設定することを推奨します。この値は、<接続失敗時の再試行時間> よりも小さくする必要があります。 |
| 完全データ同期のスロットリングの有効化 | 完全同期中の DTS の読み取り/書き込み速度を制限して、ソースおよび宛先サーバーへの負荷を軽減します。<ソースデータベースへのクエリ数(QPS)>、<完全データ移行の RPS>、および <完全移行のデータ移行速度(MB/s)> を構成します。<完全データ同期> が選択されている場合にのみ利用可能です。 |
| 同期対象データのテーブル内でプライマリキー _id に使用されるデータ型は 1 種類のみ | 「完全データ同期」が選択されている場合にのみ利用可能です。[はい] を選択すると、コレクション内のすべての _id 値が同じデータの型を共有している場合(型スキャンをスキップ)に適用されます。[いいえ] を選択すると、混合型をスキャンします。 |
| 増分データ同期のスロットリングの有効化 | 増分同期中の DTS の速度を制限します。<増分データ同期の RPS> および <増分同期のデータ同期速度(MB/s)> を構成します。 |
| 環境タグ | この DTS インスタンスを識別するタグです。任意です。 |
| ETL の構成 | 抽出・変換・書き出し (ETL) 変換を適用するには、[はい] を選択します。コードエディタに処理文を入力します。「データ移行またはデータ同期タスクで ETL を設定する」をご参照ください。 |
| モニタリングとアラート | タスクが失敗した場合、またはレイテンシがしきい値を超えた場合にアラートを送信するには、[はい] を選択します。アラートのしきい値と通知の連絡先を設定します。詳細については、「DTS タスクを作成するときにモニタリングとアラートを設定する」をご参照ください。 |
ステップ 5:事前チェックの実行
<次へ:タスク設定の保存と事前チェック> をクリックします。
このタスク構成の API パラメーターをプレビューするには、<次へ:タスク設定の保存と事前チェック> の上にポインターを合わせ、<OpenAPI パラメーターのプレビュー> をクリックします。
DTS は同期開始前に事前チェックを実行します。いずれかの項目が失敗した場合:
失敗した項目の横にある <詳細の表示> をクリックします。
チェック結果に基づいて問題を解決します。
<再チェック> をクリックします。
項目が無視可能なアラートをトリガーした場合:
<アラート詳細の確認> をクリックし、<詳細の表示> ダイアログボックスで <無視> をクリックします。
<OK> をクリックし、次に <再チェック> をクリックします。
アラート項目を無視すると、データの不整合が発生する可能性があります。慎重にご使用ください。
ステップ 6:インスタンスの購入および起動
<成功率> が <100%> に達するまで待機し、次に <次へ:インスタンスの購入> をクリックします。
購入ページで、以下のパラメーターを構成します。
| パラメーター | 説明 |
|---|---|
| [課金方法] | サブスクリプション:固定期間 (1~9 か月、または 1、2、3、5 年) の前払いです。長期利用に費用対効果が高いです。従量課金:時間単位で課金されます。短期利用に適しています。 |
| [リソースグループ設定] | このインスタンスのリソースグループです。デフォルト:デフォルトリソースグループ。詳細については、「Resource Management とは |
| [インスタンスクラス] | 同期スループットクラスです。詳細については、「データ同期インスタンスのインスタンスクラス」をご参照ください。 |
<Data Transmission Service(従量課金)サービス利用規約> を読み、選択してください。
<購入および起動> をクリックし、確認ダイアログボックスで <OK> をクリックします。
タスクがタスクリストに表示されます。そこで進行状況を追跡できます。
データ型マッピング
DTS は、MongoDB の BSON 型を以下のように MySQL の型にマッピングします。
| MongoDB のデータ型 | MySQL のデータ型 |
|---|---|
| ObjectId | VARCHAR |
| String | VARCHAR |
| Document | VARCHAR |
| DbPointer | VARCHAR |
| Array | VARCHAR |
| Date | DATETIME |
| TimeStamp | DATETIME |
| Double | DOUBLE |
| 32-bit integer (BsonInt32) | INTEGER |
| 64-bit integer (BsonInt64) | BIGINT |
| Decimal128 | DECIMAL |
| Boolean | BOOLEAN |
| Null | VARCHAR |
フィールドマッピングの例
この例では、ネストされた MongoDB ドキュメントをフラットな MySQL テーブルにマッピングする方法を示します。
ソース MongoDB ドキュメント構造
{
"_id": "62cd344c85c1ea6a2a9f****",
"person": {
"name": "neo",
"age": 26,
"sex": "male"
}
}宛先 MySQL テーブルスキーマ
| 列名 | 型 | 備考 |
|---|---|---|
| mongo_id | varchar | プライマリキー列 |
| person_name | varchar | |
| person_age | decimal |
フィールド割り当て構成
すべての例で、ネストされた <person> オブジェクトから個々のフィールドを抽出するために <bson_value()> を使用します。
| 列名 | 型 | 値の割り当て |
|---|---|---|
| mongo_id | STRING | bson_value("_id") |
| person_name | STRING | bson_value("person","name") |
| person_age | DECIMAL | bson_value("person","age") |
完全なフィールドパスをカンマ区切りの引数で指定します。<bson_value("person","name")> は <name> サブフィールドを抽出します。<bson_value("person")> のみを使用すると、DTS は <name>、<age>、および <person> の他のすべてのサブフィールドについて、増分更新の書き込みに失敗します。
次のステップ
DTS コンソールのタスクリストで同期タスクをモニタリングします。
ワークロードを宛先データベースに切り替える前に、データ整合性を検証し、過去 7 日以内に失敗したタスクを停止またはリリースしてください。
失敗したタスクが再開された際に、DTS が宛先データを上書きしないようにするには、<
REVOKE> を使用して、DTS の宛先データベースに対する書き込みアクセス権限を取り消します。DTS タスクが失敗した場合、DTS テクニカルサポートは 8 時間以内に復旧を試みます。復旧中にタスクが再起動され、タスクパラメーター(データベースパラメーターを除く)が変更される場合があります。変更される可能性のあるパラメーターについては、「DTS インスタンスのパラメーターを変更する」をご参照ください。