2015年12月14日月曜日

MySQL Routerつらくない(Dockerで誰でも試せるMySQL Fabric Cache Plugin編)

この記事は MySQL Fabric&Routerつらくない Advent Calendar 2015 の14日目のエントリーです。

前回の記事で無事にMySQL Fabric Cache Pluginでマスター/スレーブの構成をMySQL Fabricに管理させつつ、コネクションはMySQL Routerでハンドルさせることができたので、みなさんそろそろ

「MySQL Router つらくない!」
「MySQL Fabirc つらいけど 試してみたい!」

とテンションが上がっているところだと思います。
お願いします、上げてください。

日々の覚書: MySQL Routerつらくない(MySQL Fabricと組み合わせて使ってみる編)


という訳で、このアドベントカレンダーのために用意した一連のDockerイメージ群を紹介します。



さてじゃあ使い方。真っ新なAmazon Linux AMI 2015.09.1のEC2のインスタンスを20GBのEBSで起動したところからなので、他の環境でもほぼ応用が利くはず。
まずはMySQL Fabricサーバー(mysqlfabricのデーモン(いやフォアグラウンドだけど)とバッキングストアのmysqld)を起動。

# yum install docker
# service docker start
# docker run -d --hostname=mysql-fabric --name mysql_fabric_server yoku0825/mysql_fabric_server
..
# docker inspect -f "{{.Config.Hostname}}, {{.NetworkSettings.IPAddress}}" mysql_fabric_server
mysql-fabric, 172.17.0.1

次にMySQL Fabricにすぐ組み込める状態になっているMySQLサーバーを3台起動。


# docker run -d --hostname=mysql-server1 --name mysql_server1 yoku0825/mysql_fabric_aware
..
# docker run -d --hostname=mysql-server2 --name mysql_server2 yoku0825/mysql_fabric_aware
..
# docker run -d --hostname=mysql-server3 --name mysql_server3 yoku0825/mysql_fabric_aware
..
# docker inspect -f "{{.Config.Hostname}}, {{.NetworkSettings.IPAddress}}" $(docker ps | awk '/mysql_fabric_aware/{print $1}')
mysql-server3, 172.17.0.4
mysql-server2, 172.17.0.3
mysql-server1, 172.17.0.2

コマンドラインクライアントとしてのmysqlfabricも`docker run`で起動。MySQL Utilitiesをインストールしなくても試せる! つらくない!
`mysqlfabric group create`でmy_new_fabricというグループを作成。


# docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group create my_new_fabric
..
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                                uuid finished success result
------------------------------------ -------- ------- ------
69700c6c-bbd2-4371-9940-1c4e1e0c259a        1       1      1

state success          when                                                   description
----- ------- ------------- -------------------------------------------------------------
    3       2   1.45008e+09 Triggered by <mysql.fabric.events.Event object at 0x25af890>.
    4       2   1.45008e+09                             Executing action (_create_group).
    5       2   1.45008e+09                              Executed action (_create_group).


MySQL Fabricサーバーにグループが作成できたら、Fabric-awareなMySQL(MySQL Fabricで管理される側のサーバーをそんな風に呼ぶらしい。正しくないかも知れない)を1つずつ3つ追加。


# docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group lookup_groups
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

     group_id description failure_detector master_uuid
------------- ----------- ---------------- -----------
my_new_fabric        None                0        None


# docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group add my_new_fabric 172.17.0.2
..
# docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group add my_new_fabric 172.17.0.3
..
# docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group add my_new_fabric 172.17.0.4
..

# docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group lookup_servers my_new_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                         server_uuid         address    status      mode weight
------------------------------------ --------------- --------- --------- ------
14f81155-a23b-11e5-aa7e-0242ac110002 172.17.0.2:3306 SECONDARY READ_ONLY    1.0
15548339-a23b-11e5-aa35-0242ac110003 172.17.0.3:3306 SECONDARY READ_ONLY    1.0
1591026a-a23b-11e5-aa28-0242ac110004 172.17.0.4:3306 SECONDARY READ_ONLY    1.0

登録できたら、1台をマスターに昇格させる。`mysqlfabric group promote`してやると、1台をマスターに、それ以外をそのマスターのスレーブにするように構成してくれるので、


# docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group promote my_new_fabric
..

docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group lookup_servers my_new_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                         server_uuid         address    status       mode weight
------------------------------------ --------------- --------- ---------- ------
14f81155-a23b-11e5-aa7e-0242ac110002 172.17.0.2:3306 SECONDARY  READ_ONLY    1.0
15548339-a23b-11e5-aa35-0242ac110003 172.17.0.3:3306 SECONDARY  READ_ONLY    1.0
1591026a-a23b-11e5-aa28-0242ac110004 172.17.0.4:3306   PRIMARY READ_WRITE    1.0

はい、これでMySQL Fabric側完成。


# cat mysqlrouter.ini
[fabric_cache:docker_demo]
address     = 172.17.0.1
user        = admin

[routing:master]
bind_address= 0.0.0.0:13306
mode        = read-write
destinations= fabric+cache://docker_demo/group/my_new_fabric

[routing:slave]
bind_address= 0.0.0.0:23306
mode        = read-only
destinations= fabric+cache://docker_demo/group/my_new_fabric

mysqlrouter.iniはルーティング部分がDockerイメージに組み込まれてない(docker build時に指定すると固定になっちゃう && パラメーターではなくiniファイルで指定しないといけないぽい)ので、iniファイルを適当に作ってやって
日々の覚書: MySQL Routerつらくない(MySQL Fabricと組み合わせて使ってみる編)


# docker run -d -v /root/mysqlrouter.ini:/tmp/setup/router.ini yoku0825/mysql_router
..

# docker inspect -f "{{.Config.Hostname}}, {{.NetworkSettings.IPAddress}}" mysql-router
mysql-router, 172.17.0.17

あとはMySQL Routerの指定したポート(↑の場合は13306がマスター用のread-writeモード、23306がスレーブ用のread-onlyモード)を叩いてやれば


# mysql -h 172.17.0.17 -P 13306 -u ap

mysql> SELECT @@hostname;
+---------------+
| @@hostname    |
+---------------+
| mysql-server3 |
+---------------+
1 row in set (0.00 sec)

# docker run --rm yoku0825/mysql_fabric_command --param=protocol.xmlrpc.address=172.17.0.1:32274 group lookup_servers my_new_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                         server_uuid         address    status       mode weight
------------------------------------ --------------- --------- ---------- ------
14f81155-a23b-11e5-aa7e-0242ac110002 172.17.0.2:3306 SECONDARY  READ_ONLY    1.0
15548339-a23b-11e5-aa35-0242ac110003 172.17.0.3:3306 SECONDARY  READ_ONLY    1.0
1591026a-a23b-11e5-aa28-0242ac110004 172.17.0.4:3306   PRIMARY READ_WRITE    1.0

ちゃんと一致してますね! (mysql-server$nとIPアドレスの末尾1バイトが微妙にズレてるので見にくかった。。)

これで誰でもMySQL Routerで遊べる! つらくない!


このへんとかも合わせてご利用ください。 https://github.com/yoku0825/docker_for_mysqlfabric/blob/master/start_3container_fabric.sh

1 件のコメント :