スマートスタイル TECH BLOG

データベース&クラウド技術情報

mysqlfailover で自動フェイルオーバーを実現する

mysqlfailoverとは?

mysqlfailover はOracle社が提供している MySQL Utilities というツール群の中の1つです。
下記の図のようにレプリケーション構成において、マスターに障害が発生した場合、スレーブをマスターに切り替えるフェイルオーバー処理を自動で行うツールです。

検証MySQL環境構築

今回の検証ではdockerを使って マスター1台(node1)、スレーブ2台(node2, node3)、mysqlfailoverを実行するマシン(admin)の4インスタンス構成で行います。

設定ファイル

docker-compose.yml

init.sql (コンテナ作成時に実行されるSQL)

mysqlfailover の管理用ユーザーは全てのノードで必要です。また権限もSUPER, GRANT OPTION, REPLICATION SLAVE, RELOAD, DROP, CREATE, INSERT, SELECT と多岐にわたるため、rootユーザーを使ってもいいかもしれません。
レプリケーションユーザーについては、フェイルオーバー時にmysqlfailoverが必要なユーザーを作成してくれるはずでしたが、実際に試したところうまくいかなかったため、事前に全てのノードにレプリケーションユーザーを作ることにしました。

node1.cnf (my.cnf)

残りの node2.cnf, node3.cnf も server-id と report-host が異なるだけで同じです。
mysqlfailoverでは、GTIDモードのレプリケーションのみ対応しています。
また、マスターからスレーブの情報を取得するため、report-host、report-port、master-info-repository=TABLEの設定が必要になります。

repl-master.sql

repl-slave.sql

レプリケーション構築

まずはマスターのコンテナを起動します。

ログは以下のコマンドで確認します。

マスタが起動したらスレーブも起動します。

MySQL Utilities のインストール

adminコンテナにログインします。

MySQL Utilities をインストールするには、まず依存パッケージの mysql-connector-python をインストールします。

mysql-utilities をインストールします。

mysqlfailoverを実行する

admin ホストで以下のコマンドを実行してmysqlfailoverを実行します。

実行すると以下のような画面が表示され一定時間毎に更新されます。

マスターを停止してフェイルオーバーさせる

マスターノードを停止させます。

しばらくするとフェールオーバー処理が実行されます。
この時、複数スレーブの中から、マスターとの遅延が最も少ないスレーブがマスターとして選択されます。

レプリケーションユーザーに権限が付与できなかったというエラーメッセージが表示されています。(詳細は後記)

でも、フェイルオーバーは成功しました。

node3 のスレーブステータスを見ると、node2 がマスターになるよう変更されています。

デーモンモードで起動する

mysqlfailoverは –daemon オプションを付けるとデーモンモードで起動することができます。

停止する場合は下記のコマンドになります。

「ERROR: ERROR: Cannot grant replication slave to replication user.」のエラーについて

エラーを出力しているのは下記のコードの部分のようです。
https://github.com/mysql/mysql-utilities/blob/08276b2258bf9739f53406b354b21195ff69a261/mysql/utilities/common/replication.py#L897-L901

動作を確認すると、フェイルオーバー時に新しいマスターとなる node2 で以下のSQLを実行していました。

ちょっとよくわからないのが、node3 からレプリケーションを張るので、作るユーザーは repl@node3 が正しいと思われます。
また、mysqlfailoverから接続するユーザーの権限は付与しているので権限が付与できないことでエラーになっているのは理由がよくわかりません。

すでにレプリケーションユーザーが存在する場合はこの処理をスキップしてくれるようですが、ホスト名部分が % の場合は、別ユーザーとして認識しているようです。

mysqlfailover の制限事項

mysqlfailoverを使う上でいくつか制限事項があります。

  • GTIDモードのレプリケーションのみ対応しています。
  • mysqlfailover 自体の冗長化構成は取れません。
  • フェイルオーバーを行う判断はマスターの状態のみのため、mysqlfailoverとマスターサーバー間のネットワークで問題があった場合、誤認する可能性があります。

まとめ

動作として若干疑問点があるため、本番環境に導入するのをためらってしまいますが、インストールも簡単なので、GTIDのレプリケーション構成であれば気軽に使い始めることができると思います。

Return Top