Data Transmission Service(DTS)を使ったAlibaba CloudへのDB移行について

こんにちは。SB Cloud ソリューションアーキテクトのMIです。

Alibaba Cloudのデータ移行サービス「Data Transmission Service(以下、DTS)」を利用して、データベースのデータ移行検証を行いましたので、ご紹介させて頂きます。

DTSとは?

DTSは、移行元データベースから移行先のApsaraDBまたはECSに構築されたデータベースへのデータ移行を行うサービスです。もちろんオンプレ環境や他社のクラウドからも移行ができます。

一般的なデータ移行方式としては、移行元データベースのデータをフルエクスポートして、移行先データベースへフルインポートする方式が考えられますが、移行に時間が掛かるため移行計画の考慮が必要です。また、データを移行する際はサービスを止める必要が出てきます。

DTSはホットマイグレーション機能により、移行元サービスを停止することなく、データを移行することができます。また、DTSは増分データ移行が可能なため、移行中に更新されたデータについても移行先データベースへ自動的に反映することもできます。
対応するデータベースや前提条件、注意事項などについては、詳細はこちら(Data Transmission Serviceをご参照下さい。

検証概要

今回の検証内容は、DTSを利用した移行元データベースECS上の(PostgreSQL)から移行先データベースApsaraDB for RDS(PostgreSQL)へのデータ移行です。既存データが移行されること、既存データ移行後に移行元データベースのデータ更新が移行先データベースへ反映されることを確認します。

検証環境

今回、構築した検証環境は次の通りです。北京リージョンに移行元データベースのECS環境を構築し、東京リージョンに移行先データベースのRDS環境を構築しました。
東京リージョンのDTSで移行タスクを作成し、データを移行します。

検証ステップ

①移行元環境および移行先環境作成
②テストデータを作成
③DTSの移行タスクを作成
④DTSの移行タスクを実行
⑤移行結果確認
⑥増分データ移行検証(データ移行一時停止・データ更新・データ移行再スタート)
⑦移行結果確認

1.移行元データベースの準備

1-1.VPCの準備

下記内容でVPCを準備します。VPCの設定方法の詳細についてはこちらをご参照ください。
・北京リージョン

1-2.ECSインスタンス作成

移行元データベース1台を準備します。
下記内容でECSインスタンスを作成します。ECSインスタンスの作成方法の詳細についてはこちらをご参照ください。
・北京リージョン

1-3.セキュリティーグループ設定

PostgreSQLの通信に必要なポートを許可します。
以下の通りセキュリティーグループを設定します。セキュリティーグループの権限付与方法の詳細についてはこちらをご参照ください。
・北京リージョン(イントラネット入力)

1-4.PostgreSQLインストール

rootユーザでログインして実施します。
PostgreSQLのyumリポジトリをインストールします。

# yum install http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-redhat94-9.4-3.noarch.rpm

PostgreSQLをインストールします。

# yum groupinstall "PostgreSQL Database Server 9.4 PGDG"

1-5.PostgreSQL初期設定

PostgreSQLの初期設定コマンドを実行します。

# /usr/pgsql-9.4/bin/postgresql94-setup initdb

pg_hba.confファイルを作成し、他ホストからの接続を許可します。
※検証目的のため、すべてのホストからの接続を許可するPostgreSQLの初期設定コマンドを実行します。

# cd /var/lib/pgsql/9.4/data/
# cp -p pg_hba.conf pg_hba.conf.org
# echo "# PostgreSQL Client Authentication Configuration File" >  ./pg_hba.conf
# echo "local all all              trust" >> ./pg_hba.conf
# echo "host all all 0.0.0.0/0 trust" >> ./pg_hba.conf

postgresql.confファイルにパラメータを追記し、他ホストからの接続を
許可します。
※検証目的のため、すべてのホストからの接続を許可

# cd /var/lib/pgsql/9.4/data/
# cp -p postgresql.conf postgresql.conf .org
# echo "listen_addresses = '*'" >> postgresql.conf

postgresql.confファイルにパラメータを追記し、レプリケーションの設定を
行います。

# cd /var/lib/pgsql/9.4/data/
# echo "wal_level = logical"  >> postgresql.conf
# echo "max_wal_senders = 5"  >> postgresql.conf
# echo "max_replication_slots =5"  >> postgresql.conf

OS起動時に自動で起動するように設定をします。

# systemctl enable postgresql-9.4

PostgreSQLを起動します。

# systemctl start postgresql-9.4

管理者ユーザpostgresのパスワードを設定します。

# psql -U postgres -c "ALTER ROLE postgres WITH PASSWORD ' xxxxxxxx"

1-6.PostgreSQLテストデータ作成

「1-7.PostgreSQLテストデータ登録」で登録するテストデータdata_tbl.csvを作成して/tmpディレクトリへ保存します。表計算ソフト等でデータを作成し、
テキスト形式として保存したファイルをftpやscp等でアップロードすると楽です。

テストデータdata_tbl.csvの内容は次の通りです。
「group01000↵」 × 1,000件
「group02000↵」 × 1,000件
   (省略)
「group09000↵」 × 1,000件
「group10000↵」 × 1,000件
===================
合計10,000件
 ※「↵」は改行を表します。
 ※縦に「group01000↵」~「group10000↵」が10,000件並んだテキストファイルです。
 ※更新テストでグループ単位にデータ更新をするため、各グループ1,000件としています。

1-7.PostgreSQLテストデータ登録

PostgresSQLに管理者ユーザpostgresで接続します。

# psql -U postgres

DB管理者用のユーザdb001_user1を作成します。

postgres=# CREATE ROLE db001_user1 WITH LOGIN PASSWORD 'xxxxxxxx';

作成したユーザdb001_user1に管理者権限を付与します。

postgres=# alter role db001_user1 SUPERUSER;

データベースmydbを作成し、psqlを終了します。

postgres=# CREATE DATABASE mydb OWNER db001_user1;
postgres=# \q

ユーザdb001_user1でデータベースmydbに接続します。

# psql -U db001_user1 -d mydb;

テーブルdata_tblを作成します。

mydb=# CREATE TABLE data_tbl (
mydb(# id serial PRIMARY KEY,
mydb(# title char(20) NOT NULL,
mydb(# status int8 DEFAULT 0 NOT NULL,
mydb(# created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
mydb(# updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
mydb(# );

copyコマンドでテストデータdata_tbl.csvからテーブルにデータを登録します。

mydb=# COPY data_tbl (title) FROM '/tmp/data_tbl.csv' WITH CSV;

データの列titleの各groupが1,000件登録されていることを確認します。
※「4-5.既存データ移行の結果確認」で以下の内容と比較するため、記録して下さい。

mydb=# SELECT title , COUNT(*) FROM data_tbl GROUP BY title ORDER BY title;
        title         | count
----------------------+-------
 group01000           |  1000
 group02000           |  1000
 group03000           |  1000
 group04000           |  1000
 group05000           |  1000
 group06000           |  1000
 group07000           |  1000
 group08000           |  1000
 group09000           |  1000
 group10000           |  1000
(10 rows)

psqlを終了します。

mydb=# /q

1-8.PostgresSQL DTSプラグインインストール

DTSのデータ変更レプリケーションを使用するため、ロジックフローレプリケーションプラグインをインストールします。インストール方法の詳細についてはこちら(Install logic flow replication plugins)をご参照下さい。

プラグイン(ali_decoding_9.4.zip)を下記リンクからダウンロードし、/tmpディレクトリにアップロードします。
Local PostgreSQL 9.4 Version
解凍プログラム(unzip)をインストールします。

# yum install unzip

/tmpディレクトリに移動し、ali_decoding_9.4.zipを解凍します。

# cd /tmp
# unzip ali_decoding_9.4.zip

/tmp/ali_decoding_9.4ディレクトリに2つのファイルが作成されたことを確認します。

# cd ali_decoding_9.4
# ls –l
-rw-r--r-- 1 root root   111  7月  8  2016 ali_decoding.control
-rwxr-xr-x 1 root root 61400  7月  8  2016 ali_decoding.so

ali_decoding.soファイルをlibディレクトリへコピーします。

# cp -p ali_decoding.so /usr/pgsql-9.4/lib/.

ali_decoding.controlファイルをshare/extensionディレクトリへコピーします。

# cp -p  ali_decoding.control /usr/pgsql-9.4/share/extension/.

ユーザdb001_user1でデータベースmydbに接続します。

# psql -U db001_user1 -d mydb

1−9.プラグイン動作確認

複製スロットが正常に作成できることを確認します。
以下の実行結果が表示されれば正常に動作しています。

mydb=# SELECT * FROM pg_create_logical_replication_slot('replication_slot_test',  'ali_decoding');
       slot_name       | xlog_position 
-----------------------+---------------
 replication_slot_test | 0/18993F0
(1 row)

※「0/18993F0」の値は都度異なります。

動作確認で作成した複製スロットを削除します。

mydb=# SELECT pg_drop_replication_slot('replication_slot_test');
 pg_drop_replication_slot
--------------------------

(1 row)

psqlを終了します。

mydb=# /q

2.RDS確認端末の準備

2-1.VPCの準備

下記内容でVPCを準備します。VPCの設定方法の詳細についてはこちらをご参照ください。
・東京リージョン

2-2.ECSインスタンス作成

RDS確認端末1台を準備します。
下記内容でECSインスタンスを作成します。ECSインスタンスの作成方法の詳細についてはこちらをご参照ください。
・東京リージョン

2-3.PostgreSQLクライアントインストール

PostgreSQLのyumリポジトリをインストールします。
※rootユーザでログイン

# yum install http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-redhat94-9.4-3.noarch.rpm

PostgreSQLクライアントをインストールします。

# yum install postgresql94.x86_64

バージョンを確認し、インストールされたことを確認します。

# psql –version
psql (PostgreSQL) 9.4.17

3.移行先データベースの準備

3-1.RDSインスタンス作成

移行先データベース1台を準備します。下記内容でRDSインスタンスを作成します。RDSインスタンスの作成方法の詳細についてはこちらをご参照ください。
・東京リージョン

3-2.RDS ホワイトリストの設定

下記内容でホワイトリストの設定を行います。ホワイトリストの設定方法の詳細についてはこちらをご参照ください。
defaultグループを変更し、RDS接続端末のプライベートIP172.31.15.187を設定します。※検証目的のため、RDS接続端末のプライベートIPのみ設定

3-3.RDS アカウントの作成

下記内容でアカウントの作成を行います。アカウントの作成方法の詳細についてはこちらをご参照ください。
アカウントの情報

4.DTSタスクの作成と実行

下記内容でDTSタスクを作成します。DTSタスクの作成方法の詳細についてはこちら(PostgresSQLのMigration task configurations)をご参照下さい。

<移行タスク内容>
4-1.ソースエンドポイントとターゲットエンドポイント

下記情報を入力し、[接続のテスト]ボタンでテスト合格となることを
確認
します。テスト合格後、[ホワイトリストを承認して次のステップに進む]を
クリックします。

※1 本検証ではオンプレミス環境を想定して設定しました
※2 RDSのインスタンスIDを選択

4-2. 移行クラスとリスト

移行タイプ、移行オブジェクトを選択し、[事前チェックと開始]を
クリックします。

※移行オブジェクトに表示されているPublicを「>」ボタンで選択されたオブジェクトに移動します。

4−3.事前チェック

事前チェック画面で「事前チェック成功100%」になったことを確認します。
[次へ]をクリックします。
※成功にならなかった場合は該当のチェック項目、チェック内容を確認して対応します。

4−4.購入の設定を確認

購入の設定を確認画面でインスタンス仕様、利用規約を選択して、
[今すぐ購入してスタート]をクリックします。
※インスタンス仕様は検証のため、smallを選択。

4−5.タスクの実行状況(DTSコンソール)

DTSタスクが開始されます。タスクの実行状況はDTSコンソールで
確認できます。
※オブジェクト構造移行と既存データ移行の後は、データ変更レプリケーションが機能し、タスクは終了しません。

5.既存データ移行の結果確認

本作業はRDS確認端末にrootユーザでログインして実施します。
RDSにユーザrds_user1でデータベースmydbに接続します。

# psql -U rds_user1 -h instancename.pgsql.japan.rds.aliyuncs.com -p 3433 -d mydb

DTS移行タスクによって、テーブル/データが移行されたことを確認します。
「1-7.PostgreSQLテストデータ登録」で移行元データベースの確認した内容と
同じであることを確認します。
※移行元データベースから計10,000件のデータが移行されています。

mydb=> SELECT title , COUNT(*) FROM data_tbl GROUP BY title ORDER BY title;
        title         | count
----------------------+-------
 group01000           |  1000
 group02000           |  1000
 group03000           |  1000
 group04000           |  1000
 group05000           |  1000
 group06000           |  1000
 group07000           |  1000
 group08000           |  1000
 group09000           |  1000
 group10000           |  1000
(10 rows)

6.増分データ移行のテスト

6-1.RDS データ更新前の状態確認

RDS確認端末からRDSのデータ移行前の状態を記録します。
各groupの列statusが値0であり、各groupに1000件登録されています。

mydb=> SELECT title , status , count(*)  FROM data_tbl GROUP BY title,status ORDER BY title;                title         | status | count
----------------------+--------+-------
 group01000           |      0 |  1000
 group02000           |      0 |  1000
 group03000           |      0 |  1000
 group04000           |      0 |  1000
 group05000           |      0 |  1000
 group06000           |      0 |  1000
 group07000           |      0 |  1000
 group08000           |      0 |  1000
 group09000           |      0 |  1000
 group10000           |      0 |  1000
(10 rows)

6-2. 移行元データベース データ更新前の状態確認

本作業は移行元データベースにrootユーザでログインして実施します。
移行元データベースにユーザdb001_user1でデータベースmydbに接続します。

# psql -U db001_user1 -d mydb;

データ更新前の状態を確認します。
各groupの列statusが値0であり、各groupに1000件登録されています。

mydb=# SELECT title , status , count(*)  FROM data_tbl GROUP BY title,status ORDER BY title;
        title         | status | count
----------------------+--------+-------
 group01000           |      0 |  1000
 group02000           |      0 |  1000
 group03000           |      0 |  1000
 group04000           |      0 |  1000
 group05000           |      0 |  1000
 group06000           |      0 |  1000
 group07000           |      0 |  1000
 group08000           |      0 |  1000
 group09000           |      0 |  1000
 group10000           |      0 |  1000
(10 行)

6-3. 移行元データベース データ更新

title列’group01000’の1000件に対して、列statusを値1に更新します。

mydb=# UPDATE data_tbl SET status = 1 WHERE title = 'group01000';
UPDATE 1000

データ更新後の状態を確認します。title列’group01000’の列statusが値1に1000件更新されたことを確認します。

mydb=# SELECT title , status , count(*)  FROM data_tbl GROUP BY title,status ORDER BY title;
        title         | status | count
----------------------+--------+-------
 group01000           |      1 |  1000
 group02000           |      0 |  1000
 group03000           |      0 |  1000
 group04000           |      0 |  1000
 group05000           |      0 |  1000
 group06000           |      0 |  1000
 group07000           |      0 |  1000
 group08000           |      0 |  1000
 group09000           |      0 |  1000
 group10000           |      0 |  1000
(10 行)

6-4.RDS データ更新後の状態確認

RDS確認端末からRDSのデータ更新後の状態を確認します。
移行元データベースが更新され、DTSのデータ変更レプリケーションによって、更新データが移行先データベースに反映されたことを確認します。
title列’group01000’の列statusが値1に1000件更新されています。

mydb=> SELECT title , status , count(*)  FROM data_tbl GROUP BY title,status ORDER BY title;                title         | status | count
----------------------+--------+-------
 group01000           |      1 |  1000
 group02000           |      0 |  1000
 group03000           |      0 |  1000
 group04000           |      0 |  1000
 group05000           |      0 |  1000
 group06000           |      0 |  1000
 group07000           |      0 |  1000
 group08000           |      0 |  1000
 group09000           |      0 |  1000
 group10000           |      0 |  1000
(10 rows)

7.増分データ移行のテスト(一時停止、再開)

7-1.RDS データ移行前の状態確認

RDS確認端末からRDSのデータ移行前の状態を記録します。
各groupの列statusが以下の状態であることを確認します。

mydb=> SELECT title , status , count(*)  FROM data_tbl GROUP BY title,status ORDER BY title;                title         | status | count
----------------------+--------+-------
 group01000           |      1 |  1000
 group02000           |      0 |  1000
 group03000           |      0 |  1000
 group04000           |      0 |  1000
 group05000           |      0 |  1000
 group06000           |      0 |  1000
 group07000           |      0 |  1000
 group08000           |      0 |  1000
 group09000           |      0 |  1000
 group10000           |      0 |  1000
(10 rows)

7-2.DTSタスク一時停止

DTSコンソールにログインして、タスクdts_taskを選択し、[一時停止]をクリックします。

移行タスクを一時停止画面で[OK]をクリックします。

7-3. 移行元データベースデータ更新

本作業は移行元データベースにrootユーザでログインして実施します。
移行元データベースのデータを更新します。
title列’group02000’の1000件に対して、列statusを値2に更新します。

mydb=# UPDATE data_tbl SET status = 2 WHERE title = 'group02000';
UPDATE 1000

データ更新後の状態を確認します。
title列’group02000’の列statusが値2に1000件更新されたことを確認します。

mydb=# SELECT title , status , count(*)  FROM data_tbl GROUP BY title,status ORDER BY title;
        title         | status | count
----------------------+--------+-------
 group01000           |      1 |  1000
 group02000           |      2 |  1000
 group03000           |      0 |  1000
 group04000           |      0 |  1000
 group05000           |      0 |  1000
 group06000           |      0 |  1000
 group07000           |      0 |  1000
 group08000           |      0 |  1000
 group09000           |      0 |  1000
 group10000           |      0 |  1000
(10 行)

7-4.RDS DTSタスク一時停止時の状態確認

RDS確認端末からRDSのデータの状態を確認します。DTSの移行タスクが一時停止しているため、データ移行されていないことが確認できます。

mydb=> SELECT title , status , count(*)  FROM data_tbl GROUP BY title,status ORDER BY title;                title         | status | count
----------------------+--------+-------
 group01000           |      1 |  1000
 group02000           |      0 |  1000
 group03000           |      0 |  1000
 group04000           |      0 |  1000
 group05000           |      0 |  1000
 group06000           |      0 |  1000
 group07000           |      0 |  1000
 group08000           |      0 |  1000
 group09000           |      0 |  1000
 group10000           |      0 |  1000
(10 rows)

7-5.DTS移行タスク再開

DTSコンソールにログインして、タスクdts_taskを選択し、[開始]を
クリックします。

タスクの開始画面で[開始]をクリックします。

7-6. RDS DTSタスク再開後の状態確認

RDS確認端末からRDSのデータの状態を確認します。
DTS移行タスクの再開によって、移行元データベースの更新データが
移行先データベースに移行されたことが確認できます。
title列’group02000’の列statusが値2に1000件更新されています。

mydb=> SELECT title , status , count(*)  FROM data_tbl GROUP BY title,status ORDER BY title;                title         | status | count
----------------------+--------+-------
 group01000           |      1 |  1000
 group02000           |      2 |  1000
 group03000           |      0 |  1000
 group04000           |      0 |  1000
 group05000           |      0 |  1000
 group06000           |      0 |  1000
 group07000           |      0 |  1000
 group08000           |      0 |  1000
 group09000           |      0 |  1000
 group10000           |      0 |  1000
(10 rows)

7-7.DTSタスク終了

テストの後処理としてdts_taskを終了します。DTSコンソールにログインして、タスクdts_taskを選択し、[終了]をクリックします。

おわりに

DTSによるデータ移行は、データ移行時に既存サービスを停止することなく、
オンラインでDTSの移行タスクによってデータ移行を実行することができます。

システム移行時のサービス停止時間を最小限にしたい場合に便利です。
また、データ移行のレスポンスが懸念される場合にも一時停止しておいて対応
することができます。

既存サービスの特性にあわせて移行方式をご検討頂ければと思います。是非、DTSを使ってみて下さい!

この記事をシェアする