2011年8月31日水曜日

EC2でMySQL(Spider編2 リージョン間SpiderでSSL接続)

少し間があいてしまいましたが、Spiderの続きです。
前回はSpiderを使用して、書き込みの分散をおこないました。

今回は、Spiderによる書き込み分散をリージョン間で試してみます。
構成は以下のとおりです。(IPは仮のものです)

  • Spiderノード(Tokyoリージョン、123.123.123.123)
  • データノード1(Tokyoリージョン、111.111.111.111)
  • データノード2(EUリージョン、222.222.222.222)

また、リージョン間の接続はインターネット越しになるため、SSLで接続するのが安全です。
インストールやデータベースの作成、セキュリティグループの設定など基本的な部分は前回と同じなので割愛します。ちなみにこのサンプルで使用している証明書類は自前の証明書です。

データノードの設定

2つのデータノードで以下の設定をします。
前回と違うのは、データノードはSpiderのSSL接続先になるためのサーバー証明書の配置です。
# mkdir -p /tmp/ssl
# cd /tmp/ssl
# openssl genrsa -out ca-key.pem 2048
# openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem
# openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem -days 3650
# openssl rsa -in server-key.pem -out server-key.pem
# openssl x509 -req -in server-req.pem -CA ca-cert.pem -CAkey ca-key.pem -out server-cert.pem -set_serial 2 -days 3650
# chown mysql:mysql *

my.cnfで証明書の場所を追記します。
# vi /etc/my.cnf
ssl-ca=/tmp/ssl/ca-cert.pem
ssl-cert=/tmp/ssl/server-cert.pem
ssl-key=/tmp/ssl/server-key.pem

SSL接続が有効になっていることを確認します。
# mysql -u root
mysql> show variables like '%ssl%';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| have_openssl  | YES                      |
| have_ssl      | YES                      |
| ssl_ca        | /tmp/ssl/ca-cert.pem     |
| ssl_capath    |                          |
| ssl_cert      | /tmp/ssl/server-cert.pem |
| ssl_cipher    |                          |
| ssl_key       | /tmp/ssl/server-key.pem  |
+---------------+--------------------------+

spiderノードのアクセスを許可します。
もしSSL以外受け付けない場合はGRANT文の最後に REQUIRE SSLをつけます。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@"ja-spider" IDENTIFIED BY 'remote_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@"123.123.123.123" IDENTIFIED BY 'remote_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@"ec2-123-123-123-123.ap-northeast-1.compute.amazonaws.com" IDENTIFIED BY 'remote_pass';

memberテーブルを作成します。
mysql> use cloudpack
Database changed
mysql> create table member(
id int(11) auto_increment,
name varchar(256),
primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)


Spiderノードの設定

続いてSpiderノードでの設定を行います。
前回との違いは、SpiderテーブルのSSLオプションと、クライアント証明書の配置です。
証明書を作成します。
# mkdir -p /tmp/ssl
# cd /tmp/ssl
# openssl genrsa -out ca-key.pem 2048
# openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem
# openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem -days 3650
# openssl rsa -in client-key.pem -out client-key.pem
# openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -out client-cert.pem -set_serial 2 -days 3650
# chown mysql:mysql *

次にSpiderテーブルを作成します。
まず最初に、前回と同じSSLオプションなしで作成してみます。
# mysql -u root
mysql> use cloudpack
Database changed
mysql> create table member(
id int(11) auto_increment,
name varchar(256),
primary key(id)
) engine = Spider DEFAULT CHARSET=utf8
CONNECTION ' table "member", user "remote_user", password "remote_pass" '
PARTITION BY KEY() (
    PARTITION ap_northeast_1 comment 'host "111.111.111.111", port "3306"',
    PARTITION eu_west_1 comment 'host "222.222.222.222", port "3306"'
);
Query OK, 0 rows affected (0.04 sec)

ここで、別コンソールでSpiderノードにtcpflowをインストールし、
3306ポートの通信を見てみましょう。

コンソール2
# yum install tcpflow -y
# tcpflow -c port 3306

コンソール1でこのようにINSERTして見ます。
mysql> INSERT INTO member (name) VALUES('memorycraft'),('ichiro'),('jiro');

