怒涛の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
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
Future Cluster Enhancements and Additions Goal
今後の実装で入る予定.この記事を書いている時点では,2.3.xなので,それ以降に入るのではないか.