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

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

この記事を読むのに必要な時間:およそ 12 分

今回から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に通信して,新たなインスタンス上に何を起動すべきかを指示できるようになります。

著者プロフィール

山崎泰宏(やまざきやすひろ)

株式会社あくしゅ所属。Wakameをやろうと思いつくところを担当。物静かな技術者の代わりに話をする。

URLhttp://blog.livedoor.jp/sparklegate/


藤原勝弘(ふじわらまさひろ)

株式会社あくしゅ所属。Wakameのコア実装を担当。コンシューマ向けサービスの開発や,外資金融系の堅牢なデータセンタ業務経験もあるカバーレンジの広い多才なプログラマ。

URLhttp://vcxzasdf.blogspot.com/


吉田将士(よしだまさひと)

株式会社あくしゅ所属。WakameをDBスケールなどに応用する開発を担当。大規模なデータセンタの運用経験を持っており,サーバ管理手順の自動化に興味津々な筋トレプログラマ。

URLhttp://blog.hansode.org/

コメント

  • Re: 再び、実例通りに動きませんでした (解決しました)

    >同4ページ目ですが、完成したクラスタ環境に接続するテストを行う部分で
    >hostsを書き換えた後http://aaa.test/へ接続を行うとのことですが、繋がりません

    大変失礼いたしました
    セキュリティー対策のため、/etc/ssh/sshd_configのPermitRootLogin yesをnoに変更していたため
    wakameの処理中でrsyncがrootでsshを行う際に失敗してしまっていたようです

    PermitRootLogin yesに戻したところ/home/wakame/config/apache2内のファイルが動的に書き換えられ
    /var/log/wakame-master.logに出ていた以下のエラーも解消いたしました

    wakame-master[DEBUG]: rsync -e 'ssh -i /home/wakame/config/root.id_rsa -o "UserKnownHostsFile /home/wakame/config/ssh/known_hosts"' -au /home/wakame/config/tmp/290e7b043d12ffebe64d4d76e2446725af99bebf/apache2 root@10.242.58.148:/home/wakame/config/
    Permission denied (publickey).
    rsync: connection unexpectedly closed (0 bytes received so far) [sender]
    rsync error: error in rsync protocol data stream (code 12) at io.c(635) [sender=3.0.3]

    無事、http://aaa.test/のアクセスに成功し、Load Balancer Managerの表示も正常になりました

    Commented : #4  fxzz (2009/10/26, 16:35)

  • 再び、実例通りに動きませんでした

    いくつか表記通りでなかったり、戸惑う部分がありましたのでコメントさせて頂きます

    3ページ目「Wakameのデモ環境準備と設定」内でroot権限に変更との事ですが

    >ubuntuユーザとしてSSH接続を行い,root権限を取得します。
    > % sudo su -

    その後のプロンプトが以下の様に%になっています
    これは著者のshellプロンプトカスタマイズによる物で
    root権限(#) プロンプトと理解して宜しいのでしょうか?

    > % cd /home/wakame/corelib/
    > % /usr/local/gems/bin/rake ec2:mysqlsetupvol[1]


    同3ページのelastic_ipを設定する箇所及びEBSボリュームを設定する部分でパスが間違っています
    記事上のパスではファイルが存在しません
    # ls -l /home/wakame/corelib/wakame/lib/service.rb
    ls: cannot access /home/wakame/corelib/wakame/lib/service.rb: No such file or directory
    正しくはこちらではないでしょうか?
    # ls -l /home/wakame/corelib/lib/wakame/service.rb
    -rwxr-xr-x 1 wakame wakame 34608 2009-10-22 17:47 /home/wakame/corelib/lib/wakame/service.rb

    4ページでlaunch_clusterをする箇所がありますが、以下のコマンドを実行すると暫くすると
    インスタンスのグローバルIPアドレスがservice.rbに設定したElasticIPに置き換わります
    この為、それまでの動的IPで接続していたSSHが切断されます。
    この事について一言注意書きを頂けるとありがたかったです

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


    同4ページ目ですが、完成したクラスタ環境に接続するテストを行う部分で
    hostsを書き換えた後http://aaa.test/へ接続を行うとのことですが、繋がりません

    http://aaa.test/balancer-manager にて、proxy balancerモジュールの管理画面へは表示されますが
    Worker URLのアドレスが本来設定されるはずであるwakame agentsのIPアドレスではなく
    身に覚えのないIPアドレスが設定されています
    この為http://aaa.test/へは繋がらない物と思われます

    ---- wakameadm statusのAgent部分の表示内容です ----
    Agents :
    i-9ca71cf4 : 10.245.191.132, 67.202.1.26 load=0.16, 5 sec(s) (1)

    ---- balancer-managerの表示内容です----
    LoadBalancer Status for balancer://cluster-www
    StickySession Timeout FailoverAttempts Method
    - 0 0 byrequests

    Worker URL Route RouteRedir Factor Set Status Elected To From
    http://10.248.183.83:8000 10 0 Ok 0 0 0

    --------------------------------------------------------------------------------

    LoadBalancer Status for balancer://cluster-app
    StickySession Timeout FailoverAttempts Method
    - 10 1 byrequests

    Worker URL Route RouteRedir Factor Set Status Elected To From
    http://10.251.26.255:8001 10 0 Ok 0 0 0
    http://10.248.183.213:8001 10 0 Ok 0 0 0


    最後に5ページ目についてですが、サービスを「減らす」方法についても
    知りたかったです
    減らす処理を行った場合、不要になったEC2インスタンスが自動で終了したりも
    wakame内で行われるのでしょうか?

    Commented : #3  fxzz (2009/10/23, 13:05)

  • Re: 実例通りに動きませんでした(解決しました)

    >rakeタスクは以下の様に失敗してしまいます

    解決しました
    ubuntuのセキュリティフレームワークapparmorを止めて
    rakeタスクを実行したところ正常に動作しました

    apparmor停止
    % sudo /etc/init.d/apparmor stop

    参考ブログ
    http://vcxzasdf.blogspot.com/2009_04_01_archive.html

    Commented : #2  fxzz (2009/10/22, 17:43)

  • 実例通りに動きませんでした

    wakameの実例通りに試していたのですが
    以下の様な問題が起こりうまくできませんでした

    configuration.rbの位置が間違っているようです
    # ls -l /home/wakame/corelib/wakame/lib/configuration.rb
    ls: cannot access /home/wakame/corelib/wakame/lib/configuration.rb: No such file or directory


    正しくはこちらではないでしょうか?
    # ls -l /home/wakame/corelib/lib/wakame/configuration.rb
    -rw-r--r-- 1 wakame wakame 2264 2009-10-22 11:48 /home/wakame/corelib/lib/wakame/configuration.rb

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

    rakeタスクは以下の様に失敗してしまいます
    ec2-api-toolsを使った方法はどの様に行うのでしょうか?

    # /usr/local/gems/bin/rake ec2:mysqlsetupvol[1]
    (in /home/wakame/corelib)
    /home/wakame/corelib/config/../lib/wakame.rb:19: warning: already initialized constant VERSION
    echo 'y' | mkfs.ext3 -q /dev/sdw
    /dev/sdw is entire device, not just one partition!
    Proceed anyway? (y,n) mount /dev/sdw /mnt/mysql-tmp
    /usr/bin/mysql_install_db --datadir=/mnt/mysql-tmp
    Installing MySQL system tables...
    091022 11:50:52 [Warning] Can't create test file /mnt/mysql-tmp/ip-10-242-58-148.lower-test
    091022 11:50:52 [Warning] Can't create test file /mnt/mysql-tmp/ip-10-242-58-148.lower-test
    ERROR: 1005 Can't create table 'db' (errno: 13)
    091022 11:50:52 [ERROR] Aborting

    091022 11:50:52 [Note] /usr/sbin/mysqld: Shutdown complete

    Installation of system tables failed!

    Examine the logs in /mnt/mysql-tmp for more information.
    You can try to start the mysqld daemon with:
    /usr/sbin/mysqld --skip-grant &
    and use the command line tool
    /usr/bin/mysql to connect to the mysql
    database and look at the grant tables:

    shell> /usr/bin/mysql -u root mysql
    mysql> show tables

    Try 'mysqld --help' if you have problems with paths. Using --log
    gives you a log in /mnt/mysql-tmp that may be helpful.

    The latest information about MySQL is available on the web at
    http://www.mysql.com
    Please consult the MySQL manual section: 'Problems running mysql_install_db',
    and the manual section that describes problems on your OS.
    Another information source is the MySQL email archive.
    Please check all of the above before mailing us!
    And if you do mail us, you MUST use the /usr/bin/mysqlbug script!
    umount /mnt/mysql-tmp
    rake aborted!
    Command failed with status (1): [/usr/bin/mysql_install_db --datadir=/mnt/m...]

    (See full trace by running task with --trace)

    Commented : #1  fxzz (2009/10/22, 12:02)

コメントの記入