するとコンソール2では、以下のように平文で通信されていることがわかります。
046.137.176.190.03306-010.146.027.110.49671: ...........
010.146.027.110.49671-046.137.176.190.03306: .....SET NAMES utf8
046.137.176.190.03306-010.146.027.110.49669: ...........
010.146.027.110.49669-046.137.176.190.03306: 1....show table status from `cloudpack` like 'member'
046.137.176.190.03306-010.146.027.110.49671: ...........
010.146.027.110.49671-046.137.176.190.03306: @....insert into `cloudpack`.`member`(`id`,`name`)values(2,'ichiro')
046.137.176.190.03306-010.146.027.110.49669: .....*....def..TABLES..Name
TABLE_NAME.!...........(....def..TABLES..Engine.ENGINE.!...........*....def..TABLES..Version.VERSION.?...... ....0....def..TABLES.
Row_format
ROW_FORMAT.!...........*....def..TABLES..Rows
TABLE_ROWS.?...... ....8....def..TABLES..Avg_row_length.AVG_ROW_LENGTH.?...... ....2....def..TABLES..Data_length.DATA_LENGTH.?...... ....:....def..TABLES..Max_data_length.MAX_DATA_LENGTH.?...... ....4..
.def..TABLES..Index_length.INDEX_LENGTH.?...... .........def..TABLES..Data_free.DATA_FREE.?...... ....8....def..TABLES..def..TABLES..Create_time.CREATE_TIME.?...........2....def..TABLES..Update_time.UPDATE_TIME.?...........0....def..TABLES.
Check_time
CHECK_TIME.?...........4....def..TABLES..Collation.TABLE_COLLATION.!.`.........,....def..TABLES..Checksum.CHECKSUM.?...TABLE_COMMENT.!..................".Z....member.InnoDB.10.Compact.0.0.16384.0.0.4194304.1.2011-08-30 22:59:16...utf8_general_ci..........".
046.137.176.190.03306-010.146.027.110.49671: ...........
010.146.027.110.54750-046.051.243.054.03306: .....commit
046.051.243.054.03306-010.146.027.110.54750: ...........
010.146.027.110.49671-046.137.176.190.03306: .....commit
046.137.176.190.03306-010.146.027.110.49671: ...........
010.146.027.110.49671-046.137.176.190.03306: .....

ここで、コンソール1にて、SpiderノードのmemberテーブルをSSL仕様に作り直してみます。
SpiderテーブルにはMySQLのSSLオプションと同じ項目があるので、それを利用します。
以下のようにConnectionの部分に、ssl_ca,ssl_cert,ssl_keyの項目を追加し、それぞれに先ほど作った証明書類のパスを記載します。
mysql> DROP TABLE member;
Query OK, 0 rows affected (0.00 sec)

mysql> create table member(
id int(11) auto_increment,
name varchar(256),
primary key(id)
) engine = Spider DEFAULT CHARSET=utf8
Connection ' table "member", user "remote_user", password "remote_pass", ssl_ca "/tmp/ssl/ca-cert.pem", ssl_cert "/tmp/ssl/client-cert.pem", ssl_key "/tmp/ssl/client-key.pem" '
PARTITION BY KEY() (
    PARTITION ap_northeast_1 comment 'host "111.111.111.111", port "3306"',
    PARTITION eu_west_1 comment 'host "222.222.222.222", port "3306"'
);
Query OK, 0 rows affected (0.04 sec)

mysql> select * from member;
+----+-------------+
| id | name        |
+----+-------------+
|  1 | memorycraft |
|  3 | jiro        |
|  2 | ichiro      |
+----+-------------+
3 rows in set (3.26 sec)

ここで、コンソールを見ると、今度は暗号化されているのがわかります。
046.137.176.190.03306-010.146.027.110.51913: .... .{..5.n.?.....~...q....K..!..h18.... %C..m...3./;.K...|g..... C<XxM..
046.137.176.190.03306-010.146.027.110.51913: .... Z.?.a...qU.mex ...\...K$...
........ #5.c.AAC.l.
'.....Q3..W+.DA[Z.6.
046.137.176.190.03306-010.146.027.110.51913: .... .
......>...XQ.e;./x..!...l7........ :/........9.=........H..vAi....F
046.137.176.190.03306-010.146.027.110.51913: .... .....j..!\qr.,B-Y.e....p...]t=...... ....O....Y........Y_.+.n.9.L.TvB
046.137.176.190.03306-010.146.027.110.51913: .... ..3..'.sw..9..H....bYs.F.A....(..... /.. .Y....Yi...A..h.C....,k.w|..
010.146.027.110.51913-046.137.176.190.03306: ....p.
.)...}E8...p......o-.I.J..@%>........EW.E<.n.S..e3G.T.b....7........a......^.
046.137.176.190.03306-010.146.027.110.51913: .... -.,.eh.\g....Z0.7..PW..a..k)..........j@........._...o.^v.Qn./.G..".vf..\d.\..A..0,.0../.F..b..........+.J+l=.<....U'.3$U..RHi[V...y....N5.G.n..".?.q1.i}..A...1=~O..............vN'.>Xgj-....&W_...Y]..oL....J
010.146.027.110.49139-046.051.243.054.03306: ....0.....FOa^..K3!`.......y....9..k+.Y.e..lk.nV.g...
.t3...X....&054.03306-010.146.027.110.49139: .... .M..{.X.$Yb.\.q...^....PWy..M.S..... j..zGu..<>h.V}.#...
010.146.027.110.51913-046.137.176.190.03306: ....0$}..q.....E.......w.t..5.KW...r. eo...Ak...W..2.
046.137.176.190.03306-010.146.027.110.51913: .... .o..z...fn\S..

これで、リージョン間でも安心してSpiderが利用できます。
以上です。