Maxscaleのチュートリアルを読んでいたら、Corosync & Pacemakerを用いてのMaxscaleのHA化についてあったので、試してみる事にした。
今回利用するOSはCentOS 7を用い、Maxscaleはインストール済、SELinuxとFirewalldは無効化済とする。

なお、同じHAのカテゴリとしてLsyncdを用いる手法も紹介されていたが、正直これは単にmaxscale.confを自動同期させるだけでそこまで役に立つものでもないので無視する。

1.Corosync & Pacemakerのインストール

まずは、HA化に必要となるCorosync + Pacemakerをインストールする。

yum -y install pcs fence-agents-all

これで、パッケージのインストールが出来た。

2.クラスタ設定

さて、インストールが終わったら次はCorosync & Pacemakerの設定を行う。
まずは各ノードでホスト名での通信が行えるよう、hostsでIPアドレスとホスト名の紐付けを行う。

この際、自分自身には「current-node」という名称も付与する。
例えば、ホスト名が「BS-PUB-GFRONT-01」\~「BS-PUB-GFRONT-03」まであったと仮定すると、hostsは以下のようになる。

例:hosts(BS-PUB-GFRONT-01)

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
XXX.XXX.XXX.35 BS-PUB-GFRONT-01 current-node
XXX.XXX.XXX.36 BS-PUB-GFRONT-02
XXX.XXX.XXX.37 BS-PUB-GFRONT-03

例:hosts(BS-PUB-GFRONT-03)

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
XXX.XXX.XXX.35 BS-PUB-GFRONT-01
XXX.XXX.XXX.36 BS-PUB-GFRONT-02
XXX.XXX.XXX.37 BS-PUB-GFRONT-03 current-node

hostsの設定が終わったら、各ノードでcorosyncで用いられるユーザ「hacluster」のパスワード設定を行う。

passwd hacluster

以下のコマンドを実行し、corosync及びpcsdを起動させる。

systemctl start corosync
systemctl start pcsd
systemctl enable pcsd

サービス起動後、以下のコマンドでcorosyncのノード認証を実施し、クラスタを作成・起動する。

pcs cluster auth ノード1 ノード2 ...-u hacluster -p パスワード --force # ノード認証
pcs cluster setup --name maxscale_cluster ノード1 ノード2 ... --force --transport udpu --mcastport0 5405 -- # クラスタ作成
pcs cluster start --all
[root@BS-PUB-GFRONT-01 ~]# pcs cluster auth BS-PUB-GFRONT-01 BS-PUB-GFRONT-02 BS-PUB-GFRONT-03 -u hacluster -p Password --force
BS-PUB-GFRONT-01: Authorized
BS-PUB-GFRONT-03: Authorized
BS-PUB-GFRONT-02: Authorized
[root@BS-PUB-GFRONT-01 ~]# pcs cluster setup --name maxscale_cluster BS-PUB-GFRONT-01 BS-PUB-GFRONT-02 BS-PUB-GFRONT-03 --force --transport udpu --mcastport0 5405
Shutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop  pacemaker.service
Redirecting to /bin/systemctl stop  corosync.service
Killing any remaining services...
Removing all cluster configuration files...
BS-PUB-GFRONT-01: Succeeded
BS-PUB-GFRONT-02: Succeeded
BS-PUB-GFRONT-03: Succeeded
Synchronizing pcsd certificates on nodes BS-PUB-GFRONT-01, BS-PUB-GFRONT-02, BS-PUB-GFRONT-03...
BS-PUB-GFRONT-01: Success
BS-PUB-GFRONT-03: Success
BS-PUB-GFRONT-02: Success

Restaring pcsd on the nodes in order to reload the certificates...
BS-PUB-GFRONT-01: Success
BS-PUB-GFRONT-03: Success
BS-PUB-GFRONT-02: Success
[root@BS-PUB-GFRONT-01 ~]# pcs cluster start --all
BS-PUB-GFRONT-03: Starting Cluster...
BS-PUB-GFRONT-02: Starting Cluster...
BS-PUB-GFRONT-01: Starting Cluster...

クラスタ起動後、しばらくしてから以下のコマンドを実行し、ステータス確認を行う。
(起動直後の場合、クラスタ間でのステータスが更新されておらず、Offlineになっていたりする)

pcs status
[root@BS-PUB-GFRONT-01 ~]# pcs status
Cluster name: maxscale_cluster
WARNING: no stonith devices and stonith-enabled is not false
Last updated: Tue Feb 16 07:13:17 2016          Last change: Tue Feb 16 07:10:34 2016 by root via cibadmin on BS-PUB-GFRONT-02
Stack: corosync
Current DC: BS-PUB-GFRONT-02 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
3 nodes and 0 resources configured

