Keepalivedで作るMySQLフェイルオーバーシステムサーバ屋日記2002年創業のインフラ屋さんです。サーバーの販売からWEBサービス系のクラスタシステム構築が得意です。AWS、GCP、オンプレ実績あります。2015の22日目のエントリです。Talksという勉強会で登壇してきました。その時の内容をまとめておきたいと思います。MySQLデータベースサーバに障害が起きた時、サービスを続けるには幾つかの方法があります。Utilitiesに含まれるmysqlfailoverというユーティリティーを利用する方法などです。今回、Keepalivedというソフトウェアと、MySQLの双方向レプリケーションを使って、ほぼ無停止でフェイルオーバーする構成を試してみたので、それについてまとめておきたいと思います。システム構成db1、db2という二つのサーバで、それぞれmysqldとkeepalivedを動かします。mysqldはお互いがMasterとなる双方向レプリケーションを行います。IP(VIP)を付与します。Masterということになります。双方向レプリケーションを行う場合に同時に両方のサーバへの書き込みを許可すると、データの不整合や、レプリケーションの停止を引き起こしてしまうことが知られています。今回VRRPスレーブに誤って書き込みが行われないようにスレーブにreadonly=1のフラグを立てておきます。db1のmysqldが停止ししkeepalivedのヘルスチェックに失敗した場合、db1のkeepalivedはFAULTステートに移行します。Masterステートに移行しVIPが付与され、クライアントからのアクセスはdb2に向かうようになります。db2のkeepalivedがMasterに昇格する際には、スクリプトによりreadonly=0となり書き込みが可能になるようにしています。する必要がなくシンプルであることがメリットだと考えられます。Protocol)は、もともと2台のルーターの冗長化のために作られたプロトコルで、RFCで規定されています。2の動きを説明するものです。v2では、プライオリティに基づいてMasterとBackupサーバーが決定され、MasterのみがVRRPアドバタイズパケットを予め定められた間隔、例えば1秒間隔で送信します。Masterからのアドバタイズパケットが一定期間途切れると、BackupサーバがMasterサーバに状態遷移します。ヘルスチェックKeepalivedのVRRPデーモンには、RFCで規定されたVRRPプロコルの機能に加え、おまけとしてヘルスチェック機能があります。これによりスクリプトでmysqldの死活を監視し、監視が失敗するとKeepalivedのステータスをFAULTに遷移させることができます。この場合プライオリティ=0のVRRPアドバタイズパケットが送信され、直ちにBackupサーバがMasterに昇格します。以下の設定は、keepalivedの設定ファイルの一部ですが1秒に一回ヘルスチェックスクリプト"/etc/keepalived/vrrp/mysqlchk.sh"を実行し、二回失敗したらFAULTステートにし、2回成功するとBACKUPかMASTERに戻しています。'server_id';"に応答できるかどうかを確認しています。障害時にVRRPのフェイルオーバーにかかる時間は、大まかに以下のふた通りに分けることができます。Advertパケットを送信します。これを受信したBACKUPステートにいるkeepalivedは直ちにMASTERに昇格します。フェイルオーバーにかかる時間は、FAULTステート遷移に必要な2秒程度です。元のサーバからのVRRPパケットが途絶え、BACKUPステートにいるkeepalivedがMASTERステートに昇格します。VRRPアドバタイズパケットの間隔、すなわちAdvertisement_Intervalが1秒の場合は4秒程度でフェイルオーバーが完了します。以上により、この仕組みを利用する場合、2秒または4秒程度でフェイルオーバーが完了することになり、かなり速いと言って良いのではないでしょうか。今回のシステム構成では、db1とdb2の間で双方向のレプリケーション構成にしています。この構成には落とし穴があるので、まず簡単にレプリケーションの仕組みをおさらいしておきたいと思います。次の図で、db1でコミットされたトランザクションはbinlogに記録されます。binlogに記録されたトランザクションは、ネットワークを介してdb2に送られIOスレッドによりrelaylogに書き込まれ、SQLスレッドによりテーブルスペースに順次コミッされていきます。したがって、db1で完了したコミットはすぐにSlaveのテーブルスペースに書き込まれるわけではなく、有限時間の遅延が発生します。レプリケーションのSQLスレッドは、mysqld-5.6までは1スキーマに対して1スレッドでしか実行できないので、SQLスレッドによるテーブルスペースへのコミットが追いつかずrelaylogにデータが溜まっていく場合が、時々見られます。レプリケーションが遅延している時に、VRRPのフェイルオーバーが起こると以下の図のような状態になります。relaylogに溜まっているデータはSQLスレッドにより順次コミットされていきますが、同時にクライアントからの書き込みが行われると、データに不整合が起こりレプリケーションが停止する場合があります。今回の構成ではこれを防ぐために、フェイルオーバー時にVIPがdb2に移った時、すぐに書き込み可能な状態にするのではなく、レプリケーションの遅延がなくなるのを待っててreadonly=0をセットするようにしています。まとめ今回、keepalivedのVRRP機能と、MySQLの双方向レプリケーションを組み合わせた、MySQLサーバの冗長化について試してみました。良いところおよそ4秒以内、ほぼ瞬時にフェイルオーバーする。フェイルオーバー時にレプリケーション関連のオペレーションが入らないので、シンプルである。課題マルチマスターなので不整合に気をつけるrepが遅いとなかなか昇格できない。MySQL5.7に期待。(1)人気の投稿MegaRAIDのStorCLIを試してみました。今日も相変わらず良い天気ですね。長袖のシャツでは暑く感じることも多くなってきました。本日は、LSIのRAIDカードの管理ユーティリティーツール、StorCLIについて、ご紹介したいと思います。22日目のエントリです。いう勉強会で登壇してきました。その時の内容をまとめておきたいと思います。SSDの保証とsmart情報についてこんにちは。忘れないようにメモしておきます。何のことはなくインテルの以下のページに、よくまとまってかかれています。http://www.intel.com/jp/support/...10GBaseTとSFP+DACの比較タイトルの件について調べ物をしたので、メモ。10GBaseTの規格ではエラー無くデータを転送するために、ブロックエンコーディングを行う。そのためには、ブロックサイズ分のデータを送信PHYに読み込み、エンコーディングを行ったのち、送信することが必要である。こんな、記述を発見しました。jessieをdebootstrapでインストールした時のメモこんばんは。ブログを書くのは苦手だけど、なんでもいいから書いてみようシリーズです。vpnでサーバのリモート管理を便利にデータセンタに置かれたサーバに外部からネットワーク経由でアクセスし、電源のON/OFFやBIOS設定、OSインストールなどを行うことができれば、非常に便利です。最近のサーバには、ネットワーク経由で電源をON/OFFしたり、コーンソール画面を操作するための、IPMI準拠のリモ...信用三本柱コンピューターのパーツの中で、ハードディスクが一番壊れやすい。弊社で販売したサーバのハードディスクが故障した場合に迅速に対応できるように、富山の置き薬を真似て、客先に予備のHDDを置かせて頂くサービスを開始した。良い季節になってきたので、週末が楽しみです。前回に引き続き、いくつかのサーバでベンチマークを採る機会があったので、ここに晒します。Machine(kvm)のセットアップいくつもあるサーバを、仮想化によりまとめることができれば、サーバの保管場所や電気代の節約になる。私の会社ではいくつかのサーバを仮想マシン上で運用している。kvmによる仮想環境の再構築する機会があったので、備忘録的にノウハウというか、工夫した部分について、まとめておきたいと思う。