Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Akka Cluster Split Brain Resolver 実機検証

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
Avatar for cwkajiwara cwkajiwara
October 17, 2020

Akka Cluster Split Brain Resolver 実機検証

Avatar for cwkajiwara

cwkajiwara

October 17, 2020

Other Decks in Programming

Transcript

  1. 目次 - Akka Clusterとは - Split Brain とは - Split

    Brain Resolverとは - なぜ実機でやるのか - 実機検証開始 - SBRのない世界 - SBRのある世界 3
  2. Akka Cluster とは https://doc.akka.io/docs/akka/current/typed/cluster.html Akka拡張 - Akka Actorのクラスタを構築できるようになる - クラスタメンバのメンバーシップ管理

    - Phi Accrual Failure Detectorで死活監視、Gosship Protocolで非中央集権的 なクラスタ形成を可能にしている Chatworkでは、Akka Cluster + Akka Cluster Sharding を使う予定 - データ不整合を起こさないためにSplit Brainを防ぐ必要がある - 一意な識別子を持つアクターがAkka Cluster 上に1つしか存在しないよ うにする 4
  3. Split Brainとは Clusterが、ネットワーク分断などにより分割され、お互いがお互いをDownしたものと して2つ以上のクラスタが動き続けてしまう状態 - データの不整合を引き起こす可能性がある(どちらのクラスタも自身の状態に応じ てデータの永続化を行っている場合など) Unreachableノードの原因 - ノード故障

    - ハードウェア故障 - アプリケーションエラー - ネットワーク分断 他のノードからレスポンス(ハートビート)が返ってこない 原因が何かは判断できない! - タイムアウトでも実は処理が間に合わなかったの かもしれない 5
  4. Split Brain Resolverとは Split Brain が起きた時に設定したDowning戦略に従って他のノードの管理を行うアク ター Strategyの種類 - Keep-oldest(今回検証予定)

    - Reachable側にoldestノードがいるかどうかで判断する - Keep-Majority - Reachable側のノード数が過半数かどうかで判断する - Keep-Refree - Reachable側にRefreeノードがいるかで判断する … 6
  5. Split Brain Resolverとは 設定方法 - 以下の設定を追加する 7 akka.cluster.downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"

    akka.cluster.split-brain-resolver.active-strategy = keep-oldest # Strategyごとのconfigを追加する akka.cluster.split-brain-resolver.keep-oldest { # クラスタの分割が oldest : それ以外 のようになった場合は oldestを停止する down-if-alone = on }
  6. なぜ実機でやるのか 各ノードからネットワークを切ればよいんじゃないか - route add(del) -host x.x.x.x reject をノードで実行して通信を遮断(復旧)させる -

    コマンド実行ユーザにroot権限が必要になる( = production環境での設定と変わっ てしまうかもしれない) ノードを落とせばよいのではないか - ノード故障を再現するにはcoordinated shutdownを無効化にしないといけない( = production環境での設定と変わってしまうかもしれない) 9
  7. 検証環境 Kubernetes クラスタ - Raspberry Pi * 4 (Kubernetes master

    * 1, Kubernetes worker * 3) - ブリッジ (Pis を繋ぐ用) Akka Cluster - 1 node に 1 pod に固定(anti-affinity) - コードはakka-sampleから取得(Split Brain Resolverの設定だけ追加) 12
  8. 検証項目 • down-if-aloneあり ◦ 通信遮断 ▪ リーダーノード以外 ▪ リーダーノード ◦

    ノード故障 ▪ リーダーノード以外 ▪ リーダーノード • down-if-aloneなし ◦ 通信遮断 ▪ リーダーノード以外 ▪ リーダーノード ◦ ノード故障 ▪ リーダーノード以外 ▪ リーダーノード 16
  9. 注意点 今回の環境だと検証できないSplit Brain Resolverの挙動があります - Indirectly Connected Node (https://doc.akka.io/docs/akka/current/split-brain-resolver.html#indirectly -connected-nodes)

    - Node 1 -> Node 2 は疎通していないが、 Node 1 -> Node 3 -> Node 2 の経路であれば通信できる、といったように間接的につながっている状態 - SBRではDownの対象 Kubernetes上であれば Node 1 -> Node 2 の通信だけを遮断するといったことが可能 なので、再現することができます。 17