MariaDB MaxScale はマスター/スレーブ構成のMySQLやMariaDBでアプリケーション側からの接続を振り分けるプロキシの機能がメインでした。
この機能を使うことでフェイルオーバーが発生してマスターサーバーが変わってもアプリケーション側からは継続してデータベースを参照することができます。
ただし、2.2以前のバージョンではこのフェイルオーバーの処理は別のツールやスクリプトを使って実現する必要がありましたが、2.2からは「MySQL Monitor」から「MariaDB Monitor」と名称が変更になり、MaxScale単体で自動フェイルオーバー、自動フェイルバックまで行えるようになりました。
今回はこの機能強化されたモニター機能を使ってMariaDBの自動フェイルオーバー、自動フェイルバックを検証してみたいと思います。
参考
構成
以下のような構成で検証しました
サーバー | IP |
---|---|
maxscale | 192.168.33.10 |
node1 | 192.168.33.11 |
node2 | 192.168.33.12 |
node3 | 192.168.33.13 |
MariaDBのマスター/スレーブレプリケーションの構築
MariaDB 10.2 のインストール
レポジトリの追加
MariaDBの公式サイトではyumレポジトリの追加方法について記載されているページが2箇所あります。どちらも結果は同じですのでお好きな方法で追加してください。
レポジトリファイルを追加する方法
1 2 3 4 5 6 7 |
$ cat <<EOF | sudo tee /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 EOF |
参考: Installing MariaDB with yum – MariaDB Knowledge Base
curl コマンドで取得する方法
1 |
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash |
オプションをつければインストールするバージョンも指定できます。
1 2 |
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=mariadb-10.2 |
参考:MariaDB Package Repository Setup and Usage – MariaDB Knowledge Base
必要なパッケージのインストール
1 |
$ sudo yum -y install MariaDB-server MariaDB-client |
レプリケーション設定
フェイルオーバー機能を使う場合、GTIDベースのレプリケーション設定が必須です。
my.cnf の設定
GTIDベースのレプリケーションを組むための設定を下記のように記載します。
server_idとlog-basenameは各ノードごとに変更してください。
1 2 3 4 5 6 7 8 |
$ sudo vi /etc/my.cnf.d/mariadb.cnf [mariadb] log-bin server_id=1 log-basename=node1 log-slave-updates gtid_strict_mode |
MariaDB の起動
1 |
$ sudo systemctl start mariadb |
rootのパスワード設定
MariaDB へログイン
1 |
$ mysql -u root |
MySQL5.7のように仮パスワードはなく、rootパス無しでログインできます。
rootのパスワード設定
1 2 |
MariaDB [(none)]> ALTER USER root@localhost IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.00 sec) |
MySQL5.7のようにデフォルトではパスワードポリシーもありません。
レプリケーションユーザーの作成
フェイルオーバーを行うので3つのノード全てで作成します。
1 2 |
MariaDB [(none)]> CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repl; |
レプリケーションの開始
レプリケーションの開始位置を揃えるためにリセットマスターを行います。
1 |
MariaDB [(none)]> RESET MASTER; |
GTIDモードでレプリケーションを設定します。(node1がマスター)
1 2 |
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.33.11', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_USE_GTID=current_pos; MariaDB [(none)]> START SLAVE; |
レプリケーションの状態を確認
1 2 3 4 5 |
MariaDB [(none)]> SHOW SLAVE STATUS\G ...省略... Using_Gtid: Current_Pos Gtid_IO_Pos: 0-1-2 ...省略... |
スレーブ(node2,node3)は書き込みができないようにread_onlyモードに設定します
1 2 |
MariaDB [(none)]> SET GLOBAL read_only=1; Query OK, 0 rows affected (0.00 sec) |
参考
MaxScaleのセットアップ
MaxScaleのインストール
MariaDBのyumレポジトリはすでに追加済みとします。
必要なパッケージのインストール
1 |
$ sudo yum -y install maxscale |
設定が完了していないため、この段階ではまだサービスを起動させません。
MaxScale用のMariaDBユーザーの作成
MariaDBへの接続ユーザーの必要な権限は下記に記載があります
MariaDB MaxScale Configuration & Usage Scenarios – MariaDB Knowledge Base
ユーザーを作成します
1 2 3 4 5 |
CREATE USER 'maxscale'@'%' IDENTIFIED BY 'maxscale'; GRANT SELECT ON mysql.user TO 'maxscale'@'%'; GRANT SELECT ON mysql.db TO 'maxscale'@'%'; GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'%'; GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%'; |
モニター機能を使う場合は以下の権限も必要です
1 |
GRANT REPLICATION CLIENT ON *.* TO 'maxscale'@'%'; |
さらにフェイルオーバーを行う場合はSUPER権限も必要です
1 |
GRANT SUPER ON *.* TO 'maxscale'@'%'; |
ただ、残念ながら手元の環境ではこれでも権限が足りないようでフェイルオーバー処理に失敗しました。
全権を付与するとうまく動作するようです
1 |
GRANT ALL ON *.* to 'maxscale'@'%'; |
参考:MariaDB Monitor – MariaDB Knowledge Base
MaxScaleの設定
/etc/maxscale.cnf の編集
デフォルトで設定がされていますが、ほとんどの場合そのままでは動作しないため、必要に応じて編集します。
1 |
$ sudo vi /etc/maxscale.cnf |
監視対象のMariaDBサーバーの設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[node1] type=server address=192.168.33.11 port=3306 protocol=MariaDBBackend [node2] type=server address=192.168.33.12 port=3306 protocol=MariaDBBackend [node3] type=server address=192.168.33.13 port=3306 protocol=MariaDBBackend |
モニターの設定
1 2 3 4 5 6 7 8 9 10 11 |
[MariaDB-Monitor] type=monitor module=mariadbmon servers=node1,node2,node3 user=maxscale passwd=maxscale monitor_interval=2000 replication_user=repl replication_password=password auto_failover=true auto_rejoin=true |
replication_user と replication_password が未設定の場合、フェイルオーバー時に組まれるレプリケーションは
user で設定された maxscale ユーザーでレプリケーションが組まれます。
サービスの設定
書き込みと読み込み別々のルーティングを行うように設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Write-Service] type=service router=readconnroute router_options=master servers=node1,node2,node3 user=maxscale passwd=maxscale [Read-Service] type=service router=readconnroute router_options=slave servers=node1,node2,node3 user=maxscale passwd=maxscale |
参考:Readconnroute – MariaDB Knowledge Base
リスナーの設定
外からのアクセスを受け付ける設定がリスナーです。書き込みと読み込みを別々のポートで受け取るようにします。
1 2 3 4 5 6 7 8 9 10 11 |
[Write-Listener] type=listener service=Write-Service protocol=MySQLClient port=4306 [Read-Listener] type=listener service=Read-Service protocol=MySQLClient port=4307 |
管理の設定
maxctrl コマンドを使う場合は設定が必要になります。
1 2 3 4 5 6 7 8 9 |
[CLI] type=service router=cli [CLI-Listener] type=listener service=CLI protocol=maxscaled socket=default |
MaxScaleの起動
サービスを起動します。
1 |
$ sudo systemctl start maxscale |
動作確認
maxctrl コマンドで状態を確認することができます。
サービスの状態
1 2 3 4 5 6 7 8 9 10 |
$ sudo maxctrl list services ┌───────────────┬───────────────┬─────────────┬───────────────────┬─────────────────────┐ │ Service │ Router │ Connections │ Total Connections │ Servers │ ├───────────────┼───────────────┼─────────────┼───────────────────┼─────────────────────┤ │ Write-Service │ readconnroute │ 1 │ 1 │ node1, node2, node3 │ ├───────────────┼───────────────┼─────────────┼───────────────────┼─────────────────────┤ │ Read-Service │ readconnroute │ 1 │ 1 │ node1, node2, node3 │ ├───────────────┼───────────────┼─────────────┼───────────────────┼─────────────────────┤ │ CLI │ cli │ 1 │ 1 │ │ └───────────────┴───────────────┴─────────────┴───────────────────┴─────────────────────┘ |
サーバーの状態
1 2 3 4 5 6 7 8 9 10 |
$ sudo maxctrl list servers ┌────────┬───────────────┬──────┬─────────────┬─────────────────┬───────┐ │ Server │ Address │ Port │ Connections │ State │ GTID │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node1 │ 192.168.33.11 │ 3306 │ 0 │ Master, Running │ 0-1-7 │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node2 │ 192.168.33.12 │ 3306 │ 0 │ Slave, Running │ 0-1-7 │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node3 │ 192.168.33.13 │ 3306 │ 0 │ Slave, Running │ 0-1-7 │ └────────┴───────────────┴──────┴─────────────┴─────────────────┴───────┘ |
自動フェイルオーバー
ここではマスター(node1)がダウンした場合の挙動を確認します。
マスターを停止
1 |
$ sudo systemctl stop mariadb |
停止直後のサーバーの状態です。Master サーバーが存在しない状態です。
1 2 3 4 5 6 7 8 9 10 |
$ sudo maxctrl list servers ┌────────┬───────────────┬──────┬─────────────┬────────────────┬───────┐ │ Server │ Address │ Port │ Connections │ State │ GTID │ ├────────┼───────────────┼──────┼─────────────┼────────────────┼───────┤ │ node1 │ 192.168.33.11 │ 3306 │ 0 │ Down │ 0-1-8 │ ├────────┼───────────────┼──────┼─────────────┼────────────────┼───────┤ │ node2 │ 192.168.33.12 │ 3306 │ 0 │ Slave, Running │ 0-1-8 │ ├────────┼───────────────┼──────┼─────────────┼────────────────┼───────┤ │ node3 │ 192.168.33.13 │ 3306 │ 0 │ Slave, Running │ 0-1-8 │ └────────┴───────────────┴──────┴─────────────┴────────────────┴───────┘ |
しばらく待つと自動フェイルオーバーが実行され、node2が新しいマスターとして昇格しレプリケーションが再構築されます。
1 2 3 4 5 6 7 8 9 10 |
$ sudo maxctrl list servers ┌────────┬───────────────┬──────┬─────────────┬─────────────────┬───────┐ │ Server │ Address │ Port │ Connections │ State │ GTID │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node1 │ 192.168.33.11 │ 3306 │ 0 │ Down │ 0-1-8 │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node2 │ 192.168.33.12 │ 3306 │ 0 │ Master, Running │ 0-2-9 │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node3 │ 192.168.33.13 │ 3306 │ 0 │ Slave, Running │ 0-2-9 │ └────────┴───────────────┴──────┴─────────────┴─────────────────┴───────┘ |
node2が新マスターに昇格すると、read_onlyモードは解除されます。
1 2 3 4 5 6 7 |
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'read_only'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | read_only | OFF | +---------------+-------+ 1 row in set (0.00 sec) |
自動フェイルバック
フェイルバックについても auto_rejoin を設定することで自動で行われます。
先ほどダウンした node1 が復旧してレプリケーションが組める状態であれば新マスターのスレーブとして組み込まれます。
1 2 3 4 5 6 7 8 9 10 |
$ sudo maxctrl list servers ┌────────┬───────────────┬──────┬─────────────┬─────────────────┬───────┐ │ Server │ Address │ Port │ Connections │ State │ GTID │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node1 │ 192.168.33.11 │ 3306 │ 0 │ Slave, Running │ 0-2-9 │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node2 │ 192.168.33.12 │ 3306 │ 0 │ Master, Running │ 0-2-9 │ ├────────┼───────────────┼──────┼─────────────┼─────────────────┼───────┤ │ node3 │ 192.168.33.13 │ 3306 │ 0 │ Slave, Running │ 0-2-9 │ └────────┴───────────────┴──────┴─────────────┴─────────────────┴───────┘ |
また、スレーブとして組み込まれた場合、read_onlyモードがONに設定されます。
1 2 3 4 5 6 7 |
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'read_only'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | read_only | ON | +---------------+-------+ 1 row in set (0.00 sec) |
まとめ
今回は MariaDB MaxScale の自動フェイルオーバーについて検証を行いました。
自動フェイルオーバーを検討する際、アプリケーション側からは昇格したマスターへの接続の切り替えを行うプロキシやロードバランサーも同時に考慮する必要がありましたが、MariaDB MaxScale を利用することでこれらをまとめて解決することができます。