KZKY memo

自分用メモ.

怒涛のAkka: Cluster Specification

初めに,これは忘れてはいけない

Akka Cluster provides a fault-tolerant decentralized peer-to-peer based cluster membership service with no single point of failure or single point of bottleneck. It does this using gossip protocols and an automatic failure detector.

  • fault-tolerant
  • decentralized
  • peer-to-peer cluster
  • no SPOF
  • no SPOB
  • using gossip protocol
  • automatic failure detector

Terms

  • node: hostname:port:uid tupleで定義されている論理的なメンバ.1台の物理マシンに複数ノードがいてもいい
  • cluster: membership service
  • leader: 1ノードがリーダとなる.クラスタのコンバージェンス,パーティショニング,フェイルオーバー,リバランシングなどをマネージする (convergenceのみインプリされている)

Membership

  • nodeのidentifierは,hostname:port:uid tuple
  • cluster membershipとアプリケーションのpartitioning(未実装)はdecoupleされている
  • 一度clusterから除かれたactor systemは,再度clusterにjoinできない.
  • joinするには,actor systemをrestartさせないとならない, i.e., hostname:portは同じだが,uidが異なる.uidはremote death watchをトリガーするのに使用されるので.

Gossip

clusterのmembershipはgossip protocolでコミュニケーションする.これは,Dynamo, Riakと同じ.

Vector Clock

gossip protocolにて使用されるデータ構造とアルゴで,distro-systemのイベントの部分順序を決定し,因果関係の乱れを検知する

参考をちゃんと読むと参考になる.(よく分かっていないが)Vector Clockアルゴリズムは,部分順序の特性を持っていることが重要なのだと思う.

Gossp Convergence

クラスタに関する情報は,ある時,あるノードで,局所的に収束する.あるノードがunreachableだったら,gossip convergenceは起こらない.これは,leader nodeしかblockしないので,applicationには影響しない.unreachableの状態のノードは,reachable, down, removedの状態にならないとならない.

Failure Detector

あるノードが他の残りのノードからunreachableであると検知する.reachableの検知も行う.検知には,Hayashibara-sanのphi値 (尤度)を使って判断している.
thresholdがあって,大きいと誤検知が少なくなるが,実際のクラッシュを検知するのに時間がかかる.defaultは8, cloud環境 (EC2)なら12くらいがいい.

unreachable状態は,gossip protocalでcluster membersに伝わっていくので,たった1つのノード (書いてないけどfailure detectorか?)があるノードをunreachableとすればいい.モニターするノード (書いてないけどfailure detectorか?)は,hashされた順序付きのノードリングの隣から選ばれる.これは,rackとかdatacentorをまたぐが,オーダーは全てのノードで同じなので,最終的に完全に収束する(よくわからん)

ハードビート感覚は1sec.

sysmte messegesが(unreachable nodeに)届かなくなると,そのノードは隔離されて,down, removedになる.

Leader

gossip convergenceが起こった時に,任意のノードがleaderに選択される.convergence roundで変わることがある.(convergenceの時に?)リーダはsorted order (Vector clockの?)の初めのノードがなる.リーダの役割は,exiting -> removed, joining -> upなののノードの状態変化を行う.アクションがとられるのは,現状インプリではgossip convergenceの時のみ.unreachableのノードを時間が来たら強制的にdownにする権限も持つ.

Seed Nodes

新しいノードがクラスターに参加する際のエントリノード.クラスタに参加したいときは,全シードノードにメッセージを投げて,一番早くレスをくれたノードにjoin commandを送る.実はseed nodes以外のどのノードにもjoin commandは送れる.

Gossip Protocol

push-pull gossipの亜種が使用されている.Akkaは,versiningのためのvector clockにともに1つだけshared stateを使う.実際のstateは送らないで,現在のversionsの要約を送る.gossipの受け取り手は,newer versionを持っている時は,適当な値を送リ返す.outdated versionを持っている場合は,値をリクエストする.コンフリクトがあったら,versionをマージして,送り返す.
versionを利用して,必要なときにだけ実際の状態を送るようにしている.

gossipするノードはランダムで選ばれる.ただし,現在のversionが分かっていないノードセットに偏っている.0.8の確率でそこから選択し,そうでなければ,ランダム.400 nodesを超えてくるクラスターでは,0.8から徐々に下げていったほうがいい.

gossip messageはprotobufでserializedされていて,さらにgzipされている.

Membership Lifecycle

ノードはjoiningの状態から始まる.他全てのノードがそれをみる(gossip conversion)と,leaderがjosining -> upにする.ノードがleavingになって,他全てのノードがそれをみる(gossip conversion)と,leaderがleaving -> exitingする.他全てのノードがそれをみる(gossip conversion)と,leaderがexiting -> removedにする.

ノードのstateがunreachableだと,gossip convergenceが起こらないので,leaderはなにもactionが取れない.unreachable -> reachable or unreachable -> downにするしかないので,そのために,auto-downの機能がある.ある時刻unreachableならunreachable -> downに自動でなる.

State Diagram for the Member States

f:id:KZKY:20151001230122p:plain

Future Cluster Enhancements and Additions Goal

今後の実装で入る予定.この記事を書いている時点では,2.3.xなので,それ以降に入るのではないか.