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

第2回 クラウド上でサーバ構成を管理するための考え方と仕掛け

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

Wakameのアーキテクチャ概要

Wakameは,クラウド型ホスティングの構成管理ツールとしての従来のやり方に加えて,以下の機能をフレームワークとして提供できるようRubyForgeにて開発が続けられています。

  • 非同期型ワークフローのサポート
  • 作業の並列化

本節ではそうした機能を踏まえ,Wakameの概要を見ていくことにします。

Master-Agent構成を取る

Wakameは,MasterとAgentを構成要素に持ち1対Nの構成になります。内部の通信プロトコルには,AMQPという標準化されたメッセージキューのプロトコルを利用しています。

実際の通信トポロジとしては,RabbitMQというAMQP実装を中心としたスター形を取っており,Master,Agentそれぞれが必要に応じてAMQP上のチャンネルを開き相互に通信を行っています。

Agentは各仮想マシンに1つずつ配置されます。こうした構成は米国Engine Yard社からリリースされているnaniteやVertebraのデザインを参考にしています。

図2 RabbitMQでつながるMasterとAgent

図2 RabbitMQでつながるMasterとAgent

Agentの役割は,立ち上がったノード上でMasterから受けた指令の処理とノードの監視を行うことです。

受け付ける指令は以下のようなものになります。

  • Apacheなどのデーモン用スタートアップスクリプトを呼び出せ
  • 監視を開始せよ,終了せよ

Masterの役割は,全てのAgentの把握,手順のAgentへの指示,起動すべきサービスの指定,サービス全体に関わる状態の管理など多岐に渡ります。

Amazon EC2に特化した部分ですと,新しい仮想マシンを立ち上げるためのWeb APIへのアクセスなどもMasterの役割となっています。Masterは管理用コマンド(wakameadm)を通じてユーザからの命令も随時受け付け,その命令を元にサービスの開始終了処理を行うことができます。

補足:
現在のバージョンにはMasterに待機系を持たせる機能がありませんが,将来のバージョンでサポートする予定です。

サービスの定義を記述する

システムの設計者は,Masterに対してサービスの構成図を伝える必要があります。そして,Masterはその構成図を元にサービス全体の管理を行います。

現在のバージョンでは,Rubyのソースコードとして内容を定義するようになっています。

図3 Resource,Cluster,Instanceの相関関係

図3 Resource,Cluster,Instanceの相関関係

Resource

Resourceとは,Apache, MySQLなどの単体のサービスの定義をするためのデータ構造です。定義内容には,起動・終了方法を含む処理手順も含まれます。

リスト1静的コンテンツを配信するApacheプロセスを起動・終了させる定義クラスの例/p>

class Apache_WWW < Wakame::Service::Resource

  # Apacheの起動処理
  def start(svc, action)
    cond = ConditionalWait.new { |cond|
      cond.wait_event(Wakame::Event::ServiceOnline) { |event|
        event.instance_id == svc.instance_id
      }
    }
# PidFileを元にしたプロセスモニタリングの開始をAgentに指示
    request = action.actor_request(svc.agent.agent_id,
                                   '/service_monitor/register', svc.instance_id, :pidfile, '/var/run/apache2-www.pid').request
    # 起動スクリプトの呼び出しをAgentに指示
    request = action.actor_request(svc.agent.agent_id,
                                   '/daemon/start', "apache_www", 'init.d/apache2-www').request

    # Event::ServiceOnlineがやってくるまで待つ
    cond.wait
  end

# Apacheの終了処理
  def stop(svc, action)
    cond = ConditionalWait.new { |cond|
      cond.wait_event(Wakame::Event::ServiceOffline) { |event|
        event.instance_id == svc.instance_id
      }
    }

# 終了スクリプトの呼び出しAgentに指示
    request = action.actor_request(svc.agent.agent_id,
                                   '/daemon/stop', 'apache_www', 'init.d/apache2-www').request

    #  Event::ServiceOfflineがやってくるまで待つ
    cond.wait

    # プロセスモニタリングの停止をAgentに指示
    request = action.actor_request(svc.agent.agent_id,
                                   '/service_monitor/unregister', svc.instance_id ).request
     
  end
end
Cluster

サービス全体の定義を行うデータ構造で,Resourceの組み合わせとして表されます。また,各Resourceの依存関係情報も保持しています。

リスト2 Webでよくある構造でサービスを組み合わせたClusterの定義例

class WebCluster < Wakame::Service::ServiceCluster
  def initialize(master)
     super(master) { |c|
       # サービスの定義を追加
       c.add_resource(Apache_WWW.new)
       c.add_resource(Apache_APP.new)
       c.add_resource(Apache_LB.new)
       c.add_resource(MySQL_Master.new)
      
       # 依存関係の指定
       c.set_dependency(Apache_WWW, Apache_LB)
       c.set_dependency(Apache_APP, Apache_LB)
       c.set_dependency(MySQL_Master, Apache_APP)
     }
  end
end
Instance

ResourceおよびClusterは,あくまでも論理的な依存関係を示すもので,動作する実体ではありません。Resourceが実体化されると,Instanceと呼び,Webサーバが実際に何台の仮想マシンで動作しているのかを示すようになります。

著者プロフィール

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

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

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


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

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

URLhttp://vcxzasdf.blogspot.com/


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

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

URLhttp://blog.hansode.org/