Skip to content

Instantly share code, notes, and snippets.

@rimms
Last active December 26, 2015 05:18
Show Gist options
  • Save rimms/7099353 to your computer and use it in GitHub Desktop.
Save rimms/7099353 to your computer and use it in GitHub Desktop.
ZooKeeper の各ノードが期待する状態ではない時の振る舞い(案)

目的

Jubatus は ZooKeeper 上のリソースを操作するが、そのリソースが期待する状態ではなかった場合の動作について、明確な方針がない。

以下を定義する。

  • ZooKeeper 上のリソースの CRU(D) 操作に関する方針

前提条件

  • 整理した情報は 2013/10/22 時点の develop ブランチを対象とする

変更履歴

  • 2013/10/22: 第1版 作成
  • 2013/10/28: 誤記を修正 (master_lock の rlock を削除)、Issue #499 の内容を反映
  • 2015/12/22: 0.8.5 時点の情報に更新

ZooKeeper上のノード一覧

# PATH Ephemeral List Get Set 補足
1 /jubatus          
2   /config   True     jubaconfig のみ
3   /type   True     jubaconfig のみ
4   /name     True True Set は jubaconfig のみ
5 /actors          
6   /type          
7   /name          
8   /cht   True      
9   /hash True        
10 /config_lock   True      
11   /rlock_0000000001 True        
12 /wlock_0000000001 True        
13 /id_generator       True  
14 /nodes   True     MIX で利用するノードのリスト
15   /ip_port True        
16 /actives   True     Proxy からの転送で利用するノードのリスト
17   /ip_port True        
18 /master_lock   True      
19   /wlock_0000000001 True        
20 /jubaproxies          
21   /type   True      
22   /ip_port True        
23 /supervisors   True      
24   /ip_port True        

動作方針

  • 正しく動作すること保証できないケースは、処理を停止する
  • 機械学習の結果、リクエストヘ対する処理には影響を与えない かつ 復旧可能な場合は、エラーを出力の上、処理を継続する
  • 上記以外の場合は、処理を停止する or 保証しない(仕様不定とする)

作成時

既に存在する場合

  • エフェメラルノードではない場合、既に存在していても無視、処理を継続する
    • 起動時に作成するノードに関しては、プロセスの起動順序によっては、既にノードが存在する状態は起こりえる
  • 起動時に作成するエフェメラルノードは、既に存在していたら、正しく動作する保証が無いためエラーとして起動処理を停止する
    • ~/actors/type/name/nodes/ip_port
    • ~/actors/type/name/actives/ip_port
    • ~/actors/type/name/cht/hash
    • ~/jubaproxies/type/ip_port
    • ~/supervisors/ip_port
  • 各種ロック用のエフェメラルノードは ZooKeeper がシーケンスを払いだしているので、既に存在するという状況はない
    • ~/actors/type/name/*/*lock_*

親ノードが存在しない場合 (作成処理は失敗する)

  • 起動時処理中の場合は、エラーとして起動処理を停止する(単なる作成失敗と同じ扱い)
  • 起動が完了後、RPC受付やMIXを契機に作成するノードを作成できない場合は、エラーを出力し、処理を継続する
    • LinerMixer で ~/actors/type/name/master_lock が存在しない場合は、エラーを出力し処理を継続する
      • MIX処理が開始されないという状況になるだけであり機械学習の結果、リクエストヘ対する処理には影響を与えないと言える
      • ZooKeeper に入ってノードを作れば、復旧はできる
      • 即座の復旧はのぞめないため、MIX のリトライ(lock取得の再トライ)は、所定のMIX間隔後に再実行する
        • このケースは、リトライをし続けないような考慮が必要 (要実装修正)
      • ~/actors/type/name などのさらに上位の親ノードが削除されている場合は、他の理由で停止する
    • Mixer で ~/actors/type/name/actives が存在しない場合は、エラーを出力し処理を継続する
      • Proxy からの転送処理が開始されないという状況になるだけであり、nodes の情報を元にモデルを復旧することが可能
      • ZooKeeper に入ってノードを作れば、復旧はできる
        • ただし、自身が `actives` に登録されていなければ世代遅れとして振る舞うような修正が必要 (要実装修正)

参照時(データ)

ノードが存在しない場合

  • 起動時に参照するノード(現状は、config のみ)の場合は、エラーとして起動処理を停止する
    • ~/config/type/name が削除されている場合は、処理を停止する(config の読み込みに失敗と同じ扱い)
  • 起動後に参照するノード(現状は、なし)の場合は、エラーを出力し処理を停止する

参照時(list)

ノードが存在しない場合

  • 起動時に参照するノード(現状は、各種エフェメラルノード)の場合は、エラーとして起動処理を停止する
    • ~/actors/type/name/nodes が存在しない場合は、 存在しないことを確認した契機で処理を停止する (要実装修正)
  • 起動後に参照するノード(現状は、各種エフェメラルノード)の場合は、エラーを出力し処理を停止する
    • ~/actors/type/name/nodes が存在しない場合は、存在しないことを確認した契機で処理を停止する
      • Jubatus が分散構成で動作するための前提条件が崩壊した状況
      • ZooKeeper に入ってノードを作っても、エフェメラルノードは復旧できないので、クラスタの復旧は不可能
      • 現状、エフェメラルノードが削除された時点で、Expire と同じ扱いとして、Jubatus Server は順次停止が行われる
    • ~/actors/type/name/cht が存在しない場合は、存在しないことを確認した契機で処理を停止する
      • 同上 (要実装修正)
    • ~/jubaproxies/type と ~/supervisors/type は、jubactl という外部プロセス(コマンドラインツール)からしかしか参照しない
      • 情報を取得できなかったものとして、コマンドラインツールを終了する

更新時

ノードが存在しない場合

  • 起動時に更新するノード(現状は、なし)の場合は、エラーとして起動処理を停止する
  • 起動後に更新するノード(現状は、id_generator のみ)の場合は、エラーを出力し処理を停止する 要実装修正
    • 学習リクエストをリクエストを受け付けることができなくなるが、解析リクエストは受付可能な状態
    • ただし、ZooKeeper に入ってノードを作れば、見かけ上は復旧できるが、値を正しく設定しないと正常には復旧できない可能性がある
  • ~/config/type/name jubaconfig という外部プロセス(コマンドラインツール)からしか更新しない
    • 情報を更新できなかったものとして、コマンドラインツールを終了する
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment