Amazon RDS MySQL 5.6と新機能を試してみた

AWS

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

昨日、AWSのManaged Databaseサービス RDSのアップデートが発表されました!なので、早速試したレポートを投下します!

新機能

主な新機能は以下です。

  • MySQLバージョン5.6に対応
  • MySQL 5.6のmemcached pluginに対応
  • MySQLバイナリログの取得に対応

その他の新機能は、堀内さんのAWSブログを参照ください。

MySQLバージョン5.6のRDSを作成

まずは、MySQLバージョン5.6のRDSを作成してみましょう。作成方法は従来のRDSと特に変わりません。
RDSを作成するLaunch DB Instance WizardDB Instance Details画面で指定するDB Engine Versionから今回の新バージョン5.6に対応するMySQL 5.6.12を選択して、残りはデフォルトのままでRDSを作成しましょう。今回はDB Instance Classはt1.micro、Allocated Storageは5GBで作成しました。

rds01-2

従来のMySQLバージョン5.5よりも、心なしかインスタンスの作成時間が短かった気がします。Status列がavailableになったら、接続してみましょう。

$ mysql -u testuser -h mysqltest.XXXXXXXXXXXX.ap-southeast-1.rds.amazonaws.com -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.12 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

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>

MySQLのバージョン表記が、確かに5.6.12になっています!

memcached plugin

MySQLバージョン5.6では、memcachedと互換性のあるmemcached pluginが使用できます。これを使うと、MySQLをmemcachedの代替のキーバリューストアとして使うことができます。
RDSでは、Option Groupという設定を追加し、memcached pluginを使用することができます。

Option Groupの作成

Management ConsoleのRDSのメニューからOptions Groupsを選択します。MySQLのバージョンごとにデフォルトのOption Groupがありますが、これらは変更できないのでCreate Groupボタンから新規作成します。

rds02

rds03

Option Group名は、英数字とハイフンのみらしいです。

続いてOption Groupに、memcached pluginのオプションを追加します。Option Groupを選択して、Add Optionボタンをクリックします。

rds04

Optionを追加する画面では、memcached pluginがListenするポート番号、セキュリティグループ、オプションを設定します。

rds05

ポート番号は、memcached標準の11211番がデフォルト値ですが、AWSのドキュメントでは適宜変更することが推奨されています。
セキュリティグループは、memcache plugin用の設定が可能で、MySQLの通常のサービスとは別に設定できるところがユニークですね。一覧にはDB Security GroupとVPC Security Groupの両方が出てきますが、DBインスタンスの配置に合ったセキュリティグループを選びましょう。

RDSの構成変更

Option Groupができたら、RDSのDBインスタンスに設定していきます。今回は既存のMySQL5.6のDBインスタンスを変更し、memcached pluginを有効にします。

AWSドキュメントでは、新規DBインスタンスの作成時、既存DBインスタンスの変更時の両方でOption Groupが設定できるとありますが、検証環境では新規DBインスタンスの作成時にOption Groupの選択がグレーのInactiveになっていて、選択できませんでした。
また、db.t1.microではOption Groupの変更ができないようです。db.m1.small以上で試しましょう。

rds06

変更画面のOption Groupを、先ほど作成したものに変更します。

rds07

動作確認

まずは、MySQLのshow pluginsコマンドでmemcached pluginが有効になっているかを確認します。

mysql> show plugins;
+----------------------------+----------+--------------------+-----------------+---------+
| Name                       | Status   | Type               | Library         | License |
+----------------------------+----------+--------------------+-----------------+---------+
(中略)
| daemon_memcached           | ACTIVE   | DAEMON             | libmemcached.so | GPL     |
+----------------------------+----------+--------------------+-----------------+---------+
43 rows in set (0.08 sec)

mysql> exit
$

確かに有効になっています。では、実際に接続してみましょう。memcachedはテキストベースのプロトコルなので、telnetコマンドで接続することができます。setでデータの投入、getでデータの表示ができます。プロンプトが出ないのでわかりにくいですが、実行例のハイライトの部分がターミナルからの入力です。

$ telnet mysqltest.XXXXXXXXXXXX.ap-southeast-1.rds.amazonaws.com 11211
Trying XX.XX.XX.XX...
Connected to ec2-XX-XX-XX-XX.ap-southeast-1.compute.amazonaws.com.
Escape character is '^]'.
set foo 0 0 3
bar
STORED
get foo
VALUE foo 0 3
bar
quit
Connection closed by foreign host.
$

確かに、データが保存できていますね。さらに、データは当然MySQLのデータベースに保存されるので、mysqlコマンドでも確認することができます。RDSでは、memcached pluginのデータはtestデータベースのdemo_testテーブルに格納されます。MySQLのマニュアルからそのまま取ってつけたような命名ですが、ちゃんと動いています。

mysql> use test
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
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| demo_test      |
+----------------+
1 row in set (0.08 sec)

mysql> select * from demo_test;
+-----+--------------+------+------+------+
| c1  | c2           | c3   | c4   | c5   |
+-----+--------------+------+------+------+
| AA  | HELLO, HELLO |    8 |    0 |    0 |
| foo | abc          |    0 |    3 |    0 |
+-----+--------------+------+------+------+
2 rows in set (0.08 sec)

mysql>

…カラム名のc1〜5ってなんじゃらほいって感じですよねw
memcached pluginでは、データの定義を別途innodb_memcacheデータベースのcontainersテーブルに持つようになっています。

mysql> use innodb_memcache
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
mysql> show tables;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies            |
| config_options            |
| containers                |
+---------------------------+
3 rows in set (0.08 sec)
mysql> select * from containers \G
*************************** 1. row ***************************
                  name: aaa
             db_schema: test
              db_table: demo_test
           key_columns: c1
         value_columns: c2
                 flags: c3
            cas_column: c4
    expire_time_column: c5
unique_idx_name_on_key: PRIMARY
1 row in set (0.10 sec)

バイナリログの取得

バイナリログは、Automatic Backupが有効であれば取得可能です。まずは、バイナリログのファイル名をMySQLコマンドのshow binary logsで確認します。

$ mysql -u testuser -h mysqltest.XXXXXXXXXXXX.ap-southeast-1.rds.amazonaws.com -p
Enter password:

mysql> show binary logs;
+----------------------------+-----------+
| Log_name                   | File_size |
+----------------------------+-----------+
| mysql-bin-changelog.000008 |       479 |
| mysql-bin-changelog.000009 |       422 |
+----------------------------+-----------+
2 rows in set (0.10 sec)
mysql> exit

今回は、MySQLクライアント付属のmysqlbinlogコマンドで取得してみます。接続オプションはmysqlコマンドど共通、--result-fileオプションでバイナリログを保存するファイル名を指定します。

$ mysqlbinlog -h mysqltest.XXXXXXXXXXXX.ap-southeast-1.rds.amazonaws.com ¥
-u testuser -p ¥
--read-from-remote-server --result-file=binlog ¥
mysql-bin-changelog.000009
$ cat binlog
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
(以下略)

まとめ

いかがでしたでしょうか。一番大きなアップデートは、やはりMySQLバージョン5.6の対応ですが、バイナリログの取得も応用範囲が広がる魅力的な新機能だと思っています。
着実に、しかもかなりのスピードで進化を続けるRDSをがんばってキャッチアップしていきましょう!

参考