Online: [ BS-PUB-GFRONT-01 BS-PUB-GFRONT-02 BS-PUB-GFRONT-03 ]

Full list of resources:

PCSD Status:
  BS-PUB-GFRONT-01: Online
  BS-PUB-GFRONT-02: Online
  BS-PUB-GFRONT-03: Online

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

クラスタが正常に構成されたことを確認したら、以下のコマンドを実行し設定を追加する。

crm configure property 'stonith-enabled'='false'
crm configure property 'no-quorum-policy'='ignore'
crm configure property 'placement-strategy'='balanced'
crm configure property 'cluster-infrastructure'='classic openais (with plugin)'
crm configure property 'expected-quorum-votes'='3'
[root@BS-PUB-GFRONT-01 ~]# crm configure property 'stonith-enabled'='false'
[root@BS-PUB-GFRONT-01 ~]# crm configure property 'no-quorum-policy'='ignore'
[root@BS-PUB-GFRONT-01 ~]# crm configure property 'placement-strategy'='balanced'
[root@BS-PUB-GFRONT-01 ~]# crm configure property 'cluster-infrastructure'='classic openais (with plugin)'
[root@BS-PUB-GFRONT-01 ~]# crm configure property 'expected-quorum-votes'='3'
[root@BS-PUB-GFRONT-01 ~]# crm configure show
node 1: BS-PUB-GFRONT-01
node 2: BS-PUB-GFRONT-02
node 3: BS-PUB-GFRONT-03
property cib-bootstrap-options: \
        have-watchdog=false \
        dc-version=1.1.13-10.el7-44eb2dd \
        cluster-infrastructure="classic openais (with plugin)" \
        cluster-name=maxscale_cluster \
        stonith-enabled=false \
        no-quorum-policy=ignore \
        placement-strategy=balanced \
        expected-quorum-votes=3

次に、以下のコマンドでmaxscaleのヘルスチェック関連の設定を追加する。

crm configure primitive MaxScale lsb:maxscale \
op monitor interval="10s" timeout="15s" \
op start interval="0" timeout="15s" \
op stop interval="0" timeout="30s"
[root@BS-PUB-GFRONT-01 ~]# crm configure primitive MaxScale lsb:maxscale \
> op monitor interval="10s" timeout="15s" \
> op start interval="0" timeout="15s" \
> op stop interval="0" timeout="30s"
[root@BS-PUB-GFRONT-01 ~]# crm configure show
node 1: BS-PUB-GFRONT-01
node 2: BS-PUB-GFRONT-02
node 3: BS-PUB-GFRONT-03
primitive MaxScale lsb:maxscale \
        op monitor interval=10s timeout=15s \
        op start interval=0 timeout=15s \
        op stop interval=0 timeout=30s
property cib-bootstrap-options: \
        have-watchdog=false \
        dc-version=1.1.13-10.el7-44eb2dd \
        cluster-infrastructure="classic openais (with plugin)" \
        cluster-name=maxscale_cluster \
        stonith-enabled=false \
        no-quorum-policy=ignore \
        placement-strategy=balanced \
        expected-quorum-votes=3

設定追加後、再度ステータスを確認する。

[root@BS-PUB-GFRONT-02 ~]# crm status
Last updated: Tue Feb 16 07:22:20 2016          Last change: Tue Feb 16 07:19:44 2016 by root via cibadmin on BS-PUB-GFRONT-01
Stack: classic openais (with plugin)
Current DC: BS-PUB-GFRONT-02 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
3 nodes and 1 resource configured, 3 expected votes

Online: [ BS-PUB-GFRONT-01 BS-PUB-GFRONT-02 BS-PUB-GFRONT-03 ]

Full list of resources:

 MaxScale       (lsb:maxscale): Started BS-PUB-GFRONT-03

これで、クラスタの基本的な設定が完了した。

3.仮想IPの設定

次に、maxscaleクラスタで仮想IPを設定することで、共通のIPアドレスを指定しておけばノード障害が発生してもフェイルオーバーが発生するだけで済むようにする。
クラスタ構成ノードで、以下のコマンドを実行する。

crm configure primitive maxscale_vip ocf:heartbeat:IPaddr2 params ip=IPアドレス cidr_netmask=サブネット op monitor interval=10s
crm configure group maxscale_service maxscale_vip MaxScale

上記コマンド実行後、ステータスを確認すると以下のようになっている。

