"Wakame"で始めるクラウドコントロール

第3回クラウド上でスケールアウトするシステムの作り方と実例

今回から2回に分けてWakameの基本的な使い方を説明します。前提の知識としては、Amazon Web Servicesのアカウント(AWSアカウント)をお持ちでAWS Management Console等を使い、仮想マシンの起動を行ったことがある方を対象としています。

Amazon EC2へのアクセスやAWSアカウントの準備については、過去の特集はじめてのAmazon EC2&S3 ~これからの新サービスの公開の形~を参考になさるか、以下のオンラインの記事を参考にしてください。

システムをスケールアウトさせるための考え方

まず、Amazon Auto Scalingがそうであるように、WakameもAMI(Amazon Machine Image)の単位でインスタンスを起動することになります。

システムを起動するために必要な全てのサービスを1つのAMIに詰め込み、そこにWakameのMasterとAgentをインストールしておきます。

図1 WakameのMasterとAgentをインストールされたAMIを起動したイメージ
図1 WakameのMasterとAgentをインストールされたAMIを起動したイメージ

単一AMIを複数起動し、設定を調整することでスケールアウトするようにしておく

Amazon EC2上でスケールアウトさせるための原則として以下の通りに運用することとしています。

  • インスタンスを起動する際には、同じ1つのAMIを元にする
  • Wakameは、そのインスタンス上に必要なサービスを起動する・しないを制御する
  • Wakameは、必要であればそのサービスの設定を書き換える

そのため、AMIにインストールされたサービスは、基本的にWakameや最低限必要なサービス以外は、OSの準備完了と同時に自動起動しないようにinit.dの設定をオフにしておきます。

代わりに、Wakameはスタートアップスクリプトを自ら制御しに行きます。

人手でやるのであれば、/etc/init.d以下のスタートアップスクリプトを順序良く実行していくことになります。

必要なときに自らインスタンスを起動することでスケールアウトする

Wakameのマスターが必要なタイミングでAmazon Web Servicesへ通信し、自分と同じAMIを自ら指定してインスタンスを起動します。

図2 Wakame Masterが自ら同じAMIでインスタンスを起動指示する
図2 Wakame Masterが自ら同じAMIでインスタンスを起動指示する

MasterからAmazon EC2のインスタンスを起動する際には、User Dataという領域を使って、インスタンスに初期値を与えることができます。

これによって、Agentが既に起動しているMasterと連携するために必要な情報を与えることができるのと同時に、Masterが複数起動してくることを防ぎます。

図3 次のインスタンスが起動してきたところ
図3 次のインスタンスが起動してきたところ

上図のところまで起動すると、あとはMasterからAgentに通信して、新たなインスタンス上に何を起動すべきかを指示できるようになります。

Webサーバの追加を手動で実現するための例

これらをWakameを使わずに、Webサーバの追加を手動で実行してみましょう。

最初のインスタンスはElasticFoxや、AWS Management Consoleを利用して最初のインスタンスを起動した状態から始めます。

Masterが起動するサーバ上から指示することを前提として記述するため、部分的にリモートで指示する手順もあります。

この程度の手動手順である場合は、実際にシステム管理者がそのサーバにログインして実行する方が効率的ですが、今回はWakameによる構成管理の視点でとらえていただければ幸いです。

コマンドラインからインスタンスを起動する

AMIを指定し、新しいインスタンスを起動します。

新しいインスタンスの起動に成功したかを確認し、引き続きSSH接続ができるかも調べる必要があります。

% ec2-run-instances ami-xxxxxxxx
RESERVATION     r-xxxxxxxx      123456789    default
INSTANCE        i-xxxxxxxx      ami-xxxxxxxx                    pending         0               m1.small        2009-06-17T12:27:59+0000        us-east-1c aki-xxxxxxxx    ari-xxxxxxxx

新しいインスタンスを起動すると、インスタンスID(i-xxxxxxxx)が返ってくるので、これを指定してインスタンスの状態をチェックします。

% ec2-describe-instances i-xxxxxxxx
RESERVATION     r-xxxxxxxx      123456789    default
INSTANCE        i-xxxxxxxx      ami-xxxxxxxx                    pending         0               m1.small        2009-06-17T12:27:59+0000        us-east-1c aki-xxxxxxxx    ari-xxxxxxxx

インスタンスが起動すると以下のように、ステータスがrunningになるほか、アクセスするためのIPアドレスも取得できます。

