Azure設計プラクティス4: MySQLレプリケーション

MySQLにはレプリケーションという同じ内容のデータベースを複数冗長に持つ設定をすることができる機能があります。

Microsoft Azureには現在(2017/5/9)MySQLのレプリケーション機能をサポートするサービスは存在しませんがLinux VirtualMachine内にMySQLを稼働させることで同じ機能を実現することができます。

今回はMySQLのレプリケーションをAzureで行っていきたいと思います。

今回の構成はこのようにします。

同一VirtualNet、同一ネットワーク・セキュリティグループ内にUbuntuOSのVMを2台、MasterとSlaveとして配置します。

レプリケーションについて

MySQLレプリケーションに関してはこちらの記事がとても詳しくまとまっているので参考にしていきます。

MySQL入門 レプリケーション編
http://qiita.com/Tocyuki/items/c224cef57493f536a941

通常、データベースを1台で運用すると1台のDBに負荷が集中してサービスのボトルネックや可用性の低下へとつながります。

そこで同じ内容のデータベースを複数作成(レプリケーション)しアクセスを分散することで1台あたりのデータベースの負荷を減らします。また、1台のDBが使えなくなったとしてももう一台のDBが継続的に稼働し続けることで高可用性を実現します。

しかしDBを複数持つと1台に書き込んだ瞬間にすべてのDBを更新しなければいけません。

そこでDB1台のみに書き込み、読み込みを許可しその他のDBには読み込みのみを許可することでDBの読み込みのトラフィックを分散することができます。上記の書き込み、読み込みを許可するDBをMaster、読み込みのみを許可するDBをSlaveと呼びます。

さらに、Masterが落ちた時はSlaveをMasterへと昇格することでサービスの継続稼働をサポートします。

インスタンスを作成する

今回の本題はMySQLの設定になるので上図の構成のインスタンスをさくっと作ってしまいます。

まずVirtualNetを作成します。アドレス空間はIPv4のクラスCとしましたが別になんでも大丈夫です。

続いて2つのVMを包むネットワーク・セキュリティグループを作成します。こちらも特に問題はありません。

MasterDB用のVirtualMachineを作成します。

OSはUbuntu 16.04LTS

VirtualNetworkとネットワーク・セキュリティグループは先程作成下ものを指定してください。

Slave用のVMを作成します。

OSはMasterと同じUbuntu 16.04LTS、VNet、セキュリティグループもMasterと同じ、先ほど作成したものとします。

VMに紐付いているネットワークインターフェースカードの設定を開き、IPアドレスの割当を静的にし、上図の構成通り、Masterに192.168.0.4、Slaveに192.168.0.5を設定します。

ネットワーク・セキュリティグループの設定を開き、SSHの22番の受信許可をします。

 

これで上図の設定をすることができました。

MySQLにレプリケーションの設定をする

今回はGTIDの使用はなしの方向でいきます。

まずMasterのVMにsshでログインします。

DB、テーブルの作成、データの挿入までを行います。

レプリケーション用のユーザーを作成します。

 

MasterDBの設定を行います。サーバーIDは任意のものを設定します。

SlaveのMysqlインストールと設定を行います。

 

続いてMasterDBでバイナリログの名前とイベント開始位置をめもります。

MasterDBのバックアップをとります。

scpでslaveへと転送します。

SlaveのDBでリストアします。

SlaveでMasterの登録を行います。

レプリケーションをスタートします。

 

レプリケーションの確認を行う

では本当にレプリケーションできたか確認をしてみましょう。

slaveのDBでitemsテーブルを表示してみます。

 

とりあえずレプリケーション登録時点ではMasterと同じ内容が入っています。

ではMasterにデータを追加してみます。

 

ではslaveで変更を確認してみます。

正しくレプリケーションできていました。

master側のステータスを見たいときは

slave側のステータスを見たいときは

でOK

 

感想

思ったよりめんどくさかったという感じはありますがAWSのようなマネージドなMySQLならボタンポチーでできるのだろうか?Azureも早くMySQLのマネージドサービスほしいですね(ClearDBではない)