1. DTSとは
DTSはData Transmission Serviceの略語であり、リレーショナルデータベース、NoSQL、OLAP などのデータベース間でデータ移行やリアルタイムのデータ同期などができるマネージドサービスです。
AWSのDMSと同じコンセントのサービスですが、DMSよりはできることが多いです。
DTSには主に以下の機能があります。
-
Data migration
: データソースにあるスキーマや既存のデータやキャプチャされた変更などをターゲットデータベースへ移行する機能- オンプレや他社のクラウド上のデータベースをAlibaba Cloudに移行する時に利用
- データマイグレーション作業が終わったら、タスクを削除するというやり方なので、一回だけのタスクにピッタリです。
-
Data synchronization
:リアルタイムにdata sourcesを双方向
同期する機能、以下のシナリオで利用されことが多いです。(一回きりのタスクではなく、常時稼働なタスク)- DRサイトの構築(マインのサイトから継続的にデータをDRサイトへリアルタイム同期)
- multi-site(DR用ではなく、2つのサイトは同時にサービスを提供し、end userからのリクエストは自動的に地理的に近いサイトに振り分けられる)間のデータのリアルタイム同期
- 業務用データベース(OLTPのデータベース)からデータをdata warehouseへ同期
-
Change tracking
: データソースのdataの変更をキャプチャし、publisher/subscriber streamとしてメッセージを第三者に送る- 複数のsubscriberに同時にメッセージを送れるのは特徴です。(AWSのSNSに似ているところがあります。)
オンプレからアリババクラウドのRDSへの移行やAWSのRDSからアリババクラウドのRDSへの移行もだいたい同じな流れです。
今回はData migration
を利用し、アリババクラウド上のRDSから別のRDSインスタンスにデータを移行してみたいと思います。
2. 事前準備
1. 2つのRDSインスタンスを作成
2. 2つのRDSインスタンスにそれぞれのデータベースアカウントを作成
- 以下のの二種類のアカウントがあり、今回は
Privilaged Account
(管理者)を作ります。-
Privilaged Account
(管理者) -
Standard Account
(一般ユーザー)
-
- databaseのアカウントの作成方法は以下をご参考ください。
3. ソースのRDSインスタンスにデータベースを作成
4. ローカルPCからRDSインスタンスにアクセスできる
public endpointを申請
- ローカルPCからRDSインスタンスにアクセスし、データを登録したいのですが、RDSはVPCに作られいてるので、デフォルトとしてはインターネットから直接アクセスできません。インターネット経由でRDSインスタンスにアクセスするためにはpublic endpointを申請する必要があります。
そもそもインターネットから直接アクエスできてしまうと、セキュリティリスクがあるため、本番環境はなるぶくpublic endpointを作らないようにしましょう。
whitelistの設定
5. ソースのデータベースにデータを登録しておく
- ローカルPCからソースのRDSインスタンスに接続した上で、
myguests
の新テーブルを新規作成- host:上記のRDSインスタンスのpublic endpoint
- user:上記RDSのコンソール画面で作られたデータベースアクセスのアカウント
% mysql -h*** -u*** -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 72
Server version: 8.0.25 Source distribution
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| __recycle_bin__ |
| dts_test |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
# RDSのwebコンソールで作られたdts_testというデータベースに切り替える
mysql> use dts_test;
Database changed
mysql> show tables;
Empty set (0.06 sec)
mysql> CREATE TABLE myguests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
mysql> show tables;
+--------------------+
| Tables_in_dts_test |
+--------------------+
| myguests |
+--------------------+
- 2つのレコードを登録します。
mysql> insert into myguests(firstname,lastname,email) values("user1","","user1@example.com");
mysql> insert into myguests(firstname,lastname,email) values("user2","","user2@example.com");
mysql> select * from myguests;
+----+-----------+----------+-------------------+---------------------+
| id | firstname | lastname | email | reg_date |
+----+-----------+----------+-------------------+---------------------+
| 1 | user1 | | user1@example.com | 2022-08-02 20:20:00 |
| 2 | user2 | | user2@example.com | 2022-08-02 20:20:09 |
+----+-----------+----------+-------------------+---------------------+
- 移行対象のテーブルにはレコードを一意に識別できるIDを持つ必要があり、つまりはPRIMARY KEYまたはUNIQUE KEY制約を持つ必要があります。そうでない場合、移行先のデータベースには重複したデータレコードが含まれる可能性があります。
- DTSを利用するためには、ソースのデータベースでbinlog機能を有効にし、binlogを最低24時間保持する必要があります。RDSではデフォルトの状態でもbinlogはすでに有効になっています。念の為に、binlogが有効になっているかどうかは以下の方法で確認してください。(
on
が表示されている場合は、すでに有効になっているということです。)
mysql> SHOW GLOBAL VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
3. DTSタスク作成
-
DTSは
DMS
に統合されているので、以下の画面が表示されます。(右上のアイコンをクリックして、使いたい言語を選択してください。)
-
デフォルトの状態ではDTSの
Data Synchronization
タブが表示されているようす。左上のAll Functions
をクリックして、DTS
のData Migration
をクリックしてください。
-
Test Connectivity and Proceed
ボタンをクリックして、次の画面へ遷移(以下の画面が表示されたら、ソースとターゲットの情報自体が正しいであるということです。) -
schema Migration
、Full Data Migration
とIncreamental Data Migration
3つ全部選択しましょう。 -
DTSのインスタンス classを選択し、「Buy and Start」ボタンをクリック(今回はテストのため、一番小さい
small
を利用)
4. 動作確認
データがソースからターゲットのデータベースに同期されていることを確認
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| __recycle_bin__ |
| dts_test |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> use dts_test;
mysql> select * from myguests;
+----+-----------+----------+-------------------+---------------------+
| id | firstname | lastname | email | reg_date |
+----+-----------+----------+-------------------+---------------------+
| 1 | user1 | | user1@example.com | 2022-08-02 20:20:00 |
| 2 | user2 | | user2@example.com | 2022-08-02 20:20:09 |
+----+-----------+----------+-------------------+---------------------+
ソースのデータベースに新たにレコードをinsertします。
mysql> insert into myguests(firstname,lastname,email) values("user3","","user3@example.com");
mysql> select * from myguests;
+----+-----------+----------+-------------------+---------------------+
| id | firstname | lastname | email | reg_date |
+----+-----------+----------+-------------------+---------------------+
| 1 | user1 | | user1@example.com | 2022-08-02 20:20:00 |
| 2 | user2 | | user2@example.com | 2022-08-02 20:20:09 |
| 3 | user3 | | user3@example.com | 2022-08-02 20:36:36 |
+----+-----------+----------+-------------------+---------------------+
ターゲットのデータベースを確認(新しいレコードもターゲットのデータベースに同期されました。)
mysql> select * from myguests;
+----+-----------+----------+-------------------+---------------------+
| id | firstname | lastname | email | reg_date |
+----+-----------+----------+-------------------+---------------------+
| 1 | user1 | | user1@example.com | 2022-08-02 20:20:00 |
| 2 | user2 | | user2@example.com | 2022-08-02 20:20:09 |
| 3 | user3 | | user3@example.com | 2022-08-02 20:36:36 |
+----+-----------+----------+-------------------+---------------------+
5. マイグレーションのタスクを削除
- DTSはタスクの稼働時間に応じて課金されます。移行作業が終わったとしても、タスク自体は自動停止にはならなくて、そのまま放置すると、課金されますので、移行作業が終わったタイミングで、タスクも削除しましょう。
6. まとめ
- DTSはスキーマや既存のデータだけではなく、既存データ移行後、新たに追加(変更)されるレコードもターゲットに同期できる。
- データ移行タスクの作成時に、データベースやテーブルのスキーマを変更するDDL操作を実行すると、タスクの作成に失敗してしまいますので、DDLを実行しないでください。
-
Increamental Data Migration
をチェックせず、タスク実行中にソースインスタンスにデータを書き込んでしまうとソースインスタンスとターゲットインスタンスの間でデータの一貫性が失われます。リアルタイムでデータの一貫性を確保するために、移行タイプとしてschema Migration
、Full Data Migration
とIncreamental Data Migration
3つ全部選択することをお勧めします。 - DTSは自動的にRDS for MySQLインスタンスに移行先データベースを作成します。しかし、ソース・データベースの名前が無効な場合、データ移行タスクを作成する前に、ターゲットインスタンスでデータベースを手動で作成する必要があります。
- 互換性を確保するために、ソースと移行先のMySQLデータベースで同じエンジン・バージョンを選択することをお勧めします。