Amazon EC2上で稼働するMySQLをMHAを使って冗長化する
技術本部 サービスリライアビリティグループ(SRG)の鬼海(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
なにかの役に立てば幸いです。
概要
AWS上でMySQLを運用する際は通常であればAmazon RDS/Auroraを利用すると思います。
が、もしも深遠なる理由でEC2上にMySQLをいれて運用しないといけなくなった場合、
DBの冗長性を確保した構成にしないといけません。
この記事ではMySQL-MHAを利用してEC2環境でフェイルオーバーを実現する方法を紹介します。
サーバ情報
以下の4つのEC2インスタンスが登場します。
ホスト名 | 役割 | バージョン情報 |
DB1 | DBマスター | MySQL5.7 , MHA-node 0.58 |
DB2 | DBスレーブ | MySQL5.7 , MHA-node 0.58 |
DB3 | DBスレーブ | MySQL5.7 , MHA-node 0.58 |
MHA-ADMIN | MHA Manager | MHA-manager 0.58 |
MHAのインストール
MHA Node
インストール対象:全サーバ(DB1,DB2,DB3,MHA-ADMIN]
- インストール
- 必要ディレクトリ作成
- 公開鍵の交換
- 全サーバのhostsにホスト名(EC2のタグのNameと同一にする)とEC2のIPアドレスを記述
MHA Manager
インストール対象:MHA-ADMIN
- インストール
- MHA Managerのsystemd設定
- MHA Managerのconf
- failover scriptの用意
- ルートテーブル書き換えスクリプト
上記のfailover script内で呼び出しているスクリプトです。
- 実行権限付与
AWSマネジメントコンソールでの操作
- 仮想IPの指定
AWSでの仮想VIPはVPCのCIDR範囲外のIPを指定する必要があります。
なのでまずは作ったEC2がいるVPCのCIDRを確認します。
今回は「10.91.16.0/23」と仮定します。
IP範囲は10.91.16.0 - 10.91.17.255となるので、
範囲外のIPとして以下を今回の仮想IPとします。
【10.100.0.1/32】
- ルートテーブルの編集
EC2がいるsubnetで利用されているルートテーブルを編集します。
仮想IP10.100.0.1/32への宛先を、指定したEC2のインスタンスIDにします。
フェイルオーバーするときはこのターゲットをフェイルオーバー先のEC2のIDにします。
※インスタンスIDを指定しても、勝手にそのインスタンスに紐づくENIになりますが大丈夫です。
- ENIの送信元/送信先のチェックを無効化
対象のEC2すべてのENI設定を変更していきます。
対象のENIを右クリックして「送信元/送信先チェックを変更」を押して有効化のチェックを外します。
マスターDBのDB1での操作
- 対象のEC2のマスターDBにだけ仮想IPを付与
- MHA用のMySQLユーザ作成
動作確認
MHA-ADMINのサーバでチェックスクリプトを実行して問題なければ完了です。
問題なければMHA managerのプロセスを起動しましょう。
まとめ
RDS/Auroraが利用できなくても最低限冗長性を担保したMySQLの構成を組むことができます。
このあたりのことを考えなくても利用できるマネージドサービスは本当に偉大ですね。
終わりに
SRG では一緒に働く仲間を募集しています。
ご興味ありましたらぜひこちらからご連絡ください。