[root@BS-PUB-GFRONT-03 ~]# crm configure primitive maxscale_vip ocf:heartbeat:IPaddr2 params ip=172.28.0.230 cidr_netmask=24 op monitor interval=10s
[root@BS-PUB-GFRONT-03 ~]# crm configure group maxscale_service maxscale_vip MaxScale
[root@BS-PUB-GFRONT-03 ~]# crm status
Last updated: Tue Feb 16 08:29:12 2016          Last change: Tue Feb 16 08:29:10 2016 by root via cibadmin on BS-PUB-GFRONT-03
Stack: classic openais (with plugin)
Current DC: BS-PUB-GFRONT-02 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
3 nodes and 2 resources configured, 3 expected votes

Online: [ BS-PUB-GFRONT-01 BS-PUB-GFRONT-02 BS-PUB-GFRONT-03 ]

Full list of resources:

 Resource Group: maxscale_service
     maxscale_vip       (ocf::heartbeat:IPaddr2):       Started BS-PUB-GFRONT-01
     MaxScale   (lsb:maxscale): Started BS-PUB-GFRONT-01

これで、クラスタで共通で利用される仮想IPの設定ができた。
なお、この仮想IPからmaxscaleに接続するにあたり、以下の設定を書き換える必要があるので注意。

[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
#address=localhost
address=仮想IPアドレス
port=6603

これで、仮想IPアドレス(現時点だと、BS-PUB-GFRONT-01)から後ろのGaleraClusterに接続出来るようになった

[root@BS-PUB-GFRONT-02 ~]# mysql -u test -ppassword -h 172.28.0.230
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 20943
Server version: 5.5.42-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

なお、フェイルオーバーした際は自動的に元のマスターノードに戻らないので注意。
何かメンテナンスがある際は、ちゃんと直前にどこかマスターになっているのか確認すること。

[root@BS-PUB-GFRONT-02 ~]# crm status
Last updated: Tue Feb 16 08:46:51 2016          Last change: Tue Feb 16 08:46:24 2016 by hacluster via crmd on BS-PUB-GFRONT-03
Stack: corosync
Current DC: BS-PUB-GFRONT-03 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
3 nodes and 2 resources configured

Online: [ BS-PUB-GFRONT-01 BS-PUB-GFRONT-02 BS-PUB-GFRONT-03 ]

Full list of resources:

 Resource Group: maxscale_service
     maxscale_vip       (ocf::heartbeat:IPaddr2):       Started BS-PUB-GFRONT-01
     MaxScale   (lsb:maxscale): Started BS-PUB-GFRONT-01

[root@BS-PUB-GFRONT-02 ~]# pcs cluster stop BS-PUB-GFRONT-01
BS-PUB-GFRONT-01: Stopping Cluster (pacemaker)...
BS-PUB-GFRONT-01: Stopping Cluster (corosync)...
[root@BS-PUB-GFRONT-02 ~]# crm status
Last updated: Tue Feb 16 08:47:02 2016          Last change: Tue Feb 16 08:46:24 2016 by hacluster via crmd on BS-PUB-GFRONT-03
Stack: corosync
Current DC: BS-PUB-GFRONT-03 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
3 nodes and 2 resources configured

Online: [ BS-PUB-GFRONT-02 BS-PUB-GFRONT-03 ]
OFFLINE: [ BS-PUB-GFRONT-01 ]

Full list of resources:

 Resource Group: maxscale_service
     maxscale_vip       (ocf::heartbeat:IPaddr2):       Started BS-PUB-GFRONT-02
     MaxScale   (lsb:maxscale): Started BS-PUB-GFRONT-02

[root@BS-PUB-GFRONT-02 ~]# pcs cluster start BS-PUB-GFRONT-01
BS-PUB-GFRONT-01: Starting Cluster...
[root@BS-PUB-GFRONT-02 ~]# crm status
Last updated: Tue Feb 16 08:47:48 2016          Last change: Tue Feb 16 08:46:07 2016 by hacluster via crmd on BS-PUB-GFRONT-03
Stack: corosync
Current DC: BS-PUB-GFRONT-03 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
3 nodes and 2 resources configured

Online: [ BS-PUB-GFRONT-01 BS-PUB-GFRONT-02 BS-PUB-GFRONT-03 ]

Full list of resources:

 Resource Group: maxscale_service
     maxscale_vip       (ocf::heartbeat:IPaddr2):       Started BS-PUB-GFRONT-02
     MaxScale   (lsb:maxscale): Started BS-PUB-GFRONT-02

これで、無事にMaxscaleの冗長化設定ができた。
動作としては、Active-Stanbyとなってしまうのだが、LB専用VMとしてMaxscaleを構築するのであれば、冗長化の一つの方法になるだろう。