1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Alibaba CloudのDTSでデーベースのリアルタイム移行(サービスのダウンタイムなし)を試してみた

Last updated at Posted at 2022-08-02

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つのインスタンスを作ります。
    image.png
    image.png

2. 2つのRDSインスタンスにそれぞれのデータベースアカウントを作成

image.png
image.png

  • 以下のの二種類のアカウントがあり、今回はPrivilaged Account(管理者)を作ります。
    • Privilaged Account(管理者)
    • Standard Account(一般ユーザー)
  • databaseのアカウントの作成方法は以下をご参考ください。

3. ソースのRDSインスタンスにデータベースを作成

  • RDSインスタンスに接続し、SQLクエリでデータベースも作れますが、RDSのコンソール画面からも簡単にデータベースが作れるので、今回はRDSのコンソール画面から作成します。
    image.png
    image.png
    image.png

4. ローカルPCからRDSインスタンスにアクセスできる

public endpointを申請

  • ローカルPCからRDSインスタンスにアクセスし、データを登録したいのですが、RDSはVPCに作られいてるので、デフォルトとしてはインターネットから直接アクセスできません。インターネット経由でRDSインスタンスにアクセスするためにはpublic endpointを申請する必要があります。

そもそもインターネットから直接アクエスできてしまうと、セキュリティリスクがあるため、本番環境はなるぶくpublic endpointを作らないようにしましょう。

image.png
image.png

whitelistの設定

image.png

  • 127.0.0.1の後ろにカンマ区切りで、自分のpublice IPを追加してください。
    image.png
    image.png
  • rdsインスタンスの画面を更新すると、以下のようにpublic endpointが表示されることになります。
    image.png

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 |
+----+-----------+----------+-------------------+---------------------+
  1. 移行対象のテーブルにはレコードを一意に識別できるIDを持つ必要があり、つまりはPRIMARY KEYまたはUNIQUE KEY制約を持つ必要があります。そうでない場合、移行先のデータベースには重複したデータレコードが含まれる可能性があります。
  2. DTSを利用するためには、ソースのデータベースでbinlog機能を有効にし、binlogを最低24時間保持する必要があります。RDSではデフォルトの状態でもbinlogはすでに有効になっています。念の為に、binlogが有効になっているかどうかは以下の方法で確認してください。(onが表示されている場合は、すでに有効になっているということです。)
mysql> SHOW GLOBAL VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

3. DTSタスク作成

  • dtsで検索し、dtsのwebコンソール画面に遷移
    image.png

  • 初めてDTSご利用の時はRAMの権限がないため、以下の画面が表示されます。権限を付与しましょう。
    image.png
    image.png

  • DTSはDMSに統合されているので、以下の画面が表示されます。(右上のアイコンをクリックして、使いたい言語を選択してください。)
    image.png

  • デフォルトの状態ではDTSのData Synchronizationタブが表示されているようす。左上のAll Functionsをクリックして、DTSData Migrationをクリックしてください。
    image.png
    image.png

  • regionはJapan(Tokyo)以外である場合は、先にregionを変更してください。
    image.png

  • Create Taskボタンをクリックして、タスクを作成
    image.png

  • ソースとターゲットのの設定
    image.png

  • Test Connectivity and Proceedボタンをクリックして、次の画面へ遷移(以下の画面が表示されたら、ソースとターゲットの情報自体が正しいであるということです。)

  • schema MigrationFull Data MigrationIncreamental Data Migration3つ全部選択しましょう。

    • 既存のデータ移行完了後、ソースに新規追加されたレコードも同期したい場合は、Increamental Data Migrationをチェックする必要がある。
    • 移行したいデータベースdts_testを選択
      image.png
  • Advanced Settings画面で特に変更なしで、そのまま次のステップに行きます。
    image.png
    image.png

  • Precheckが行われ、特にエラーがなければ、「Next:Purchase Instance」ボタンをクリック
    image.png

  • DTSのインスタンス classを選択し、「Buy and Start」ボタンをクリック(今回はテストのため、一番小さいsmallを利用)
    image.png
    image.png

  • タスク実行している(マイグレーション自体はまだ開始されていない)
    image.png

  • 20秒(データ量による)程度時間経過すると、以下のようにスキーマと既存のデータのマイグレーションが完了したことが分かる
    image.png

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 |
+----+-----------+----------+-------------------+---------------------+
  • DTSのコンソールでもIncremental Data Migrationが完了していた。
    image.png

5. マイグレーションのタスクを削除

  • DTSはタスクの稼働時間に応じて課金されます。移行作業が終わったとしても、タスク自体は自動停止にはならなくて、そのまま放置すると、課金されますので、移行作業が終わったタイミングで、タスクも削除しましょう。
    image.png

6. まとめ

  • DTSはスキーマや既存のデータだけではなく、既存データ移行後、新たに追加(変更)されるレコードもターゲットに同期できる。
  • データ移行タスクの作成時に、データベースやテーブルのスキーマを変更するDDL操作を実行すると、タスクの作成に失敗してしまいますので、DDLを実行しないでください。
  • Increamental Data Migrationをチェックせず、タスク実行中にソースインスタンスにデータを書き込んでしまうとソースインスタンスとターゲットインスタンスの間でデータの一貫性が失われます。リアルタイムでデータの一貫性を確保するために、移行タイプとしてschema MigrationFull Data MigrationIncreamental Data Migration3つ全部選択することをお勧めします。
  • DTSは自動的にRDS for MySQLインスタンスに移行先データベースを作成します。しかし、ソース・データベースの名前が無効な場合、データ移行タスクを作成する前に、ターゲットインスタンスでデータベースを手動で作成する必要があります。
  • 互換性を確保するために、ソースと移行先のMySQLデータベースで同じエンジン・バージョンを選択することをお勧めします。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?