Skip to content

Instantly share code, notes, and snippets.

@suma
Forked from rimms/01_summary.rst
Created October 28, 2013 04:36
Show Gist options
  • Save suma/7191509 to your computer and use it in GitHub Desktop.
Save suma/7191509 to your computer and use it in GitHub Desktop.

目的

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

以下を定義する。

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

前提条件

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

変更履歴

  • 2013/10/22: 第1版 作成

ZooKeeper上のノード一覧

# PATH Ephemeral List Get Set
1 /jubatus        
2   /config   True    
3   /type   True    
4   /name     True True
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    
16   /ip_port True      
16 /master_lock   True    
17   /rlock_0000000001 True      
18 /wlock_0000000001 True      
19 /jubaproxies        
20   /type   True    
21   /ip_port True      
22 /supervisors   True    
23   /ip_port True      
  • 補足
    • type : classifier, recommender のような 機械学習タスク名
    • name : 起動時の -n, --name オプションに指定する クラスタ名
    • ip_port : IPアドレス + "_" + ポート番号 で表現される文字列 ex) 192.168.1.1_918
    • hash : CHT によりハッシュ化された文字列
    • List列 : PATHヘ対するリストの参照有無
    • Get列 : PATH 内のデータの参照有無
    • Set列 : PATH 内のデータの更新有無

動作方針

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

作成時

既に存在する場合

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

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

  • 起動時処理中の場合は、エラーとして起動処理を停止する(単なる作成失敗と同じ扱い)
  • 起動後に作成するノード(現状は、master_lock用のエフェメラルノード のみ)を作成できない場合
    • ~/actors/type/name/master_lock が存在しない場合は、エラーを出力し処理を継続する
      • MIX処理が開始されないという状況になるだけであり機械学習の結果、リクエストヘ対する処理には影響を与えないと言える
      • ZooKeeper に入ってノードを作れば、復旧はできる
      • 即座の復旧はのぞめないため、MIX のリトライ(lock取得の再トライ)は、所定のMIX間隔後に再実行する
      • ~/actors/type/name などのさらに上位の親ノードが削除されている場合は、他の理由で停止する

参照時(データ)

ノードが存在しない場合

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

参照時(list)

ノードが存在しない場合

  • 起動時に参照するノード(現状は、なし)の場合は、エラーとして起動処理を停止する
  • 起動後に参照するノード(現状は、各種エフェメラルノード)の場合は、エラーを出力し処理を停止する
    • ~/actors/type/name/nodes が存在しない場合は、存在しないことを確認した契機で処理を停止する
      • Jubatus が分散構成で動作するための前提条件が崩壊した状況
      • ZooKeeper に入ってノードを作っても、エフェメラルノードは復旧できないので、クラスタの復旧は不可能
      • エフェメラルノードが削除された時点で、Expire と同じ扱いにするのが理想だが、そもそもの状況から考えると、そこまでの作りこみは行わず、検知した契機で、原因を出力して、順次停止していけば良いと考える
    • ~/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