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.userSELECT ON mysql.dbSHOW 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_sizemax_connectionswait_timeout
(2015. 05. 07 追記)
MaxScale 1.1 がリリースされ、インストールディレクトリなどが変更されている。変更点は下記を参照のこと。
まとめ
MaxScale の RW Split Router 機能を用いて MySQL のロードバランサを構築した。これにより、アプリケーションにはほぼ変更を加えることなく、DB をスケールアウトできるようになった。
今後は、パラメータのチューニング、LB や master の冗長化、リソースの監視方法などを検討したい。
参考ページ
- MariaDB、データベース向けのプロキシソフトウェア「MaxScale」を発表 – SourceForge.JP Magazine
 - MaxScale Documentation – GitHub
 
  
  
  
  


コメント