Kestrel クイックスタート

KestrelTwitter のバックエンドで膨大なリアルタイムデータを処理している分散メッセージキューシステムです。キューに特化して高速性とコンパクト性を優先した設計となっており、JMS で規定されているようなエンタープライズ向けメッセージキューとは方向性がかなり異なります。

JMS Kestrel
トランザクション あり なし
配信形式 Point to Point,
Publisher/Subscriber
Point to Point
FIFO 強い順序付け 弱い順序付け

元々 Twitter では Starling (ムクドリ) という名で Ruby によるメッセージキューを実装していましたが、増え続けるトラフィックを捌ききれず何度もクラッシュしていたため Scala で書きなおしたという経緯があります (Twitter jilts Ruby for Scala • The Register)。memcached プロトコルを使用するのもその時の名残です。

バージョン kestrel-2.1.4
リポジトリ git://github.com/robey/kestrel.git
ライセンス Apache Licence 2
実行環境 Java SE 6 以上
プロトコル memcached
永続化 有 (ジャーナリング)
分散化 キュー名のハッシュ値による分散 (クライアントライブラリ)
冗長化 未対応?

特徴

  • Kestrel のキューは名前によって区別される (この名前がジャーナルファイル名ともなる)。
  • それぞれのキュー内ではメッセージの順序性が保たれている。ただし複数ノードにまたがった参照では順序性は保証されない。
  • メッセージの配信はメモリで動作するが、データ欠損なしにシャットダウンや移動が行えるようジャーナリングされている。
  • Kestrel ノードのクラスタmemcachedクラスタと似ている。
  • アプリケーションへの組み込みが可能。

ダウンロードから起動まで

現在の最新版 Kestrel 2.1.4 を CentOS 5.6 上で起動します。

  1. kestrel-2.1.4.zip をダウンロードして解凍。
  2. 解凍後のディレクトリ kestrel-2.1.4/ を /usr/local/kestrel へ移動。これは起動シェルが /usr/local/kestrel/current 前提で動くため。
  3. シンボリックリンク /usr/local/kestrel/current を作成し /usr/local/kestrel-2.1.4 へ向ける。
  4. /usr/local/kestrel/current/scripts/kestrel.sh に実行権限を与える。
torao@clove$ wget "http://robey.github.com/kestrel/download/kestrel-2.1.4.zip"
 --2012-01-02 20:00:01--  http://robey.github.com/kestrel/download/kestrel-2.1.4.zip
Resolving robey.github.com... 207.97.227.245
Connecting to robey.github.com|207.97.227.245|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 17368814 (17M) [application/zip]
Saving to: `kestrel-2.1.4.zip'

100%[================================================>] 17,368,814   529K/s   in 35s

2012-01-02 20:00:36 (488 KB/s) - `kestrel-2.1.4.zip' saved [17368814/17368814]
torao@clove$ sudo unzip kestrel-2.1.4.zip
[sudo] password for torao:
Archive:  kestrel-2.1.4.zip
  inflating: kestrel-2.1.4/config/development.scala
  inflating: kestrel-2.1.4/config/production.scalatorao@clove$ sudo mkdir /usr/local/kestrel
[sudo] password for torao:
torao@clove$ sudo mv kestrel-2.1.4 /usr/local/kestrel/
torao@clove$cd /usr/local/kestrel
torao@clove$ sudo ln -s kestrel-2.1.4 current
torao@clove$ sudo chmod 755 kestrel-2.1.4/scripts/*.sh

さっそく起動したいところですがデフォルトの script/kestrel.sh では daemon コマンドを使用しています。RedHat 系の CentOSdaemon コマンドがありませんので起動シェルの中身を参考に直接 Java コマンドを実行します。

torao@clove$ sudo java -Xmx4096m -Xms1024m -XX:NewSize=768m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintHeapAtGC -Xloggc:/var/log/kestrel/gc.log -XX:ErrorFile=/var/log/kestrel/java_error%p.log -server -Dstage=production -jar kestrel-2.1.4.jar &

長々としていますが殆どが GC やヒープの使い方に関するオプションですので、多分 java -Dstage=production -jar kestrel-2.1.4 & だけでも動くと思います。

起動した Kestrel は 22133 ポートで接続待機しています。telnet で接続し memcached コマンドを実行してみます (外部から接続する場合はファイアウォールで接続許可を与えて下さい)。コマンドについては Kestrel Github Document の Memcache commands に記述されています。

torao@safran$ telnet clove 22133
Trying 192.168.51.0...
Connected to clove.bjorfuan.com (192.168.51.0).
Escape character is '^]'.
set torao 0 0 5
ABCDE
STORED
set torao 0 0 10
0123456789
STORED
get torao
VALUE torao 0 5
ABCDE
END
get torao
VALUE torao 0 10
0123456789
END
get torao
END
get torao/t=1000
END
quit
Connection closed by foreign host.

問題なさそうです。