Skip to content
lamatsujun edited this page Mar 27, 2012 · 17 revisions

Castoro::Gateway

Home > Components >

ページ目次

機能

Gateway は主機能として以下の機能を有している

  • Basket 情報のキャッシュ
  • Peer の稼働状況監視

Basket 情報のキャッシュ

Basket 情報とは、「 該当 Basket を、どの Peer が有しているか 」を意味する情報である。

  • たとえば、
    "1.1.1" => { "peer100" => "/expdsk/1/baskets/a",
                 "peer200" => "/expdsk/1/baskets/a",
                 "peer300" => "/expdsk/1/baskets/a" }
    

    上記の場合、“1.1.1” の Basket 情報を”peer100”, “peer200”, “peer300”の3つの Peer が有しているということになる。
    Gateway は非常に多量の Basket 情報を保有するキャッシュの仕組みを自身に内包している。
    Gateway は Client からのリクエストに応じて、Basket 情報をレスポンスする。

Peer の稼働状況監視

Peer は、定期的に自身の状態を表す情報を送出している。Gateway はその情報を受信して Peer の状態を把握する。

  • Peer が送出する情報には以下の情報が含まれる。(Watchdog)
    • Peer プログラムの状態を表すステータスコード
    • Peer を動作させているホストのディスク空き容量
  • Watchdog リミット
    Watchdog パケットが一定時間 (Watchdog リミットの設定値) までに届かなくなった Peer は、その Peer への Basket 情報は送信しない。
    つまり、その Peer とは疎通ができないものとして扱うため、Peer 情報を外部へ送信しない。

機能詳細

Gateway は上記、主機能の他にリクエストに応答する機能を有している。

導入

インストール

