okuyama-0.8.8リリースまとめ
okuyamaのバージョン0.8.8をリリースしたので、
今回の変更点をまとめておこうと思います。
今回の主要な追加はSerializeMapなんですが、機能は前々回と、
前回の日記にまとめたとおりです。
あの時点では(デ)シリアライザはベタ実装だったんですが、
せっかくなんでインターフェース規定して、設定ファイルから
インジェクション出来るようにしました。
取り合えずはObjectOutputStream関係を使った実装を同梱してます。
後ほど、前の記事で調査して凄く相性が良かったMessagePackを使った実装もリリースします。
インターフェースクラスは以下です。
http://sourceforge.jp/projects/okuyama/svn/view/trunk/src/okuyama/imdst/util/serializemap/ISerializer.java?view=markup&revision=706&root=okuyama
シリアライズのインターフェース下の通りで、シリアライズ対象のMapと、そのMapに格納されている
KeyとValueそれぞれのClassが渡ってきますので参考程度に利用できます。
返却値はシリアライズ処理後のbyte配列です。
public byte serialize(Map serializeTarget, Class mapKeyClazz, Class mapValueClazz);
デシリアライズのインターフェース下の通りで、先ほどのシリアライズで処理したbyte配列が引数で渡ってきます。
それをMap復元して返します。
public Map deSerialize(byte deserializeTarget);
取り合えず今のokuyamaで実装しているソースは以下です。
http://sourceforge.jp/projects/okuyama/svn/view/trunk/src/okuyama/imdst/util/serializemap/ObjectStreamSerializer.java?view=markup&revision=706&root=okuyama
この実装はシリアライズはObjectOutputStreamを利用してシリアライズしたものをZipで圧縮して、
デシリアライズはそれをZip復元後、ObjectInputStreamでMap化しています。
設定方法は、DataNode.propertiesの"DataSaveMapType"と、"SerializerClassName"の設定を使います。
DataSaveMapType=serialize <=これでSerializeMapを使う宣言になります
SerializerClassName=okuyama.imdst.util.serializemap.ObjectStreamSerializer <=実装したシリアライズクラスを指定します。
残りの追加機能はしたの通りです。
1.OkuyamaClientからもデータの有効期限を設定可能にしました。
今まででも、memcachedプロトコルであれば、有効期限は設定可能だったのですがOkuyamaClientでも
使えるようにしました。利用方法はsetValueとsetNewValueの最終引数にInteger型で有効な秒数を
渡すだけです。Integerの最大桁数まで設定可能です。
2.データ取得時に有効期限を自動的に延長するgetValueAndUpdateExpireTimeというメソッドをOkuyamaClientに追加しました。
通常のgetValueと同様の動きをするのですが、このメソッドは実行時点でそのデータの有効期限内で
あれば、最初に設定した有効期限分有効な期間が延長されます。
利用想定としてはWeb系のセッション情報などで、セッション情報にアクセスすればセッションを
破棄する時間を延ばすような場合です。
3.複数Tagを指定して紐付くKeyとValueを取得するgetMultiTagValuesメソッドをOkuyamaClientに追加しました。
今までTagへの取得系処理はKey、KeyとValueのセットどちらの場合でも指定できるTagは1つだったんですが、
それを、複数のTagを指定出来るようにしました。
取得される値はKeyとValueがセットされたMapです。
あと、複数指定なので挙動としてANDとORを指定できるようにしました。
ANDなら指定したTag全てに紐付くKey-Valueセットだけ、ORならどれかのTagに紐付いていれば取得しれます。
ただ、まだ実装があまりイケてないので、OkuyamaClientのインターフェースは変えませんが、内部実装は後々
変えるかもしれません。
4.データ一括削除機能をUtilClientに追加しました。
okuyama.imdst.client.UtilClientにokuyamaの全てのデータもしくは、指定したパーティションのデータを
一括削除する機能を追加しました。truncateのような処理です。
利用方法はしたの通りです
java -classpath ./:./classes okuyama.imdst.client.UtilClient truncatedata 192.168.1.1 8888 all
1つ目の引数は、'truncatedata'固定です。
2つ目の引数は、MasterNodeの中で、MainMasterNodeという管理を行っているMasterNodeの接続IP情報です。
3つ目の引数は、MasterNodeの起動ポート番号です。
4つ目の引数は削除する領域指定です。'all'なら全てのデータを削除、パーティション用のPrefix値ならその領域だけ削除されます。
削除はデータ量に依存して処理時間がかかります。
5.MasterNodeの設定情報を取得する機能をUtilClientに追加しました。
MasterNodeの持っている設定情報は起動後、DataNodeの追加や、MasterNodeの追加などで変化し続けます。
そこで現時点でのMasterNodeが利用している設定情報を取得する機能を追加しました。
MasterNodeの挙動がおかしい場合などこの機能でMasterNodeを起動させたまま状態診断ができます。
利用方法はしたの通りです。
java -classpath ./:./classes okuyama.imdst.client.UtilClient masterconfig 192.168.1.1 8888
1つ目の引数は、'masterconfig'固定です。
2つ目の引数は、設定情報を確認したいMasterNodeの接続IP情報です。
3つ目の引数は、MasterNodeの起動ポート番号です。
出力される情報はしたの通りで、
"998,true,MainMasterNode=[true]- MyInfo=[127.0.0.1:8888]- MainMasterNodeInfo=[127.0.0.1:8888]- AllMasterNodeInfo=[127.0.0.1:8888 127.0.0.1:8889 127.0.0.1:11211]-
CheckMasterNodeTargetInfo=- Algorithm [0]:mod [1]:consistenthash=[1]- AllDataNodeInfo=[{third=[localhost:7553 localhost:7554] sub=[localhost:6553 localhost:6554]
main=[localhost:5553 localhost:5554]}"
それぞれの意味は
"MainMasterNode=[true]":このMasterNodeがMainMasterNodeとして稼動しているかの情報
"MyInfo=[127.0.0.1:8888]]":このMasterNodeのユニーク名
"MainMasterNodeInfo=[127.0.0.1:8888]":現在のMainMasterNodeの情報
"AllMasterNodeInfo=[127.0.0.1:8888 127.0.0.1:8889 127.0.0.1:11211]":現在のokuyamaクラスタの全MasterNode情報
"CheckMasterNodeTargetInfo=":このMasterNodeが生存確認を行う必要があるMasterNodeの情報
"Algorithm [0]:mod [1]:consistenthash=[1]":現在の振り分けアルゴリズム(最後の[1]がその値)
"main=[localhost:5553 localhost:5554]":全てのDataNodeの情報
"sub=[localhost:6553 localhost:6554]":全てのSubDataNodeの情報
"third=[localhost:7553 localhost:7554]":全てのThirdDataNodeの情報
6.バグFixと性能向上をしました。
いくつかバグをFixしました。まともに動かないバグではなく、最適化系です。
リリース内容は以上です。
今回はSerializeMapが目玉なのですが、今okuyamaを利用いただいていれば、是非利用を検討してみてください。
KeyもValueもファイルを使っている場合は恩恵はありませんが、Key-Value両方もしくはKeyだけでもメモリに
載っているいるのであれば、レスポンスとのトレードオフにはなりますが飛躍的に格納できる件数が向上します。
検証を行ったところ以下の設定でKey:40byte、Value:1000byte程度のデータを1DataNodeで1億件以上格納できました。
OS:CentOS(64bit)
メモリ:4GB
CPU:Core i5
HDD:500GB×2(ソフトウェアRAID0)
KeyManagerJob1.memoryMode=false
KeyManagerJob1.dataMemory=false
KeyManagerJob1.keyMemory=true
KeyManagerJob1.keySize=20000000
KeyManagerJob1.memoryLimitSize=98
KeyManagerJob1.virtualStoreDirs=./keymapfile/virtualdata1/
KeyManagerJob1.keyStoreDirs=./keymapfile/data1/,./keymapfile/data2/
- Xmx:2880m
- Xms:2880m