okuyama0.6.0をリリース「分散ロック機能」を追加しました

okuyama Ver0.6.0をリリースしました。
今回の追加機能は、分散ロックです。
詳しい機能はokuyamaリリース物のReadMe.txtを抜粋。

                                                                                                                                                                                                                            • -

 ■分散ロック機能を追加
  +任意のデータをロックする機能を追加。
  +分散ロック機能はマスターノード用設定ファイルである、MasterNode.propertiesの9行目の"TransactionMode=true"で
    ロック機能が使用可能となる。
    また、72行目の"TransactionManagerInfo=127.0.0.1:6655"でTransactionManagerノードを指定する必要がある
    そして、TransactionManagerノードが起動している必要があるため、同梱のexecTransactionNode.batで起動する。
    分散ロック機能を使用する場合は、全てのマスターノードが"TransactionMode=true"で起動している必要がある。
    同梱の設定ファイルは全て分散ロック機能で起動する設定となる。
    ※execMasterNode2.batは分散ロック機能あり、memcacheプロトコルモードで起動する。
    また、従来の分散ロック機能なしで起動する場合は、"TransactionMode=false"としてexecMasterNode.batを実行する。


  +仕組みとしては、Clientからロック取得依頼を行った場合、TransactionManagerノードに指定したKey値で
    ロック情報を作り上げる。この際、すでに別Clientから同一のKey値でロックが取得されている場合は、
    指定した時間の間、ロックが解除されるのを待ち、取得を試みる。
    ロックされた値に対して、set,remove系のアクセスを行った場合は、TransactionManagerノードに対して該当の
    Key値が、リクエストを発行したClient以外からロックされているかを問い合わせて、別クライアントがロック
    している場合は、ロックが解除されるのを待ち続ける。
    同クライアントがロックしているもしくは、ロックがない場合は、そのまま処理を続行する。
    ロックのリリースも同じ動きである。
    なお、分散ロック機能を有効にした場合は、無効時と比べ1回通信が多く発生するため、処理速度は落ちる。
    また、TransactionManagerノードがSPOFとなるが、機能していない場合は無視して稼動するが、
    処理速度は極端に劣化する。
    今後、SPOFとならないように改善予定である。




  +以下は説明となる
    *ロックを実施したデータの挙動は以下となる。
   ・ロック可能なKey値(データ)は現在登録済みであっても、登録されていなくても可能である。
   ・1クライアントから同時に複数のデータをロック可能である
   ・ロックしたデータはロックを実施したクライアントからのみロック解除可能である。
   ・ロック中のデータはロックを実施したクライアントからのみ登録可能である。
   ・ロック中のデータはロックを実施したクライアントからのみ変更可能である。
   ・ロック中のデータはロックを実施したクライアントからのみ削除可能である。
   ・ロック中のデータは全クライアントから参照可能である。


    *ロック機能使用開始メソッドは以下である。
   ・クライアントのメソッド名:startTransaction
   ・引数なし
   ・戻り値:boolean  true:スタート成功  false:スタート失敗
    ※ロック機能有りでTransactionManagerノードを起動していない場合は、スタートに失敗する。
  
     
    *ロックメソッドへの引数と戻り値は以下である。
   ・クライアントのメソッド名:lockData
   ・引数1:ロック対象Key値
    引数2:ロック継続時間
       (ロック解除を行わない場合でも、ここでの設定時間が経過すると自動的に解除される。
         単位は秒。
         0を設定するとロックを実施したクライアントが解除するまで永久にロックされる。
         ※0指定は推奨しない)
    引数3:ロック取得待ち時間
       (既に別クライアントがロック中のデータへロックを実施した場合に、設定時間の間ロック取得をリトライする。
         単位は秒。
         0を設定すると1回ロックを試みる)


   ・戻り値:String配列
         String配列[0]:Lock成否  "true"=Lock成功  or  "false"=Lock失敗
  
    *ロック開放への引数と戻り値は以下である。
   ・クライアントのメソッド名:releaseLockData
   ・引数1:ロック対象Key値  
   ・戻り値:String配列
         String配列[0]:開放成否  "true"=開放成功  or  "false"=開放失敗


    *ロック機構使用終了メソッドは以下である。
   ・クライアントのメソッド名:endTransaction
   ・引数なし
   ・戻り値なし


  +Java版、PHP版のクライアントからは、ロック、リリース両方が可能
    Memchacheクライアントはロック、リリース機能は利用できないが、Lock中のデータにsetを実行した場合は"待ち状態"に入る。

                                                                                                                                                                                                                            • -





構成は以下のようになりました。





最初はロック情報もデータノードに持たせようとしたけど、ややこしくなりすぎるのと、
データと、それ以外の情報は別管理のほうが後々良いということで、別ノード立てました。
ロック機能を使用しても性能はそんなに悪くないので、まあまあ良いかと。


これで分散トランザクションの準備は50%くらいかな。。。
ぼちぼちやっていきます。




okuyamaを会社の業務で使い始めたので、そっちからのフィードバックも今後は有益な情報になりそう!!