RDS for MariaDBへのレプリケーション #reinvent

Amazon RDS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

藤本です。

本日、RDS for MariaDBがリリースされました。 RDS for Auroraの東京リージョンまだか、まだかと思っていたら、Auroraと同時にMariaDBが来ちゃいました。しかもちゃんと東京リージョンにもリリースされました。

速報記事として弊社から既に2件のブログがエントリされています。
【速報】Amazon RDSが新たに「MariaDB」に対応しました! #reinvent
MariaDB on Amazon RDSを触ってみた #reinvent

早速、オンプレやon EC2で立てたMariaDBを移行したいという方がいらっしゃるのではないでしょうか?

概要

MariaDB on EC2からRDS for MariaDBへレプリケーションする設定をご紹介します。

レプリケーションと言っても、バックアップや冗長化のStandby用途でRDSを利用されることはあまりないと思いますが、事前にレプリケーションしておくことでいざ来たるシステム移行時のダウンタウンを限りなく短くすることができます。特に移行元データが大きいシステムの場合、その分データのエクスポート、転送、インポートに要する時間が増加します。システム上、長時間の停止が許されないシステムも多くあります。その場合、移行前にレプリケーション設定しておくことをオススメします。

今回ご紹介する設定はEC2上に立てたMariaDBをMasterとして、新規のRDS for MariaDBへデータ移行し、SLAVEとして動作することをゴールとします。 またMariaDBのv10.0.2でサポートされたGTID(Global Transaction ID)を利用したレプリケーションとなりますので、MasterとなるMariaDBのバージョンがv10.0.2以降である必要があります。

大きな流れとしては以下となります。

  • RDS for MariaDB作成
  • レプリケーションの有効化(Master) ※ MariaDBを再起動する必要あり
  • データエクスポート(Master)
  • データインポート(Slave)
  • レプリケーション設定(Master)
  • レプリケーション設定(Slave)
  • 動作確認

環境

  • Master
    • 環境 : Amazon EC2
    • OS : Amazon Linux 2015.09
    • DB : MariaDB 10.0.21-1
  • Slave
    • 環境 : Amazon RDS
    • DB : MariaDB 10.0.17
  • データベースデータ
    • database : testdb
    • table : sample (user_id, full_name, email, country)
    • データ : ランダムに生成した10万レコード+α

やってみた

RDS for MariaDB作成

RDS for MariaDBの作成は下記ブログエントリをご参照ください。
MariaDB on Amazon RDSを触ってみた #reinvent

レプリケーションの有効化(Master)

※ 既にGTIDベースのレプリケーションを設定済みという方はこの手順はSkipしてください。

トランザクションログの出力を開始します。トランザクションログの管理としてGTIDを利用します。 GTIDはトランザクションログの位置情報となります。Master、Slaveがトランザクションログのどの位置までデータをレプリケーション済みなのかを管理することで、レプリケーションの負荷軽減や設定の簡略化が可能となりました。

Master側のmy.cnfを編集します。

# vi /etc/my.cnf
[mysqld]
log-bin=mariadb-bin
server-id=1

設定ファイル編集後にMariaDBを再起動します。

# /etc/init.d/mysql restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!

トランザクションログの出力が開始します。

# ls -l /var/lib/mysql/
-rw-rw---- 1 mysql mysql      314 Oct  8 01:25 mariadb-bin.000001
-rw-rw---- 1 mysql mysql       21 Oct  8 01:25 mariadb-bin.index

データエクスポート(Master)

移行対象のデータベースのデータをエクスポートします。
エクスポートは従来のmysqldumpコマンドで実施してください。

# mysqldump --databases testdb --single-transaction --master-data=2 > master.sql

またエクスポートデータからエクスポート時点でのGTIDを取得します。
(ちなみにトランザクションログ有効後に一件もデータを投入していない場合、GTIDは取得されません。)

# grep MASTER_LOG_FILE master.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=510;
# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.0.21-MariaDB-log MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select binlog_gtid_pos('mariadb-bin.000001', 510);
+--------------------------------------------+
| binlog_gtid_pos('mariadb-bin.000001', 510) |
+--------------------------------------------+
| 0-1-1                                      |
+--------------------------------------------+
1 row in set (0.00 sec)

データインポート(Slave)

従来のmysqlコマンドでインポートできます。

# mysql -h mariadb.cc01jwmw6mj7.ap-northeast-1.rds.amazonaws.com -u fujimoto -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 337
Server version: 10.0.17-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> Bye
# mysql -h mariadb.cc01jwmw6mj7.ap-northeast-1.rds.amazonaws.com -u fujimoto -p < master.sql
Enter password:
# mysql -h mariadb.cc01jwmw6mj7.ap-northeast-1.rds.amazonaws.com -u fujimoto -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 337
Server version: 10.0.17-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> use testdb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [testdb]> select count(*) from sample
    -> ;
+----------+
| count(*) |
+----------+
|   100006 |
+----------+
1 row in set (0.04 sec)

データがインポートされました。

レプリケーション設定(Master)

SlaveがMasterにデータを取得するためのDBユーザーをMasterに事前に用意します。既に用意済みであれば、こちらの手順はSkipしてください。

MariaDB [(none)]> CREATE USER 'repl_user'@'mariadb.cc01jwmw6mj7.ap-northeast-1.rds.amazonaws.com' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mariadb.cc01jwmw6mj7.ap-northeast-1.rds.amazonaws.com' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

レプリケーション設定(Slave)

最後にSlave側となるRDS for Mariaで事前に用意された2つのストアドプロシージャを利用してレプリケーションを開始します。 引数はMasterとなるホスト、ポート番号、DBユーザー名、パスワード、暗号化の有無の5つとなります。

MariaDB [(none)]> CALL mysql.rds_set_external_master_gtid ('172.31.25.170', 3306, 'repl_user', 'password', '0-1-1', 0);
Query OK, 0 rows affected (0.05 sec)

MariaDB [(none)]> CALL mysql.rds_start_replication;
+-------------------------+
| Message                 |
+-------------------------+
| Slave running normally. |
+-------------------------+
1 row in set (1.02 sec)

Query OK, 0 rows affected (1.02 sec)

動作確認

Master側にデータをINSERTします。

MariaDB [testdb]> insert into sample values (500000, 'test', 'test@test.xyz', 'Japan');
Query OK, 1 row affected (0.00 sec)

MariaDB [testdb]> select * from sample where user_id = 500000;
+---------+-----------+---------------+---------+
| user_id | full_name | email         | country |
+---------+-----------+---------------+---------+
|  500000 | test      | test@test.xyz | Japan   |
+---------+-----------+---------------+---------+
1 row in set (0.05 sec)

Slave側で確認します。

MariaDB [testdb]> select * from sample where user_id = 500000;
+---------+-----------+---------------+---------+
| user_id | full_name | email         | country |
+---------+-----------+---------------+---------+
|  500000 | test      | test@test.xyz | Japan   |
+---------+-----------+---------------+---------+
1 row in set (0.04 sec)

同じデータがINSERTされています。

まとめ

いかがでしたでしょうか?
たったこれだけでレプリケーション設定ができました。今までMariaDBを使いたいけどRDSになく、妥協してon EC2やRDS for MySQLで構築された方もいらっしゃるのではないでしょうか。ついにRDS for MariaDBが登場しました。
ストアドプロシージャを用意してくれて移行しやすい準備をしてくれていることも嬉しいところですね。

次回は実際の移行時の切り替えのエントリを書きたいと思います。

RDS for MariaDBのクラスタオプションとして、Galera Clusterを選べるとスゴく嬉しいなー。

参考サイト