今回は、データベースとして広く普及しているMySQLを例に、Amazon EC2上でMySQLのレプリケーション機能を用いてMaster-Slave構成を作り、そのSlaveを実に手軽に追加できるようにするための手順について説明します。
MySQLのレプリケーション機能でWakameは本領を発揮する
一般的に、MySQLのレプリケーションとは、Masterと呼ばれるデータの原本1つを、可能な限り同期複製させることが出来る機能のことを言います。複製されたものはSlaveと呼ばれ、1つのMasterに対して複数接続することが可能です。
より複雑な構成も取れるのですが、基本的なトポロジはスター型となります。レコードの読み出しクエリであれば、各Slaveへ分散させて性能を向上させることが出来ます。そのため、サイトのトラフィックが増加して来た時、まず最初に行われる対策として良く利用される機能でもあります。
これらの作業に必要な手順は、非常に複雑なので、MySQLのプロダクトをうまくコントロールする仕組みが不可欠です。早速Wakameでこの手順を自動化してみることにしましょう。
基本原理を理解する
まず、基本原理を理解するために、Amazon EC2とAmazon EBSによるMySQLレプリケーション設定方法を示しておきます。Wakameで簡単に実行できるようにする方法については、後ほど詳しく見ていくことにします。
Amazon EC2で試せるスクリプトの概要と準備
参考のために、MySQLとAmazon EBSを連動させた動作確認目的でシェルスクリプトを作成しました。ここで作成されたシェルスクリプトを使うだけでもMySQL Slave追加作業が簡略化されます。
スクリプトの動作処理は、大きく分けて3つです。
- MySQL Master用datadirとしAmazon EBS Volumeを生成
- 1で生成したAmazon EBS VolumeからAmazon EBS Snapshotを生成
- 2で生成したAmazon EBS SnapshotからMySQL Slave用datadirとしてAmazon EBS Volumeを生成
スクリプトの動作解説
スクリプトの動作前提条件は下記の通りです。
- Amazon EC2インスタンスが起動している事
- 起動しているAmazon EC2インスタンスにAmazon EC2 API Toolsの環境が整っている事
→ ツールの整備方法を参考に環境設定してください。
また、スクリプトとして全部で6つのファイルが登場します。
- _wakame-common.sh
- wakame-ebs-mysql-master-create-volume.sh
- wakame-ebs-mysql-master-init.sh
- wakame-ebs-mysql-master-add-repl-user.sh
- wakame-ebs-mysql-master-make-snapshot.sh
- wakame-ebs-mysql-slave-restore.sh
各スクリプトの概要は、以下の通りです。
なお、Amazon EC2上でMySQLレプリケーション構成を構築するには、以下の手順が必要になりますので、詳細を知りたい方はぜひスクリプトの流れと合わせて追いかけて見てください。
- _wakame-common.sh
- 全スクリプトからincludeされるファイル
- 共通設定項目
- wakame-ebs-mysql-master-create-volume.h
- Amazon EBS Volumeを新規生成
- 生成したAmazon EBS Volumeをデバイス名指定でattach
- Amazon EBS Volume上にファイルシステムを生成
- Amazon EBS VolumeをMySQL Master用datadirとしてマウント
- wakame-ebs-mysql-master-init.sh
- MySQL Master用datadirのオーナーをmysqlへ変更
- MySQL Master用datadirを初期化
- wakame-ebs-mysql-master-add-repl-user.sh
- レプリケーション用MySQLアカウントをMySQL Masterに作成
- wakame-ebs-mysql-master-make-snapshot.sh
- attach済みAmazon EBS Volumeのvolume-idを取得
- MySQL Masterに対し"FLUSH TABLES WITH READ LOCK"でデータが更新されないようにテーブルをロック
- MySQL Masterのポジション情報を取得
- MySQL Slave用にmaster.infoを生成
- MySQL Master用datadirからAmazon EBS Snapshotを生成
- Amazon EBS Snapshot生成後、"UNLOCK TABLES;"でMySQL Masterのテーブルロックを解除
- wakame-ebs-mysql-slave-restore.sh
- MySQL Master用datadirをもとに生成したAmazon EBS Snapshotのsnapshot-idを指定し、Amazon EBS Volumeを新規生成
- Amazon EBS Snapshotから生成したAmazon EBS Volumeを、Amazon EC2インスタンスIDとデバイス名を指定してattach
- attachしたAmazon EBS VolumeをMySQL Slave用datadirとしてマウント
実行方法と結果
今回のスクリプトを用いてMySQLレプリケーション構成を構築するには、MySQL Master用インスタンスとMySQL Slave用インスタンスが必要です。
どちらのインスタンスでの作業であるかを区別するため、プロンプトを以下の通りとします。
mysql-common# | 共通 |
mysql-master# | MySQL Maser |
mysql-slave# | MySQL Slave |
まず、同一ディレクトリ内にシェルスクリプトを保存します。次に、共通項目ファイル_wakame-common.shを除き、chmodコマンドでシェルスクリプトに実行許可を付与します。
各MySQLのdatadir用ディレクトリを作っておきます。
my.cnfでdatadirの値にそれぞれのディレクトリを設定します。以下は、my.cnfの例です。
- MySQL Master用my.cnfのmysqldセクション
-
- MySQL Slave用my.cnfのmysqldセクション
-
それでは、シェルスクリプトを実行してみます。root権限を必要とするため、rootでシェルスクリプトを実行します。
- wakame-ebs-mysql-master-create-volume.sh
-
- wakame-ebs-mysql-master-init.sh
-
MySQL Masterの起動は今回のスクリプトでは行わないので、手動で起動します。
- wakame-ebs-mysql-master-add-repl-user.sh
-
- wakame-ebs-mysql-master-make-snapshot.sh
-
- wakame-ebs-mysql-slave-restore.sh
-
MySQL Slaveの起動は今回のスクリプトでは行わないので、手動で起動します。
slaveが機能しているかを確認します。
MySQLレプリケーション構成にMySQL Slaveが追加され、手順が正しく動いていることを確認出来ました。必要な処理の流れはご理解いただけたのではないでしょうか。
これらのスクリプトは便利なのですが、Wakameの上で実行すればコマンド一発で指示出来るようになるほか、サーバ間の処理タイミングを同期してくれるため、人間の目で確認する作業を全て機械化することが出来ます。
それでは、スクリプトの処理をWakameに記述して行くことにしましょう。
Wakameを使って、MySQLレプリケーションを自動化する
今回は、WakameのVersion 0.3.1を利用します。
WakameにMySQL Slaveの手順を記述する
MySQL SlaveをWakameのサービスとして追加するために、3つのファイルを修正・作成しました。サービスの性質によって対象ファイルが異なります。
- /home/wakame/corelib/lib/wakame/service.rb
- /home/wakame/corelib/lib/wakame/configuration_template.rb
- /home/wakame/corelib/config/template/mysql-slave/my-slave.cnf
- /home/wakame/corelib/lib/wakame/service.rb
- Wakame MasterとWakame Agentに対する処理
- /home/wakame/corelib/lib/wakame/configuration_template.rb
- configファイル用テンプレートのパス、ファイル名を指定
- /home/wakame/corelib/config/template/mysql-slave/my-slave.cnf
- /home/wakame/corelib/lib/wakame/configuration_template.rbで指定されたconfig用テンプレートファイル
このうち、先ほど紹介したシェルスクリプトの手順を記述する対象ファイルは/home/wakame/corelib/lib/wakame/service.rbです。6つのファイルの内容をすべて記述している訳ではなく、MySQL Slaveに関する手順のみ記述しています。
これで、手順の記述が終わりました。
MySQL_Slaveをサービスに追加
MySQL Slaveの手順を記述するだけではWakameサービス対象には含まれません。Clusterにサービスに追加する必要があります。MySQL_Slaveが起動するよりも前に、MySQL_Masterを起動させる必要があるので、依存関係を指定します。
いよいよMySQL_Slaveを起動する準備が整いました。
wakameadmから実行してみる
これ以降、MySQL Slaveの追加作業を以下のコマンド1つで行えるようになります。
- MySQL Slaveを増やす
-
以下のコマンドを入力するだけで、しばらく待てばSlaveが増えるはずです。
- MySQL Slaveを移動する
-
以下のように、移動もできます。単一インスタンスに同居しているSlaveを追い出したりするのに便利です。
Wakame 0.4のリリース
6月26日(金)にWakameは0.4をリリースしました。大きく変更があった点は以下の通りです。
- ソースコードが書き直されて整理された
- Wakame Agentの設計が変更され、機能追加と呼び出しが整理された
- gem化された
特にソースコードの整理の意義ですが、世の中には、PostgreSQLなど、MySQL以外にも優れたオープンソースがたくさんあります。こうしたデータベースを愛用なさっている方も多いことでしょう。これらを1つ1つ独立して管理するために、ディレクトリ構造を見直し、それに合わせてソースコードを大幅に変更しました。
現在は、そのディレクトリ構造でMySQLはもちろんのこと、PostgreSQLのpgpool-IIを用いてスケールアウトすることも検証中です。原理的には上記の方法で、スクリプトを作って手順の動作確認をした後に、Wakameの上に新たなクラスを追加して実行をするだけです。
なお、この特集にこれまで掲載してきた内容は、今回のデータベースをスケールさせる話以外は基本的に最新である0.4のアーキテクチャをベースとしたものになっております。
今後あくしゅでは、こうしたDBMSの対応を増やしていく他にも、Webサーバやキャッシュサーバなどにも複数標準で対応して行きたいと考えています。誰もがコマンド一発でスケールアウトできる世界を目指していきますので、この辺に興味があってお手伝いをしてくださる方も募集をしております。