Amazon EC2上で稼働するMySQLをMHAを使って冗長化する

技術本部 サービスリライアビリティグループ(SRG)の鬼海(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、SRG 内にある DBWG(DBワーキンググループ)が全社内向けに提供しているデータベースに関する資料を公開します。
なにかの役に立てば幸いです。
 

概要


AWS上でMySQLを運用する際は通常であればAmazon RDS/Auroraを利用すると思います。
が、もしも深遠なる理由でEC2上にMySQLをいれて運用しないといけなくなった場合、
DBの冗長性を確保した構成にしないといけません。
この記事ではMySQL-MHAを利用してEC2環境でフェイルオーバーを実現する方法を紹介します。
 

サーバ情報


以下の4つのEC2インスタンスが登場します。
ホスト名役割バージョン情報
DB1DBマスターMySQL5.7 , MHA-node 0.58
DB2DBスレーブMySQL5.7 , MHA-node 0.58
DB3DBスレーブMySQL5.7 , MHA-node 0.58
MHA-ADMINMHA ManagerMHA-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を右クリックして「送信元/送信先チェックを変更」を押して有効化のチェックを外します。
ENIのチェック無効
ENIのチェック無効
 

マスターDBのDB1での操作


  • 対象のEC2のマスターDBにだけ仮想IPを付与
  • MHA用のMySQLユーザ作成

動作確認


MHA-ADMINのサーバでチェックスクリプトを実行して問題なければ完了です。
 
問題なければMHA managerのプロセスを起動しましょう。
 

まとめ


RDS/Auroraが利用できなくても最低限冗長性を担保したMySQLの構成を組むことができます。
このあたりのことを考えなくても利用できるマネージドサービスは本当に偉大ですね。
 

終わりに


SRG では一緒に働く仲間を募集しています。 ご興味ありましたらぜひこちらからご連絡ください。
 
このエントリーをはてなブックマークに追加