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