Gem インストール要件

  • Ruby バージョン
    • Ruby 1.9.2 (以上
  • 依存 gem

Gem インストール

  • gem のインストールは以下のコマンドで実施する。
    gem install castoro-gateway
    

コマンド

Gateway に関するコマンドはすべて castoro-gateway のサブコマンドである。
サブコマンドには、以下がある。

castoro-gateway setup

  • Gateway の起動に必要なコンフィグレーションファイルを作成する。
    設定ファイルの詳細は後述の「 コンフィグレーションファイルについて 」を参照。
    $ castoro-gateway setup --help
    Usage: castoro-gateway setup [options]
        -v, --verbose                    verbose
        -f, --force                      Override config file
        -c, --conf <configfile>          Config file
        -t, --type <gateway type>        Gateway type, [original(default) master island]
    

castoro-gateway start

  • Gateway を起動する。
    $ castoro-gateway start --help
    Usage: castoro-gateway start [options]
        -v, --verbose                    verbose
        -d, --daemon                     daemon mode
        -p, --pid <pidfile>              PID file (only for the daemon mode)
        -l, --log <logfile>              Log file (only for the daemon mode)
        -c, --conf <configfile>          Config file
        -e, --env <environment>          Execution environment
    

castoro-gateway stop

  • Gateway を停止する。
    $ castoro-gateway stop --help
    Usage: castoro-gateway stop [options]
        -v, --verbose                    verbose
        -f, --force                      force shutdown
        -p, --pid <pidfile>              PID file
    

castoro-gateway status

  • 起動している Gateway の状態を表示する。
    $ castoro-gateway status
    CACHE_EXPIRE            : 15
    CACHE_REQUESTS          : 0
    CACHE_HITS              : 0
    CACHE_COUNT_CLEAR       : 0
    CACHE_ALLOCATE_PAGES    : 15
    CACHE_FREE_PAGES        : 15
    CACHE_ACTIVE_PAGES      : 0
    CACHE_HAVE_STATUS_PEERS : 0
    CACHE_ACTIVE_PEERS      : 0
    CACHE_READABLE_PEERS    : 0
    

    各ステータスは、それぞれ下記の通り。
項目名 説明
CACHE_EXPIRE Watchdog のタイムアウト値 (sec)。 watchdog_limit で設定した値
CACHE_REQUESTS find をコールした回数
CACHE_HITS find をコールしたうち、ヒットした回数
CACHE_COUNT_CLEAR ( HITS * 1000 ) / REQUESTS を返し、REQUESTS, HITS をクリアする
CACHE_ALLOCATE_PAGES 初期化時に確保したキャッシュページ数
CACHE_FREE_PAGES 使用されていないキャッシュページ数
CACHE_ACTIVE_PAGES 使用中のキャッシュページ数
CACHE_HAVE_STATUS_PEERS ステータスが登録されている peer 数
CACHE_ACTIVE_PEERS 書き込み可能な peer 数
CACHE_READABLE_PEERS 読み出し可能な peer 数

castoro-gateway dump

  • 起動している Gateway がキャッシュしている Basket 情報を表示する。
    $ castoro-gateway dump
      peer300: /expdsk/1/baskets/a/1.1.1
      peer100: /expdsk/1/baskets/a/1.1.1
      peer200: /expdsk/1/baskets/a/1.1.1
      peer100: /expdsk/1/baskets/a/2.1.1
      peer200: /expdsk/1/baskets/a/2.1.1
      peer300: /expdsk/1/baskets/a/2.1.1
      peer100: /expdsk/1/baskets/a/3.1.1
      peer200: /expdsk/1/baskets/a/3.1.1
      peer300: /expdsk/1/baskets/a/3.1.1
    
    • 出力形式
        ホスト名(Peer 名): パス(Basket のディレクトリパス)
      

castoro-gateway purge

  • Gateway がキャッシュしている Basket 情報から、指定した Peer のデータを削除する。
    $ castoro-gateway purge --help
    Usage: castoro-gateway purge [options] PEER [PEER]...
        -v, --verbose                    verbose
        -p, --port <portnumber>          console port
    
  • 出力形式
$ castoro-gateway purge peer1 peer2
*** Purge Castoro::Gateway...
--- purge completed
      peer1 - 1000 baskets.
      peer2 - 1000 baskets.
*** done.

コンフィグレーションファイルについて

  • 設定ファイルは、YAML 形式に基づく。既定のファイルパスは下記。
    /etc/castoro/gateway.conf
    
  • setup コマンドにて作成した type 別の設定ファイル、及び各項目の既定値 ( YAML フォーマット )

  • original
    <% require 'logger' %>
    ---
    default:
      require: []
      logger: " Proc.new { |logfile| Logger.new(logfile) } "
      user: castoro
      group:
      workers: 5
      loglevel: <%= Logger::INFO %>
      type: original
      gateway_console_tcpport: 30110
      gateway_comm_udpport: 30111
      gateway_learning_udpport_multicast: 30109
      gateway_watchdog_udpport_multicast: 30113
      gateway_watchdog_logging: false
      gateway_comm_ipaddr_multicast: 239.192.1.1
      gateway_comm_device_multicast: eth0
      peer_comm_udpport_multicast: 30112
      cache:
        class:
        replication_count: 3
        watchdog_limit: 15
        return_peer_number: 5
        cache_size: 500000
        filter:
        basket_basedir: /expdsk
        options: {}
        basket_keyconverter:
          Dec40Seq: 0-65535
          Hex64Seq: ""
    

  • master
    <% require 'logger' %>
    ---
    default:
      require: []
      logger: " Proc.new { |logfile| Logger.new(logfile) } "
      user: castoro
      group:
      workers: 5
      loglevel: <%= Logger::INFO %>
      type: master
      gateway_comm_udpport: 30111
      gateway_learning_udpport_multicast: 30109
      master_comm_ipaddr_multicast: 239.192.254.254
      island_comm_udpport_broadcast: 30108
      island_comm_device_multicast: eth0
    

  • island
    <% require 'logger' %>
    ---
    default:
      require: []
      logger: " Proc.new { |logfile| Logger.new(logfile) } "
      user: castoro
      group:
      workers: 5
      loglevel: <%= Logger::INFO %>
      type: island
      gateway_console_tcpport: 30110
      gateway_learning_udpport_multicast: 30109
      gateway_watchdog_udpport_multicast: 30113
      gateway_watchdog_logging: false
      gateway_comm_ipaddr_multicast: 239.192.1.1
      gateway_comm_device_multicast: eth0
      peer_comm_udpport_multicast: 30112
      master_comm_ipaddr_multicast: 239.192.254.254
      island_comm_udpport_broadcast: 30108
      island_comm_ipaddr_multicast: "TODO: please specify multicast address"
      island_comm_device_multicast: eth0
      cache:
        class:
        replication_count: 3
        watchdog_limit: 15
        return_peer_number: 5
        cache_size: 500000
        filter:
        basket_basedir: /expdsk
        options: {}
        basket_keyconverter:
          Dec40Seq: 0-65535
          Hex64Seq: ""
    

コンフィグレーションファイル仕様

  • 各 castoro gateway の type による、コンフィグの設定値について
gatewayコンフィグ type 備考
original master island
require Array[String] 必須 必須 必須 Gateway 起動時に require するライブラリを記述する
logger String 必須 必須 必須 eval に渡すことで Logger インスタンスを生成する Proc オブジェクトとなる文字列
user String/Integer 必須 必須 必須 プロセス実効ユーザ名あるいは UID
group String/Integer プロセス実効グループ名あるいは GID
workers Integer 必須 必須 必須 ワーカスレッドの個数
loglevel Integer 必須 必須 必須 ログ出力レベル
type String 必須 必須 必須 original, master, island のいずれかの種類を表す
gateway_console_tcpport Integer 必須 必須 コンソール要求受信ポート番号
gateway_comm_udpport Integer 必須 必須 Client からのユニキャストを受信するポート番号
gateway_learning_udpport_multicast Integer 必須 必須 必須 Island (master), Peer (original, island) からのマルチキャストを受信するポート番号
gateway_watchdog_udpport_multicast Integer 必須 必須 Peer からの Watchdog を受信するポート番号
gateway_watchdog_logging Boolean 必須 必須 Watchdog 受信をログ出力するか否かを意味するフラグ
gateway_comm_ipaddr_multicast String 必須 必須 Gateway-Peer 間でのマルチキャストに使われるアドレス
gateway_comm_device_multicast String 必須 必須 Gateway-Peer 間でのマルチキャストに使われる NIC
peer_comm_udpport_multicast Integer 必須 必須 Gateway から Peerのマルチキャストに使われるポート番号
master_comm_ipaddr_multicast String 必須 必須 Master を特定するマルチキャストアドレス
island_comm_udpport_broadcast Integer 必須 必須 Master から Island へのブロードキャスト送信ポート番号
island_comm_ipaddr_multicast String 必須 Island を特定するマルチキャストアドレス
island_comm_device_multicast String 必須 必須 Master-Island 間でのマルチキャスト、ブロードキャストに使われる NIC
cache / class String 必須 必須 Gateway の cache プラグインの名前(KyotoCabinet)
cache / replication_count Integer 必須 必須 Peer がレプリケーションを行うグループ単位数
※1
cache / watchdog_limit Integer 必須 必須 Gateway が Peer から受信する watchdog のタイムアウト期限(sec)
cache / return_peer_number Integer 必須 必須 Client へ返答する Peer ホストネームの数
cache / cache_size Integer 必須 必須 Gateway のキャッシュサイズ
cache / filter String 必須 必須 CREATE リクエストに適用されるフィルタ(後述)
※2
cache / basket_basedir String 必須 必須 Basket を保存するベースディレクトリパス
cache / options Hash 必須 必須 キャッシュ作成時の初期化引数
cache / basket_keyconverter Hash 必須 必須 Basket Path 導出時の、10進数(Dec40Seq), 16進数(Hex64Seq)を適用する Basket Type の範囲

  • ※1 Peer のレプリケーション数、あるいは、キャッシュが保存可能な Peer 数である 3 を超えた値を設定すると、
       マルチキャストが GET 毎に発生し Gateway のキャッシュ学習が収束しない。
  • ※2 設定値 filter には、 eval により Proc オブジェクトと評価できる文字列を指定する。
       Proc は 2 個の引数 ( Peer 群, Basket クラス ) を受けて Peer を配列として返す必要がある。
    • filter の設定例.)
      cache:
        filter: "Proc.new { |available_peers, klass| ;
             klass = 'default' if klass.nil? ;
             storeables = case klass ;
                          when 'bitmap' ;
                            ['peer200', 'peer300', 'peer400', 'peer500'] ;
                          when 'original' ;
                            ['peer300', 'peer400', 'peer500'] ;
                          else ;
                            [] ;
                          end ;
             available_peers.select{ |peer| ;
               storeables.include?(peer) ;
             } ;
           }"
      

      上記の例では、Basket クラスが ‘bitmap’ の場合 peer200, peer300, peer400, peer500。
      Basket クラスが ‘original’ の場合 peer300, peer400, peer500 の Peer を返す。