% ec2-describe-instances i-73376e1a
RESERVATION     r-xxxxxxxx      123456789    default
INSTANCE        i-xxxxxxxx      ami-xxxxxxxx    ec2-x-x-x-x.compute-1.amazonaws.com domU-x-x-x-x-x-A2.compute-1.internal       running   0
                m1.small        2009-06-17T12:27:59+0000        us-east-1c      aki-xxxxxxxx    ari-xxxxxxxx

さっそくSSHを試して接続できるかを確認してみてください。

接続ができない場合は、インスタンスの起動が完了していてもネットワーク系のサービスまで立ち上がっていないことを示しています。

% ssh ec2-x-x-x-x.compute-1.amazonaws.com

Webサーバを起動する

SSHコマンドを利用し、リモートコマンド実行をします。

SSHコマンドはあらかじめ秘密鍵認証を設定しておき、インタラクティブなパスワード問い合わせを無くしておく必要があります。

ここでも、正しくWebサーバが起動したかを確認する必要がありますので、pidの有無をもってプロセスの起動ができたことを確認します(本来であれば、サービスが開始していることを確認するのが良いでしょう⁠⁠。

% ssh ec2-x-x-x-x.compute-1.amazonaws.com /etc/init.d/apache2 start

以下のように、起動したサービスのPIDが存在するかを確認します。

% ssh ec2-x-x-x-x.compute-1.amazonaws.com pidof apache2
2954 2953 2952 2947 2946 2829

ロードバランサーの設定を変更する

Webサーバの起動までは確認できたところで、ロードバランサー(apacheのmod_proxy_balancerで代用します)にこの新しいWebサーバを利用するように設定しましょう。

新しい設定ファイル(new_httpd.conf)に書き換えて、ロードバランサーを再起動することにします。

設定する前に、新しいインスタンスのIPアドレスを取得します。

% host ec2-x-x-x-x.compute-1.amazonaws.com
ec2-x-x-x-x.compute-1.amazonaws.com has address 10.x.y.z

そのIPアドレスをもとに、mod_proxy_balancerの設定ファイルを用意します。

% vim /tmp/httpd.conf
(略) 
  <Proxy balancer://web>
    BalancerMember http://10.a.b.c:8000
    BalancerMember http://10.x.y.z:8000
  </Proxy>
(略) 

設定ファイルを転送します。

% scp /tmp/httpd.conf ec2-x-x-x-x.compute-1.amazonaws.com:/etc/apache2/httpd.conf

転送が完了したら、ロードバランサーを再起動します。

% ssh ec2-x-x-x-x.compute-1.amazonaws.com /etc/init.d/apache2 reload

Wakameがあればここまでの手順を管理できる

Wakameはこれらの手順を各サーバ上で適宜実行するための仕組みを持っています。

今回は、Wakameのデモ用にAMIを用意しましたので、これで一連の操作方法を見ていくことにします。

Wakameのデモ環境準備と設定

デモ環境では、以下のサービス群を立ち上げ、最終的にRailsのトップページが確認できるところまでが機能として含まれています。

まず、デモ用AMIを用いてインスタンスの起動を行います。AWS Management ConsoleのAMIメニューから、ami-c25eb9abのデモ用AMIを選び、Launchをクリックします。検索テキストフォームへ"wakame"とタイプすると簡単に目的のAMIを見つけ出せます。

図4 AWS Management ConsoleからWakame用のAMIを検索する
図4 AWS Management ConsoleからWakame用のAMIを検索する

Instancesメニューへ移動すると、先ほどLaunchした仮想マシンの状態を確認できます。アイコンが緑色になると仮想マシンの起動が始まり、しばらくするとSSH接続が可能になります。

図5 インスタンスが正しく起動していることを確認
図5 インスタンスが正しく起動していることを確認

起動したインスタンスの行をクリックすると、画面の下半分へ起動した仮想マシンの詳細情報が表示されます。"Public DNS"の部分に表示されているホスト名をコピーし、ターミナル上へペーストします。

ubuntuユーザとしてSSH接続を行い、root権限を取得します。

% ssh ubuntu@ec2-x-x-x-x.compute-1.amazonaws.com
The authenticity of host 'ec2-x-x-x-x.compute-1.amazonaws.com (x.x.x.x)' can't be established.
RSA key fingerprint is aa:bb:cc:dd:ee:ff:aa:bb:cc:dd:ee:ff:aa:bb:cc:dd.
Are you sure you want to continue connecting (yes/no)? yes


% sudo su -

ここから、デモ環境の設定変更へ進みます。以下の作業を行います。

  • WakameがAWSへ問い合わせする際に使う、Access Key ID、Secret Access Keyの設定
  • Elastic IPの取得
  • MySQL用EBSボリュームの準備

Access Key ID と Secret Access Keyについては、Amazon Web ServicesのAccess Identifiersのページから確認できます。

図6 AWSへアクセスするのに必要な各種情報を確認
図6 AWSへアクセスするのに必要な各種情報を確認

/home/wakame/corelib/wakame/lib/configuration.rb にAmazon Access KeyとSecret Keyを書き込む箇所がありますので、そこへ書き込みます。

% vim /home/wakame/corelib/wakame/lib/configuration.rb
63:         config.aws_access_key = 'AMAZON ACCESS KEY'
64:         config.aws_secret_key = 'AMAZON SECRET KEY'

Elastic IPをAWS Management Consoleから取得し、/home/wakame/corelib/wakame/lib/service.rb の下記の行へ書き込みます。

/home/wakame/corelib/wakame/lib/service.rb
853: @listen_port = 80
854: @listen_port_https = 443
855: @template = ConfigurationTemplate::ApacheTemplate.new(:lb)
856: @elastic_ip = '174.129.221.12'
857: end

MySQL用EBSボリュームを確保します。ec2-api-toolsを使っても同等なことができますが、必要な手順を自動化したrakeタスクも用意してあります。

% cd /home/wakame/corelib/
% /usr/local/gems/bin/rake ec2:mysqlsetupvol[1]
.
.
.
The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com
umount /mnt/mysql-tmp
Initialized EBS Volume: vol-81ff10e8
%

最後に出てくるvol-xxxxxxxx の文字列を/home/wakame/corelib/wakame/lib/service.rbファイルの@ebs_volumeへ割り当てます。

900: @mysqld_datadir = File.expand_path('data', @basedir)
901: @mysqld_log_bin = File.expand_path('mysql-bin.log', @mysqld_datadir)
902: @ebs_volume = 'vol-81ff10e8'
903: @ebs_device = '/dev/sdm'

これで、Wakameのデモ用の設定が完了しました。MasterとAgentのプロセスを再起動し、設定内容を反映させます。

% /etc/init.d/wakame-master restart
% /etc/init.d/wakame-agent restart

Clusterの起動

以下のコマンドで、現在のClusterの状態を表示させることができます。

% /home/wakame/corelib/bin/wakameadm status
Cluster : Wakame::Service::WebCluster (0)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter>
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter>
  Wakame::Service::Apache_APP : <current=1 min=1, max=5, type=ConstantCounter>
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter>


Agents :
  i-73b8e41a : 10.240.63.223, 67.202.43.134 load=0.06, 2 sec(s) (1)

Clusterの項目には、Masterが認識しているサービスの一覧が表示されています。以下の図にあるように、依存関係を含めたサービスの一覧図を内部的にも持っています。キャラクタベースのインタフェースでは表示することが難しいため、リスト状に表示しています。

また、下部にはAgentsという項目があり、現在Masterが把握しているAgentの情報が表示されます。

現在のバージョンでは、wakameadm status コマンドがMasterの内部を把握する唯一の方法なので、操作のたびにstatusコマンドで状態の変化をみることになります。

図7 依存関係を示したサービスの一覧図(Cluster)
図7 依存関係を示したサービスの一覧図(Cluster)

以下のコマンドで、サービス全体の起動を行うことができます。

% /home/wakame/corelib/bin/wakameadm launch_cluster

このコマンドは、サービスの一覧図通りに下段からサービスを順番に立ち上げ、ロードバランサが立ち上がるまでの調整を行います。launch_clusterコマンドを走らせた後、すぐにstatusコマンドを走らせ状態の変化を見てみます。

% /home/wakame/corelib/bin/wakameadm launch_cluster
% /home/wakame/corelib/bin/wakameadm status

Cluster : Wakame::Service::WebCluster (2)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter>
     b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 (Offline)
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter>
     b4a7c1033a2aa2f475f77b6eab89377b117a7012 (ONLINE)
  Wakame::Service::Apache_APP : <current=1 min=1, max=5, type=ConstantCounter>
     8fc49ff6001201b099757157041318aaba45dba8 (Offline)
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter>
     03718153224a96f96d83f99a764c2cdc46ef9bed (Starting...)

Instances :
  b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 : Wakame::Service::Apache_LB (Offline)
  b4a7c1033a2aa2f475f77b6eab89377b117a7012 : Wakame::Service::Apache_WWW (ONLINE)
    On VM instance: i-73b8e41a
  03718153224a96f96d83f99a764c2cdc46ef9bed : Wakame::Service::MySQL_Master (Starting...)
    On VM instance: i-73b8e41a
  8fc49ff6001201b099757157041318aaba45dba8 : Wakame::Service::Apache_APP (Offline)

Agents :
  i-73b8e41a : 10.240.63.223, 174.129.206.164 load=0.23, 2 sec(s) (1)

各サービスの起動がスケジュールされると、それぞれにユニークなIDが割り振られます。また、サービスの起動状態も把握していますので、右側に状態が表示されています。起動が完了するとONLINEと表示され、起動待ちの物はOfflineとなっているのがstatusコマンドから分かります。

上段に位置するサービス(Apache_APPとApache_LB)は立ち上げに入っておらず、下段のサービスの立ち上げが完了するのを待っています。MySQL_Master は、"Starting..."という表示が示すとおり、起動している最中です。図で表すと、以下のような状態です。Agentが立ち上がったと判断すると、Masterへサービスが立ち上がったという知らせが行き、次の立ち上げ手順へ移ります。

図8 Clusterを立ち上げ途中で見たときの様子
図8 Clusterを立ち上げ途中で見たときの様子

これら一連の手順を繰り返すと、全体の起動が完了し表示が以下のように変わります。

Cluster : Wakame::Service::WebCluster (1)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter>
     b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 (ONLINE)
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter>
     b4a7c1033a2aa2f475f77b6eab89377b117a7012 (ONLINE)
  Wakame::Service::Apache_APP : <current=1 min=1, max=5, type=ConstantCounter>
     8fc49ff6001201b099757157041318aaba45dba8 (ONLINE)
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter>
     03718153224a96f96d83f99a764c2cdc46ef9bed (ONLINE)

Instances :
  b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 : Wakame::Service::Apache_LB (ONLINE)
    On VM instance: i-73b8e41a
  b4a7c1033a2aa2f475f77b6eab89377b117a7012 : Wakame::Service::Apache_WWW (ONLINE)
    On VM instance: i-73b8e41a
  03718153224a96f96d83f99a764c2cdc46ef9bed : Wakame::Service::MySQL_Master (ONLINE)
    On VM instance: i-73b8e41a
  8fc49ff6001201b099757157041318aaba45dba8 : Wakame::Service::Apache_APP (ONLINE)
    On VM instance: i-73b8e41a

Agents :
  i-73b8e41a : 10.240.63.223, 174.129.206.164 load=0.0, 5 sec(s) (1)
    Services (4): Wakame::Service::Apache_LB, Wakame::Service::Apache_WWW, Wakame::Service::MySQL_Master, Wakame::Service::Apache_APP

ここまでで、全てのサービスが一つのインスタンスで起動され、次の図のような状態になります。

図9 全てのサービスが1つのインスタンスで起動されたときの様子
図9 全てのサービスが1つのインスタンスで起動されたときの様子

では、今度はブラウザからHTTPの疎通を確認してみます。http://aaa.test/ というVirtual Hostがapache.confに書かれていますので、aaa.testがElastic IPを指すようにhostsファイルを書き換えてください(Windowsから確認する場合は、"C:\WINDOWS\system32\drivers\etc\hosts"を書き換えます⁠⁠。

hostsファイルに下記1行を追記してください。

hosts
 174.x.x.x   aaa.test 

http://aaa.test/ で、Railsのトップページが表示されます。

図10 WWWサーバとAPPサーバが正しく動作していることを確認
図10 WWWサーバとAPPサーバが正しく動作していることを確認

http://aaa.test/balancer-manager でApache2.2のproxy balancer モジュールの状態を確認するページを表示できます。上のページを数回リロードすると、リクエストがApache_WWWとApache_APPのサービスへ割り振られているのを確認できます。

図11 ロードバランサが機能していることを確認
図11 ロードバランサが機能していることを確認

次は、Apache_APPを別の仮想マシン上で起動させアプリケーションサーバがスケールする状態を試してみます。

サービスを増やす

サービスを増やすには、propagate_serviceコマンドを使います。

% /home/wakame/corelib/bin/wakameadm propagate_service Wakame::Service::Apache_APP 
% /home/wakame/corelib/bin/wakameadm status 

Cluster : Wakame::Service::WebCluster (1)
  Wakame::Service::Apache_LB : 
     b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 (ONLINE)
  Wakame::Service::Apache_WWW : 
     b4a7c1033a2aa2f475f77b6eab89377b117a7012 (ONLINE)
  Wakame::Service::Apache_APP : 
     1a13d4bb5d018e84ddebbbf32484a822454fa44c (Offline)
     8fc49ff6001201b099757157041318aaba45dba8 (ONLINE)
  Wakame::Service::MySQL_Master : 
     03718153224a96f96d83f99a764c2cdc46ef9bed (ONLINE)

Instances :
  b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 : Wakame::Service::Apache_LB (ONLINE)
    On VM instance: i-73b8e41a
  1a13d4bb5d018e84ddebbbf32484a822454fa44c : Wakame::Service::Apache_APP (Offline)
  b4a7c1033a2aa2f475f77b6eab89377b117a7012 : Wakame::Service::Apache_WWW (ONLINE)
    On VM instance: i-73b8e41a
  03718153224a96f96d83f99a764c2cdc46ef9bed : Wakame::Service::MySQL_Master (ONLINE)
    On VM instance: i-73b8e41a
  8fc49ff6001201b099757157041318aaba45dba8 : Wakame::Service::Apache_APP (ONLINE)
    On VM instance: i-73b8e41a

Agents :
  i-73b8e41a : 10.240.63.223, 174.129.206.164 load=0.0, 1 sec(s) (1)
    Services (4): Wakame::Service::Apache_LB, Wakame::Service::Apache_WWW, Wakame::Service::MySQL_Master, Wakame::Service::Apache_APP

Apache_APPに二種類のインスタンスが現れました。ONLINEのApache_APPは従来の物ですが、OfflineのApache_APPはAgentの割り当てを待っている状態です。ここからは場合によって、仮想マシンの確保に数分待つ必要があります。WakameがEC2の仮想マシンのリクエストを行っており、その新しい仮想マシンの中で立ち上がったAgentとMasterの間で通信が確立されるまでは、statusコマンドの内容に変化がありません。

図12 APP Serverを増やすために新しいインスタンスを確保しているときの様子
図12 APP Serverを増やすために新しいインスタンスを確保しているときの様子

無事新しい仮想マシンが認識され、最終的にApache_APPが二つになった状態では、以下の表示内容になります。

Cluster : Wakame::Service::WebCluster (1)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter>
     b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 (ONLINE)
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter>
     b4a7c1033a2aa2f475f77b6eab89377b117a7012 (ONLINE)
  Wakame::Service::Apache_APP : <current=2 min=1, max=5, type=ConstantCounter>
     1a13d4bb5d018e84ddebbbf32484a822454fa44c (ONLINE)
     8fc49ff6001201b099757157041318aaba45dba8 (ONLINE)
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter>
     03718153224a96f96d83f99a764c2cdc46ef9bed (ONLINE)

Instances :
  b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 : Wakame::Service::Apache_LB (ONLINE)
    On VM instance: i-73b8e41a
  1a13d4bb5d018e84ddebbbf32484a822454fa44c : Wakame::Service::Apache_APP (ONLINE)    On VM instance: i-71cf9318  b4a7c1033a2aa2f475f77b6eab89377b117a7012 : Wakame::Service::Apache_WWW (ONLINE)
    On VM instance: i-73b8e41a
  03718153224a96f96d83f99a764c2cdc46ef9bed : Wakame::Service::MySQL_Master (ONLINE)
    On VM instance: i-73b8e41a
  8fc49ff6001201b099757157041318aaba45dba8 : Wakame::Service::Apache_APP (ONLINE)    On VM instance: i-73b8e41a

Agents :
  i-73b8e41a : 10.240.63.223, 174.129.206.164 load=0.0, 7 sec(s) (1)
    Services (4): Wakame::Service::Apache_LB, Wakame::Service::Apache_WWW, Wakame::Service::MySQL_Master, Wakame::Service::Apache_APP
  i-71cf9318 : 10.254.230.31, 174.129.179.77 load=0.08, 5 sec(s) (1)
    Services (1): Wakame::Service::Apache_APP

wakameadmが返している状態は下図の通りです。

図13 APP Serverが新しいインスタンス上に用意されたときの様子
図13 APP Serverが新しいインスタンス上に用意されたときの様子

http://aaa.test/balancer-manager の変化も確認してみます。

図14 ロードバランサが追加されたAPPサーバへバランスしていることを確認
図14 ロードバランサが追加されたAPPサーバへバランスしていることを確認

増えたApache_APPサーバがバランス先の対象として認識されるよう、ロードバランサ側の設定ファイルが更新されていることを確認できます。Railsのトップページをリロードすることで、リクエストがきちんとバランスされていることも確認できます。

サービスを移動する

Wakameには、もう一つ大きなオペレーションがあります。サービスのサーバ間の移動です。

一つのイメージから起動する様にデザインされているため、始まりはいつも一つの仮想マシンにすべてのサービスが詰め込まれた状態になります。負荷を分散させるためには、サービスを実行する仮想マシンを増やすだけでは不十分で、詰め込まれたサービスを外出しし、最初の仮想マシンで稼働するサービスの数を減らすことも必要です。

そのための機能がサービスのサーバ間の移動機能で、migrate_serviceコマンドを走らせることで実行できます。引数にはpropagate_serviceコマンドとは異なり、サービスのインスタンスを特定するハッシュ文字列を渡す必要があります。

% /home/wakame/corelib/bin/wakameadm migrate_service b4a7c1033a2aa2f475f77b6eab89377b117a7012 
% /home/wakame/corelib/bin/wakameadm status Cluster : Wakame::Service::WebCluster (2)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter>
     b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 (ONLINE)
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter>
     b4a7c1033a2aa2f475f77b6eab89377b117a7012 (Migrating...)
     c6e25436e2274d4dd340929f958dca1956125c3a (Offline)
  Wakame::Service::Apache_APP : <current=2 min=1, max=5, type=ConstantCounter>
     1a13d4bb5d018e84ddebbbf32484a822454fa44c (ONLINE)
     8fc49ff6001201b099757157041318aaba45dba8 (ONLINE)
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter>
     03718153224a96f96d83f99a764c2cdc46ef9bed (ONLINE)

Instances :
  b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 : Wakame::Service::Apache_LB (ONLINE)
    On VM instance: i-73b8e41a
  1a13d4bb5d018e84ddebbbf32484a822454fa44c : Wakame::Service::Apache_APP (ONLINE)
    On VM instance: i-71cf9318
  c6e25436e2274d4dd340929f958dca1956125c3a : Wakame::Service::Apache_WWW (Offline)
  b4a7c1033a2aa2f475f77b6eab89377b117a7012 : Wakame::Service::Apache_WWW (Migrating...)
    On VM instance: i-73b8e41a
  03718153224a96f96d83f99a764c2cdc46ef9bed : Wakame::Service::MySQL_Master (ONLINE)
    On VM instance: i-73b8e41a
  8fc49ff6001201b099757157041318aaba45dba8 : Wakame::Service::Apache_APP (ONLINE)
    On VM instance: i-73b8e41a

Agents :
  i-73b8e41a : 10.240.63.223, 174.129.206.164 load=1.32, 2 sec(s) (1)
    Services (4): Wakame::Service::Apache_LB, Wakame::Service::Apache_WWW, Wakame::Service::MySQL_Master, Wakame::Service::Apache_APP  i-71cf9318 : 10.254.230.31, 174.129.179.77 load=0.09, 3 sec(s) (1)
    Services (1): Wakame::Service::Apache_APP

すると、稼働中のApache_WWWサービスが、Migrating... となり、新しく確保されたOfflineと表示されている新しいApache_WWWサービスへ切り替わろうとします。ここでもまた、仮想マシンの確保が発生するので、数分待つことになります。

図15 WWW Serverのために新しいインスタンスを確保しているときの様子
図15 WWW Serverのために新しいインスタンスを確保しているときの様子
Cluster : Wakame::Service::WebCluster (2)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter>
     b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 (ONLINE)
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter>
     c6e25436e2274d4dd340929f958dca1956125c3a (ONLINE)
  Wakame::Service::Apache_APP : <current=2 min=1, max=5, type=ConstantCounter>
     1a13d4bb5d018e84ddebbbf32484a822454fa44c (ONLINE)
     8fc49ff6001201b099757157041318aaba45dba8 (ONLINE)
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter>
     03718153224a96f96d83f99a764c2cdc46ef9bed (ONLINE)

Instances :
  b4c41f1cfc5c66ca28141c2290bac83e97f69cf0 : Wakame::Service::Apache_LB (ONLINE)
    On VM instance: i-73b8e41a
  1a13d4bb5d018e84ddebbbf32484a822454fa44c : Wakame::Service::Apache_APP (ONLINE)
    On VM instance: i-71cf9318
  c6e25436e2274d4dd340929f958dca1956125c3a : Wakame::Service::Apache_WWW (ONLINE)
    On VM instance: i-83cb97ea
  03718153224a96f96d83f99a764c2cdc46ef9bed : Wakame::Service::MySQL_Master (ONLINE)
    On VM instance: i-73b8e41a
  8fc49ff6001201b099757157041318aaba45dba8 : Wakame::Service::Apache_APP (ONLINE)
    On VM instance: i-73b8e41a

Agents :
  i-73b8e41a : 10.240.63.223, 174.129.206.164 load=0.01, 3 sec(s) (1)
    Services (3): Wakame::Service::Apache_LB, Wakame::Service::MySQL_Master, Wakame::Service::Apache_APP
  i-83cb97ea : 10.249.47.230, 174.129.104.37 load=0.62, 2 sec(s) (1)
    Services (1): Wakame::Service::Apache_WWW
  i-71cf9318 : 10.254.230.31, 174.129.179.77 load=0.0, 4 sec(s) (1)
    Services (1): Wakame::Service::Apache_APP

完了すると、3台目の仮想マシンが立ち上がり、そこへApache_WWWが移動していることを確認できます。

図16 WWW Serverを新しいインスタンスに移動したときの様子
図16 WWW Serverを新しいインスタンスに移動したときの様子

ロードバランサの画面では、WWW向けのIPアドレスが変わっていることを確認できます。

図17 ロードバランサが移動されたWWWサーバへバランスしていることを確認
図17 ロードバランサが移動されたWWWサーバへバランスしていることを確認

サービスを終了する

最後に、サービス群全体を終了させてみましょう。

shutdown_clusterコマンドを実行することで、今まで起動・増殖させてきたサービス全体を停止させます。この場合も、各サービスの依存関係を参照しており、launch_clusterコマンドの場合とは逆に上段から順番にサービスを停止させていきます。

% /home/wakame/corelib/bin/wakameadm shutdown_cluster
Cluster : Wakame::Service::WebCluster (2)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter>
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter>
     c6e25436e2274d4dd340929f958dca1956125c3a (Stopping...)
  Wakame::Service::Apache_APP : <current=2 min=1, max=5, type=ConstantCounter>
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter>
     03718153224a96f96d83f99a764c2cdc46ef9bed (Stopping...)

Instances :
  c6e25436e2274d4dd340929f958dca1956125c3a : Wakame::Service::Apache_WWW (Stopping...)
    On VM instance: i-83cb97ea
  03718153224a96f96d83f99a764c2cdc46ef9bed : Wakame::Service::MySQL_Master (Stopping...)
    On VM instance: i-73b8e41a

Agents :
  i-73b8e41a : 10.240.63.223, 174.129.206.164 load=0.13, 1 sec(s) (1)
    Services (1): Wakame::Service::MySQL_Master
  i-83cb97ea : 10.249.47.230, 174.129.104.37 load=0.0, 6 sec(s) (1)
    Services (1): Wakame::Service::Apache_WWW
  i-71cf9318 : 10.254.230.31, 174.129.179.77 load=0.0, 5 sec(s) (1)

最後に、この回の最初のstatus表示になったらshutdown処理の完了です。

Cluster : Wakame::Service::WebCluster (0)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter>
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter>
  Wakame::Service::Apache_APP : <current=2 min=1, max=5, type=ConstantCounter>
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter>

Agents :
  i-73b8e41a : 10.240.63.223, 174.129.206.164 load=0.01, 5 sec(s) (1)

まとめ

今回は実際に動作するサーバ構成を元に、コマンドラインベースでWakameの主要な動作を説明しました。コマンドラインをきっかけにするのではなく、時間や負荷率の条件に応じてサービスを増やしたり移動させたりする動作を引き起こすことで、自動的なスケールアウトを実現することになります。

次回は、より複雑な例として、Wakameが本領を発揮するデータベース(MySQL)のスケールアウトについて解説します。

おすすめ記事

記事・ニュース一覧