CentOS に Kestrel をインストールして試す 1

環境: CentOS5.5

Kestrel は Twitter謹製のメッセージキューサーバー。

特徴は

  • 速い → JVM上で動く。
  • 小さい → scalaで約2,500行。nettyを使ってる。
  • 耐障害性 → メッセージを失わないようファイルシステムにジャーナルを記録している。
  • 信頼性 → キューから取り出したメッセージの処理漏れを防ぐことができる。

とのこと。
また kestrel との通信は3つのプロトコルが用意されている。

  • memcache: the memcache protocol, with some extensions
  • thrift: Apache Thrift-based RPC
  • text: a simple text-based protocol

前準備

Java をインストールしておく。

インストール

ここからビルド済みバイナリをダウンロードする。
http://robey.github.com/kestrel/

現在最新の kestrel 2.3.1 を落としてきた。

$ wget http://robey.github.com/kestrel/download/kestrel-2.3.1.zip
$ unzip kestrel-2.3.1.zip

設定ファイルはconfディレクトリにある。

$ ls -l kestrel-2.3.1/config
development.scala
production.scala

サーバ起動

$ cd kestrel-2.3.1
$ sudo java -jar kestrel_2.9.1-2.3.1.jar &
[1] 9672

ログファイルを確認する。
デフォルトでは /var/log/kestrel に出力されている。
起動時のログは以下のこんな感じ。

$ less /var/log/kestrel/kestrel.log

INF [20120719-16:59:56.538] stats: Starting LatchedStatsListener
INF [20120719-16:59:57.025] admin: Starting TimeSeriesCollector
INF [20120719-16:59:57.043] admin: Admin HTTP interface started on port 2223.
INF [20120719-16:59:57.050] kestrel: Kestrel config: listenAddress=0.0.0.0 memcachePort=Some(22133) textPort=Some(2222) queuePath=/var/spool/kestrel expirationTimerFrequency=Some(1.seconds) clientTimeout=None maxOpenTransactions=100 connectionBacklog=None
INF [20120719-16:59:57.263] kestrel: Starting up background expiration task.
INF [20120719-16:59:57.277] kestrel: Starting background-expiration
INF [20120719-16:59:57.379] kestrel: Kestrel 2.3.1 started.

4つのポートを使っている。
memcacheListenPort -> 22133
textListenPort -> 2222
thriftListenPort -> 2229
admin.httpPort -> 2223

このへんはさきほどの設定ファイルで設定している。
2223のAdmin画面は現状なにも用意されていない。今後追加するかもってメッセージが書いてあるだけ。

動作確認

http://yuroyoro.hatenablog.com/entry/20090803/1249297348
を参考に memcached プロトコルを使ってキューにメッセージを入れたり出したりしてみる。

telnetコマンドで接続。

$ telnet localhost 22133
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

memcached コマンドは以下フォーマット

set <キー> <フラグ> <有効期間> <サイズ>

2つメッセージをキュー入れる。
キー名は foo とする。
memcached のキー名が、kestrel のキュー名に相当。

set foo 0 0 3
aaa
STORED

set foo 0 0 4
bbbb
STORED

今度はキューから2つのメッセージを取り出す。

get foo
VALUE foo 0 3
aaa
END

get foo
VALUE foo 0 4
bbbb
END

問題なく動作した。


/var/log/kestrel ディレクトリに foo というバイナリファイルができていた。
これがジャーナルなのかな。


サーバを落として終了。

kill 9672


参考:
http://samuraism.jp/diary/2011/11/20/1321770660000.html
http://blog.asial.co.jp/875