MariaDB の MaxScale を使って、MySQL をロードバランスしてみる。
構成
ロードバランスする対象は、以下の構成を想定する。今回は MySQL の DB に AWS の RDS を使い、slave は RDS の Read Replica を用いる。MaxScale は EC2 上に構築し、OS には Amazon Linux を使う。
ホスト名 | 用途 | 構成 |
---|---|---|
dbpxy01 | MaxScale | EC2 |
dbm01 | MySQL master | RDS |
dbs01 | MySQL slave | RDS (Read Replica) |
dbs02 | MySQL slave | RDS (Read Replica) |
アプリケーションの変更を最小限にするため、MaxScale の Read-Write Splitting 機能により、クエリは参照系を各 slave に分散し、更新系を master に向けたい。
インストール
EC2 に MaxScale をインストールしていく。
まず MaxScale の yum レポジトリの設定を追加する。
# $EDITOR /etc/yum.repos.d/maxscale.repo
[maxscale]
name = maxscale
baseurl = http://downloads.mariadb.com/software/MaxScale/maxscale/RPM/rhel6
enabled=1
gpgcheck=true
RPM の公開鍵をインポートする。
# rpm --import http://downloads.mariadb.com/software/MaxScale/MaxScale-GPG-KEY.public
yum で MaxScale をインストールする。動作確認で使用するため、MySQL クライアントも入れておく。
# yum install -y maxscale mysql
インストールできたか確認する。
# rpm -qi maxscale
Name : maxscale
Version : 1.0.5
...
設定
MaxScale の設定をしていく。設定ファイルのパスは /usr/local/skysql/maxscale/etc
にある MaxScale.cnf
で、ひな形が MaxScale_template.cnf
に置かれてある。
設定は、下記の記事で紹介されているものをベースにする。
MaxScale が各バックエンドから情報を取得するために、各バックエンドにそれ用のユーザを追加する。そのユーザには、下記の権限を持たせておく。詳細は Getting Started With MariaDB MaxScale Read/Write Splitting with MySQL Replication に書かれている。
SELECT ON mysql.user
SELECT ON mysql.db
SHOW DATABASES ON *.*
REPLICATION SLAVE ON *.*
REPLICATION CLIENT ON *.*
MaxScale に接続してくるクライアントの認証には、バックエンドの認証情報が使用される。MaxScale のローカルからも接続できるようにするには、設定ファイルの [RW Split Router]
セクションに以下の設定を追加する。
localhost_match_wildcard_host=true
root ユーザも許可するには、次の記述を追加する。
enable_root_user=true
また、RW Split Router は3306番ポートで動かしたいので、同じく [RW Split Router]
セクションに下記の記述を追加する。
port=3306
デフォルトでは、slave を複数台登録しても1台にしか振らない (残りは待機) ようになっているが、これを全台に分散するには、下記の記述を追加する。
max_slave_connections=100%
起動
MaxScale を起動する。
# service maxscale start
確認
MaxScale の状態は maxadmin
コマンドで確認できる。デフォルトのパスワード は skysql
となっている。
まず list listeners
で、RW Split Router のリスナーが稼働しているか確認する。
# /usr/local/skysql/maxscale/bin/maxadmin -pskysql list listeners
Listeners.
---------------------+--------------------+-----------------+-------+--------
Service Name | Protocol Module | Address | Port | State
---------------------+--------------------+-----------------+-------+--------
RW Split Router | MySQLClient | * | 3306 | Running
CLI | maxscaled | localhost | 6603 | Running
---------------------+--------------------+-----------------+-------+--------
3306で listen できているようだ。
次に list servers
で、バックエンドの各サーバに接続できているか確認してみる。
# /usr/local/skysql/maxscale/bin/maxadmin -pskysql list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
master | dbm01.example.jp | 3306 | 102 | Master, Running
slave01 | dbs01.example.jp | 3306 | 102 | Slave, Running
slave02 | dbs02.example.jp | 3306 | 102 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
Running
となっていれば、正常に接続できている。各ホストが Master なのか Slave なのかは、自動で判別してくれるようだ。
MaxScale を入れたホストで、mysql
コマンドを使ってローカルの RW Split Router に接続できるかどうか確認する。
# mysql -h 127.0.0.1 -u <USER> -p
mysql>
検証
RW Split Router にクエリを投げ続け、あらかじめ仕込んでおいた Zabbix のグラフを観察してみる。
このように、参照系クエリは (やや偏っているが) 各 slave に分散され、更新系クエリは master に向いていることがわかる。ただし、このままクエリを投げ続けていると、Threads_connected
が際限なく増えて max_connections
に達してしまったので、パラメータのチューニングが必要そうだ。
(2015. 02. 28 追記)
バックエンドの MySQL で下記の項目をチューニングしたら改善した。
thread_cache_size
max_connections
wait_timeout
(2015. 05. 07 追記)
MaxScale 1.1 がリリースされ、インストールディレクトリなどが変更されている。変更点は下記を参照のこと。
まとめ
MaxScale の RW Split Router 機能を用いて MySQL のロードバランサを構築した。これにより、アプリケーションにはほぼ変更を加えることなく、DB をスケールアウトできるようになった。
今後は、パラメータのチューニング、LB や master の冗長化、リソースの監視方法などを検討したい。
参考ページ
- MariaDB、データベース向けのプロキシソフトウェア「MaxScale」を発表 – SourceForge.JP Magazine
- MaxScale Documentation – GitHub
コメント