備忘録のため,内容の正当性については責任を持ちません。

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 のグラフを観察してみる。

Zabbix のグラフ

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 の冗長化、リソースの監視方法などを検討したい。

参考ページ

コメント

コメントする




CAPTCHA