Gem パッケージ

Gateway の Gem パッケージの内容物は以下の通り。

castoro-gateway/		:Castoro-Gateway コンポーネントのホームディレクトリ
 ├ COPYING.LESSER			:GNU ライセンス
 ├ History.txt				:更新履歴
 ├ LICENSE				:ライセンス情報
 ├ README.textile			:Gateway に関するドキュメント
 ├ Rakefile				:rake コマンド用ファイル
 ├─ bin/			:Gateway 実行ファイル用ディレクトリ
 │  └ castoro-gateway			:Gateway 実行ファイル
 ├─ ext/			:キャッシュ実装用ディレクトリ
 │  ├─ cache/			:キャッシュ関連用ディレクトリ
 │  │  ├ README			:キャッシュのドキュメント
 │  │  ├ allocator.cxx		:アロケートファイル
 │  │  ├ allocator.hxx		:アロケート用ヘダー
 │  │  ├ basetypes.hxx		:バスケットタイプ用ヘダー
 │  │  ├ cache.cxx			:キャッシュファイル
 │  │  ├ cache.hxx			:キャッシュ用ヘダー
 │  │  ├ database.cxx		:データベースファイル
 │  │  ├ database.hxx		:データベースヘダー
 │  │  ├ extconf.rb			:コンパイル用ファイル
 │  │  ├ mapping.cxx			:マッピングファイル
 │  │  ├ mapping.hxx			:マッピングヘダー
 │  │  ├ page.cxx			:ページ用ファイル
 │  │  ├ page.hxx			:ページヘダー
 │  │  └─ test/		:キャッシュのテストコード用ディレクトリ
 │  │     ├ cache_spec.rb		:Cache クラスのテストコード
 │  │     └ main.cxx		:Castoro キャッシュ用スペックのテストデータ
 │  └─ utils/			:ユーティル関連用ディレクトリ
 │     ├ extconf.rb			:コンパイル用ファイル
 │     └ utils.c			:ユーティルファイル
 ├─ lib/			:クラスライブラリ用ディレクトリ
 │  ├ castoro-gateway.rb		:依存ライブラリ load 用ファイル
 │  └─ castoro-gateway/	:Castoro-Gateway を構成するクラスライブラリ用ディレクトリ
 │     ├ cache_helper.rb		:BasketCache クラスの定義ファイル
 │     ├ configuration.rb		:Gateway::Configuration クラスの定義ファイル
 │     ├ console_server.rb		:Gateway::ConsoleServer クラスの定義ファイル
 │     ├ facade.rb			:Gateway::Facade クラスの定義ファイル
 │     ├ gateway.rb			:Gateway クラスの定義ファイル
 │     ├ master_workers.rb		:Gateway::MasterWorkers クラスの定義ファイル
 │     ├ repository.rb		:Gateway::Repository クラスの定義ファイル
 │     ├ version.rb			:Gateway のバージョン定義ファイル
 │     ├ watchdog_sender.rb		:Gateway::WatchdogSender クラスの定義ファイル
 │     ├ workers.rb			:Gateway::Workers クラスの定義ファイル
 │     └─ scripts/		:Castoro::Gateway に対する操作をまとめたディレクトリ
 │        └ script_runner.rb	:Gateway::ScriptRunner クラスの定義ファイル
 ├─ pkg/			:各バージョンの gem パッケージ用ディレクトリ
 │  ├ castoro-gateway-0.0.10.gem
 │  ├         ・
 │  ├         ・
 │  └ castoro-gateway-0.2.0.gem
 ├─ resources/			:デーモン起動用ディレクトリ
 │  ├ castoro-gatewayd		:デーモン起動用シェルスクリプト
 │  ├ config-island-example.conf	:island 用コンフィグレーションファイルサンプル
 │  ├ config-master-example.conf	:master 用コンフィグレーションファイルサンプル
 │  └ config-original-example.conf	:original 用コンフィグレーションファイルサンプル
 ├─ spec/			:テストコード (RSpec) 用ディレクトリ
 │  ├ basket_cache_spec.rb		:BasketCache クラスの単体テストコード
 │  ├ console_server_spec.rb		:Gateway::ConsoleServer クラスの単体テストコード
 │  ├ facade_spec.rb			:Gateway::Facade クラスの単体テストコード
 │  ├ gateway_combined_spec.rb	:Gateway の結合テストコード 
 │  ├ gateway_master_spec.rb		:Gateway(master) のテストコード
 │  ├ gateway_spec.rb			:Gateway クラスの単体テストコード
 │  ├ master_workers_spec.rb		:Gateway::MasterWorkers クラスの単体テストコード
 │  ├ repository_spec.rb		:Gateway::Repository クラスの単体テストコード
 │  ├ spec_helper.rb			:RSpec 実行時の helper コード
 │  ├ watchdog_sender_spec.rb		:Gateway::WatchdogSender クラスの単体テストコード
 │  └ workers_spec.rb			:Gateway::Workers クラスの単体テストコード
 └─ tasks/			:rake テスト用ディレクトリ
    └ rspec.rake			:rake テスト実行用ファイル

ページTOPへ

Clone this wiki locally