-
Notifications
You must be signed in to change notification settings - Fork 3
Castoro::Gateway
lamatsujun edited this page Mar 27, 2012
·
17 revisions
Home > Components >
Gateway は主機能として以下の機能を有している
- Basket 情報のキャッシュ
- Peer の稼働状況監視
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 は、定期的に自身の状態を表す情報を送出している。Gateway はその情報を受信して Peer の状態を把握する。
- Peer が送出する情報には以下の情報が含まれる。(Watchdog)
- Peer プログラムの状態を表すステータスコード
- Peer を動作させているホストのディスク空き容量
- Watchdog リミット
Watchdog パケットが一定時間 (Watchdog リミットの設定値) までに届かなくなった Peer は、その Peer への Basket 情報は送信しない。
つまり、その Peer とは疎通ができないものとして扱うため、Peer 情報を外部へ送信しない。
Gateway は上記、主機能の他にリクエストに応答する機能を有している。
- Ruby バージョン
- Ruby 1.9.2 (以上
- 依存 gem
- json (1.2.3 以上
- Castoro::Common
- gem のインストールは以下のコマンドで実施する。
gem install castoro-gateway
Gateway に関するコマンドはすべて castoro-gateway のサブコマンドである。
サブコマンドには、以下がある。
- 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]
- 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
- Gateway を停止する。
$ castoro-gateway stop --help Usage: castoro-gateway stop [options] -v, --verbose verbose -f, --force force shutdown -p, --pid <pidfile> PID file
- 起動している 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 数 |
- 起動している 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 のディレクトリパス)
- 出力形式
- 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
-
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 を返す。
- filter の設定例.)
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 テスト実行用ファイル