Web App、マネージドMySQL、Azure DevOpsで実現するAzure PaaSのLAMP
オンプレLAMP環境を低コストで高可用なAzure PaaSへ移行しよう!
2018年12月19日 08時00分更新
1. Azure Database for MySQLなら高可用MySQLサーバーが5分で完成
まず、Azure Database for MySQLの作成方法とチューニングのポイントについて、Azure TSPの廣瀬一海氏がデモで説明した。
AzureがPaaSで提供しているリレーショナルDBには、MicrosoftプロダクトのAzure SQL Databaseのほかに、今回紹介するオープンソースのMySQLベースのAzure Database for MySQL、同じくオープンソースのPostgreSQL、MariaDBをベースにしたAzure Database for PostgreSQL、Azure Database for MariaDBがある。MySQLとPostgreSQLは2018年3月にGA(一般提供)、MariaDBは12月にGAになり、現在、東日本/西日本リージョンを含む世界32カ所のAzureリージョンで利用可能になっている。
これらAzureのPaaSのリレーショナルDBは、1つのプライマリ、2つのセカンダリの3台構成で1つの論理DBを成している。プライマリに障害が発生した際は自動的にどちらかのセカンダリにフェイルオーバーし、新たなセカンダリが自動で立ち上がる。この基盤の仕組みにより、Azure SQL Database、Azure Database for MySQL/PostgreSQLはSLA 99.99%の可用性を保証している。自動バックアップ、35日までのスナップショットの自動取得などの機能を備えるほか、mysqldumpコマンドやpg_dumpコマンドで任意のバックアップを取ることもの可能だ。「PaaSのMySQLを使うからといって、新しいツールやフレームワークを学び直す必要はありません。これまでの開発言語をそのまま使えます」(日本マイクロソフト Azure TSP 廣瀬一海氏)。
1-1.MySQLのDBサーバー作成とDB性能の設定
作成方法は、まずAzureポータルのAzure Marketplaceで「Azure Database for MySQL」を検索して「作成」ボタンを押すと(図1-1)、MySQL Severの作成画面が出るので(図1-2)、Server name、サブスクリプション、リソースグループ、管理者のユーザー名などの必要事項を入力して「作成」ボタンをクリックする。
次のPricing Tierのページ(図1-3)では、DBのコア数、メモリサイズ、ストレージサイズといったDBの性能を設定していく。
AzureのMySQLには、用途に応じて「Basic」「General Purpose(汎用)」「Memory Optimized(メモリ最適化)」の価格レベルが用意されている。General PurposeはCPUメイン、Memory Optimizedはメモリがふんだんに搭載されている価格レベル。「MySQLの標準DBエンジンであるInnoDBはメモリを多く消費する傾向があるので、Memory Optimizedを選択するとパフォーマンスが出やすくなります」(廣瀬氏)。
価格レベルを選んだら、CPUの種類を選択する。AzureではMySQL向けのプロセッサとして、Intel E5-2673 v3(Haswell)2.4 GHzベースの「Gen 4」と、Intel E5-2673 v4(Broadwell)2.3 GHzベースの「Gen 5」の2つを用意している。BasicレベルではGen 4またはGen 5で最大2 vCore(仮想コア)、General PurposeレベルではGen 4またはGen 5で最大32 vCore、Memory OptimizedレベルはGen 5のみで最大32 vCoreをサポートする。vCoreあたりのメモリは、General PurposeレベルはBasicレベルの2倍、Memory OptimizedレベルはBasicレベルの4倍になる。
次に、vCore数、ストレージサイズ、バックアップ期間(デフォルトでは7日間)をスライダーで設定。「OK」をクリックするとデプロイメントが走り、MySQLのDBサーバーが作成される。この時点で、裏では3台のDBがフェイルオーバーしながら動いている。
1-2.ファイアウォールの設定
作成されたDBサーバーは、デフォルトの状態ではファイアウォールが設定されているのでどこからもアクセスできない。必ず、「Connection Security」の設定ページで、DBにアクセスする端末のIPアドレスを指定して、ファイアウォールで接続を許可する必要がある。なお、App Serviceや仮想マシンなど他のAzureサービスからのアクセス可否はConnection Securityページにある「ON/OFF」ボタンで設定できる。
それ以外に、ここで作成したDBサーバーは、AzureのIaaSで作成した仮想ネットワーク(VNET)の中だけで使う構成をとることもできる。Connection SecurityページでVNETを指定すれば、VNETからのみつながるMySQLになる。
1-3.MySQLのパラメーターチューニング
「MySQLは、オンプレミスでもクラウドでもあまりゴリゴリとチューニングする必要はありませんが、多少チューニングしたほうがよいところもあります。AzureのPaaSで作成したMySQLも、手動でパラメーターを調整できるようになっています」と廣瀬氏。Azure Database for MySQLで作成したDBサーバーのチューニングは「Server parameters」設定ページで行う。
Azure Database for MySQLには、プランや立ち上げたインスタンスによってオートチューニングされるパラメーターと、手動で設定できるパラメーターがある。廣瀬氏は、Server parameters設定ページから手動で設定できるパラメーターのうち、いくつかの重要なチューニングポイントを挙げて解説した。
まず、MySQLの文字コードを設定する「character_set_server」パラメーター。MySQLチューニングの定石だが、Azure Database for MySQLでもデフォルト「LATIN1」なので、「UTF8」に変更しないと日本語を受け付けずに文字化けしてしまう。
「Innodb_file_per_table」もチューニングポイントだ。「InnoDBはMySQLのテーブルを全部たばねて1個のDBに対して巨大なInnoDBファイルを作ります。例えば、頻繁に書き込みがあるテーブルとほとんどアクセスがないテーブルが混在するDBでは、テーブル単位でInnoDBファイルを作る設定にすることでパフォーマンスが大幅に改善します」(廣瀬氏)。Innodb_file_per_tableを「ON」に切り替えることで(デフォルトはOFF)、InnoDBがテーブル単位で作成される設定になる。
DBの読み込み性能、書き込み性能を決める「Innodb_read_io_threads」「Innodb_write_io_threads」も、チューニングすることで性能を高めることができる。Azure Database for MySQLではそれぞれデフォルト値は4(4CPUスレッドを同時に使って読み書きする)になっている。
1-4.SQLインジェクション対策機能を導入
セキュリティ機能が標準で備わっているのもAzure Database for MySQLの特徴だ。「Advanced Thread Protection」(現在はプレビュー提供中)を「ON」にすると、作成したDBをSQLインジェクションから保護してくれる。「オンプレミスやIaaSで運用するMySQLでSQLインジェクション対策をしようとすると、高額のソフトウェアを追加購入しなければいけません」(廣瀬氏)。
* * *
ここまでのデモで、MySQLのDBサーバーを立ち上げ、ファイアウォールの設定、パラメーターチューニング、セキュリティ機能の導入まで完了した。要した時間は5分程度だ。
作成したMySQLは、Azure Cloud Shellからコマンドでアクセスして操作することもできるし、これまでと同じようにMySQL WorkbenchのようなGUIから操作することも可能だ。
オンプレミスのMySQLデータベースをAzure SQL Database for MySQLへ移行する際は、MySQL WorkbenchやCLIからmysqldumpコマンド、mysqlコマンドを用いてオフラインで移行する事も可能だが、「Azure Database Migration Service」を利用すると、データベースの複製、増分同期などが自動で行われ、最小限のダウンタイムでより簡単に移行できる。
「今お使いのMySQLと同じ操作感で利用できるDBサーバーが、AzureのPaaSでは5分で完成します。可用性設計、ファイアウォール、バックアップ、セキュリティの機能が標準で備わっている上に、IaaSやオンプレミスでMySQLを構築するより安価です。ぜひ使ってみてください」(廣瀬氏)。