Maxscaleで特定のノードを優先的にマスターとして取り扱うようにする

※この設定は、Maxscale 1.3.1以降で利用可能。それ以前では動作しなかったので注意。
MariaDBのLBとして利用出来るMaxscaleだが、Read/Write Spliterとして動作させた場合、通常はwsrep_local_indexの値がもっとも若い番号(基本的には0)がマスター(書き込みノード)として扱われる。

で、このマスターに障害が発生した場合、Maxscale側でマスターを自動的に切り替えて書き込みを継続して出来るようにするのだが、Galera Clusterが復旧してwsrep_local_indexの値が変わると、自動的にMasterが切り替わってしまう。

一応、マスター以外で障害が発生した場合には「disable_master_failback」というオプションを有効にすることでマスターノードが切り替わらないようにすることは出来るのだが、上のようにマスターノードに障害が発生した場合はあまり意味をなさない。Galera Clusterの原理を考えれば当たり前の話ではあるのだが、書き込みノードと読込みノードでは負荷の重さが違うので、可能であれば普段書き込みを行うノードだけスペックの高いノードを用いて、それ以外のノード(スレーブノード)のスペックを抑える事で費用等を抑えるような使い方をしたい。

そういった用途の場合は、「[Galera Monitor]」に「use_priority」を設定する事で、マスターノードの決め方をwsrep_local_indexの値から任意の順に変更出来るようだ。
以下、設定例。

●/etc/maxscale.conf(Before)

[maxscale]
threads=4 # 同時処理数
log_messages=1
log_trace=1
logdir=/var/log/maxscale

[Splitter Service]
type=service
router=readwritesplit
servers=BS-PUB-GALERA-01,BS-PUB-GALERA-02,BS-PUB-GALERA-03
max_slave_connections=100%
user=maxscale
passwd=パスワード
localhost_match_wildcard_host=true
enable_root_user=true

[Splitter Listener]
type=listener
service=Splitter Service
protocol=MySQLClient
port=3306

[Galera Monitor]
type=monitor
module=galeramon
servers=BS-PUB-GALERA-01,BS-PUB-GALERA-02,BS-PUB-GALERA-03
user=maxscale
passwd=パスワード
monitor_interval=3000

[CLI]
type=service
router=cli

[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
address=127.0.0.1
port=6603

[BS-PUB-GALERA-01]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend

[BS-PUB-GALERA-02]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend

[BS-PUB-GALERA-03]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend

●/etc/maxscale.conf(After)

[maxscale]
threads=4 # 同時処理数
log_messages=1
log_trace=1
logdir=/var/log/maxscale

[Splitter Service]
type=service
router=readwritesplit
servers=BS-PUB-GALERA-01,BS-PUB-GALERA-02,BS-PUB-GALERA-03
max_slave_connections=100%
user=maxscale
passwd=パスワード
localhost_match_wildcard_host=true
enable_root_user=true

[Splitter Listener]
type=listener
service=Splitter Service
protocol=MySQLClient
port=3306

[Galera Monitor]
type=monitor
module=galeramon
servers=BS-PUB-GALERA-01,BS-PUB-GALERA-02,BS-PUB-GALERA-03
user=maxscale
passwd=パスワード
monitor_interval=3000
use_priority=true

[CLI]
type=service
router=cli

[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
address=127.0.0.1
port=6603

[BS-PUB-GALERA-01]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend
priority=1

[BS-PUB-GALERA-02]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend
priority=2

[BS-PUB-GALERA-03]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend
priority=3

各ノードで設定している「priority」の値が小さいほど、優先的にマスターとして取り扱う。
今までMaxscaleを動作させていた環境であれば、念のためOS再起動をした方が良いだろう(自分の環境でそのまま利用してみたところ、ぱっと見は設定が終わっていたが、Queryログを見ると旧設定のまま接続を行っていたため)。
以下、実際の動作確認画面。

念のため各ノードのQueryログをみてみたが、ちゃんと指定したマスターにINSERTやDELETEがいってる事は確認出来た。
これで、特定ノードだけを書き込み性能を引き上げて対応、といった事が可能になるだろう。