SlideShare a Scribd company logo
1 of 37
Akka Clusterの
耐障害設計
安田裕介
Scala 関西 2016
スピーカーノート
https://github.com/TanUkkii007/blog/blob/master/akka_cluster_resilience.md
自己紹介
• 安田裕介
• @TanUkkii007
• 東京でScalaの仕事をしています
• Akka 好き
Akka Clusterの適用領域
Basically
Soft state
Eventually consistent
Available
client-facingで
な分散システム
Akka Clusterを使う利点
• 位置透過性
• サービスの成長に合わせてスケール戦略を切り替えら
れる
• スケール戦略が変わってもコードが変わらない
• エコシステム
• シャーディングやレプリケーションなど、分散システ
ムでよく用いるアルゴリズムを実装した拡張がある
Akka Clusterの基本
Akka Clusterとは?
• クラスターのメンバーシップ管理を行うAkka拡張
• Amazon Dynamoやriakに影響を受けている
• gossipプロトコルによるメンバーの状態伝播と、
failure detectorによる障害検知を可能にする
failure detector
• クラスターのメンバーは互いにハー
トビートを送り合っている
• failure detectorはハートビートをも
とにメンバーの生死を推測する
• 生きているメンバーはreachable、
死んでいるメンバーはunreachable
とマークする
gossipプロトコルと
メンバーシップライフサイク
ル
• メンバーには状態があり、gossipプロトコルで他のメン
バーと状態を同期する
• gossip収束時に一意に決まるリーダーという役割がある
• リーダーがメンバーの状態を変える行為をリーダーアク
ションという
• クラスターに参加するメンバーはjoining状態から始まる
• リーダーはjoining状態のメンバーをup状態にし、クラス
ターに参加させる
• down状態になったメンバーは、リーダーによって
removed状態にされ、クラスターから取り除かれる
doc.akka.io
Akka Clusterの
耐障害性設計
故障の単位:プロセス
• 故障の単位をプロセスという
• アクタープログラミングではプロセスはアクター
• この発表ではAkka Clusterの1ノードをプロセスとする
• つまりAkka ClusterのUNIXプロセスと同義
故障の種類
クラッシュストップ故障
オミッション(切り捨て)故障
クラッシュ・リカバリー故障
ビザンチン(任意)故障
Reliable and secure distributed programming, Ch.2
クラッシュストップ故障
オミッション(切り捨て)故障
クラッシュ・リカバリー故障
ビザンチン(任意)故障
Reliable and secure distributed programming, Ch.2
クラッシュストップ故障
クラッシュストップ故障
• 正常に処理を実行していたプロセスがある時刻以降
処理を停止して2度と戻らない故障
• 故障のなかでもっとも単純
• Akka Clusterのレイヤーで考えなければならない故
障のほぼ全てはこれ
クラッシュストップ故障で
停止する処理
• unreachableなメンバーがいると、gossipプロトコルで状
態を完全に同期できない(gissip非収束状態)
• クラスターの状態を変えるリーダーアクションが行えな
くなる
• →メンバーの追加ができない
gossip非収束状態の解決
• unreachableなメンバーのハートビート
が回復してfailure detectorによって再び
reachableになる
• unreachableなメンバーをdown状態にす
る
クラスターのメンバーがクラッシュストップ故障を起こすと、そのメ
ンバーにgossipプロトコルによってクラスターの状態を伝播できなく
なる。このときgossipは収束しない。
gossipの非収束を解決する方法
doc.akka.io
Auto-downing
• デフォルトではunreachableなメンバーを自動的に
down状態にはしない
• リーダーがunreachableなメンバーを指定時間後に
自動的にdownする機能にauto-downがある
• auto-downは使ってはならない
_人人人人人人人人_
> <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
doc.akka.io
なぜauto-downを
使ってはならないのかを考える
根本的な問題は、failure detectorがメンバーを
unreachableと判定したとき、そのメンバーは本当に死
んでいるのか、ネットワーク遅延や分断なのか、GCや
負荷による遅延なのかが分からないということ。
この問題が分散システムを難しくしている理由の1つ。
downしたメンバーが実は生きていた場合、split brain問
題がおきる。
split brain問題
• failure detectorがメンバーを死と推
定したとしても、実際には生きてい
る場合がある
• 生きているメンバーをクラスターか
ら分離すると、結果的にクラスター
が分裂する問題をsplit brain問題とい
う
• 分離したクラスターの状態は同期出
来ず、誤った情報をクライアントや
DBに伝える
リーダーの決定
• リーダー選出という過程はない
• 各メンバーがgossipプロトコルで同期されたメンバーリストから独立に決める
• リーダーはunreachableでないメンバーのうちUpとLeaving状態のものを優先的に選択し、アドレス順に並べて先頭のもの
/**
* Up|Leaving, Joining, Exiting, Downの順に並べ先頭のものがリーダー。同じ状態の場合最小のアドバイスのものを選ぶ。コードは以下を参照。
* https://github.com/akka/akka/blob/v2.4.10/akka-cluster/src/main/scala/akka/cluster/Gossip.scala#L190-L196
*/
val leader = reachableMembers.min(Ordering.fromLessThan[Member] { (a, b) ⇒
(a.status, b.status) match {
case (as, bs) if as == bs ⇒ Member.addressOrdering.compare(a.address, b.address) <= 0
case (Down, _) ⇒ false
case (_, Down) ⇒ true
case (Exiting, _) ⇒ false
case (_, Exiting) ⇒ true
case (Joining, _) ⇒ false
case (_, Joining) ⇒ true
case _ ⇒ Member.addressOrdering.compare(a.address, b.address) <= 0
}
})
auto-downが引き起こすsplit brain
split brain問題を解決するには
• リーダーよりも整合性の高い方法で決定でき、
downを果たせる役割は何か?
• 2つ以上に分割される場合、どれが正しいクラスタ
ーなのか?
• 正しくないクラスターを決めたとして、そのメンバ
ーをどうすべきか?
split brain resolver
• Keep Reference
• Keep Oldest
• Static Quorum
• Keep Majority
• Lightbend Reactive Platform
• TanUkkii007/akka-cluster-custom-downing
split-brain-resolverのストラテジ
Keep Oldest
• 最古のメンバーがいる側を正のクラスターとする
• 最古のメンバーとは起動時のタイムスタンプがもっとも小さいもの
• そうでない側のメンバーは自らシャットダウンする
• unreachableなメンバーをdownする役割は最古メンバーが担う
• 最古のメンバーはgossip非収束時にも一意に決まる(※例外あり)
• 可用性の点で問題あり。最古のメンバーが故障した場合、全クラスター
がシャットダウンする。(オプションで回避可能)
val oldest = members.filterNot(_.status == Removed).min(Member.ageOrdering)
Keep Oldest
Static Quorum
• 残存メンバーがquorum sizeに満たない場合、そのメンバーを
downしする
• 他のメンバーをdownする役割はリーダーが担う
• quorum-size * 2 - 1を超えるメンバーを追加しない限りsplit brainは
おきない
• quorum-sizeと総ノード数で可用性を調節可能
• メンバーの数を固定しなければならない点が弱点。quorumを適用
するロールを限定して他のロールのメンバー数を動的にすると良
い。
Static Quorum
FLP Impossibility
“非同期なシステムにおいては、
ただ1つのプロセスが故障しただけでも、
完璧に合意できる分散アルゴリズムは存在しない”
Fisher, Lynch, Paterson (1985) Impossibility of
Distributed Consensus with One Faulty Process
完璧なsplit brain resolverのストラテジはない
オミッション(切り捨て)故障
クラッシュ・リカバリー故障
ビザンチン(任意)故障
Reliable and secure distributed programming, Ch.2
オミッション(切り捨て)故障
クラッシュストップ故障
オミッション(切り捨て)故障
• プロセスが送るべきメッセージを送らない、あるいは
受信するべきメッセージを受信できない故障
• プロセスがクラッシュした場合も送るべきメッセージ
を送れないので、オミッション故障はクラッシュスト
ップ故障のより一般的な場合と見ることができる
Akka Remoteにおける
オミッション故障
• システムメッセージを送信できず、ローカルとリモートのアクターシ
ステム間の状態が同期できなくなったときにオミッション故障となる
• システムメッセージには、リモートスーパーバイザーに管理されたア
クターのライフサイクルイベント、watchによる死活監視、リモート
アクターのデプロイメントがある
• このときAkka Remoteの状態はquarantinedになり、そのメンバーは
unreachableから戻ってこれなくなる
• split brain resolverを使用している場合、unreachableなメンバーはク
ラスターから取り除かれ、取り除かれたメンバーはシャットダウンす
る→クラッシュストップ故障と全く同じ扱いになる
オミッション(切り捨て)故障
クラッシュ・リカバリー故障
ビザンチン(任意)故障
Reliable and secure distributed programming, Ch.2
クラッシュ・リカバリー故障
クラッシュストップ故障
クラッシュ・リカバリー故障
• プロセスがクラッシュしただけでなく、そこからリ
カバリーできない、あるいはクラッシュと再起動を
繰り返してしまう故障
• リカバリーできない場合、送るべきはずのメッセー
ジを送れないので、オミッション故障と見ることも
できる
Akka Clusterにおける
クラッシュ・リカバリー故障
• クラッシュして取り除かれたノードが再起動してク
ラスターに再加入することを前提としていない
• クラッシュ・リカバリー故障はおきない
メンバーの識別
• Akka Clusterはメンバーをhostname:port:uidの3つの識別子で
認識する
• uidはアクターシステム起動時に発行されるユニークなID
• ホストとポートが同じでも、再起動した後ではuidが異なる
• つまりクラッシュして再起動したプロセスは、以前のプロセス
と別物と認識される
• →新しくクラスターに加入することと全く同じ:クラッシュ・
リカバリー故障はおきない
蘇り(incarnation)ノード
• Q: クラッシュしたメンバーはunreachableとなってリーダーアクションが
とれなくなるため、再起動してもノードがクラスターに再加入できるの
か?
• A: できる
• クラスターのメンバーと同じホスト:ポートのペアをもつメンバーが加
入(joining)してきた場合、リーダーは古いメンバーを自動的にdownす
る
• 同じホスト:ポートのペアをもつメンバーが同時に2つ存在することは
ありえない。古いメンバーはクラッシュしたことをリーダーは判断でき
る。
• auto-downやsplit brain resolverを使わなくてもこの機能は働く
再起動が引き起こす
split brain問題
正しい第一seed設定
再起動が引き起こす
split brain問題
誤った第一seed設定

More Related Content

What's hot

SQL+NoSQL!? それならMySQL Clusterでしょ。
SQL+NoSQL!? それならMySQL Clusterでしょ。SQL+NoSQL!? それならMySQL Clusterでしょ。
SQL+NoSQL!? それならMySQL Clusterでしょ。yoyamasaki
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するaktsk
 
クックパッドでのVPC移行について
クックパッドでのVPC移行についてクックパッドでのVPC移行について
クックパッドでのVPC移行についてSugawara Genki
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
[A31]AWS上でOracleを利用するためのはじめの一歩!by Masatoshi Yoshida
[A31]AWS上でOracleを利用するためのはじめの一歩!by Masatoshi Yoshida[A31]AWS上でOracleを利用するためのはじめの一歩!by Masatoshi Yoshida
[A31]AWS上でOracleを利用するためのはじめの一歩!by Masatoshi YoshidaInsight Technology, Inc.
 
MySQL Technology Cafe #12 MySQL Database Service - High Availability Update
MySQL Technology Cafe #12 MySQL Database Service - High Availability UpdateMySQL Technology Cafe #12 MySQL Database Service - High Availability Update
MySQL Technology Cafe #12 MySQL Database Service - High Availability Updateオラクルエンジニア通信
 
MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良Shinya Sugiyama
 
awsで実現するミッションクリティカル業務のクラウド利用
awsで実現するミッションクリティカル業務のクラウド利用awsで実現するミッションクリティカル業務のクラウド利用
awsで実現するミッションクリティカル業務のクラウド利用Ken Sawada
 
AWS Black Belt Techシリーズ AWS Elastic Beanstalk
AWS Black Belt Techシリーズ  AWS  Elastic  BeanstalkAWS Black Belt Techシリーズ  AWS  Elastic  Beanstalk
AWS Black Belt Techシリーズ AWS Elastic BeanstalkAmazon Web Services Japan
 
StackStorm で実現する、複数システムに対する統一インターフェイス提供と運用一元化の取り組み - OpenStack最新情報セミナー(2017年3月)
StackStorm で実現する、複数システムに対する統一インターフェイス提供と運用一元化の取り組み - OpenStack最新情報セミナー(2017年3月)StackStorm で実現する、複数システムに対する統一インターフェイス提供と運用一元化の取り組み - OpenStack最新情報セミナー(2017年3月)
StackStorm で実現する、複数システムに対する統一インターフェイス提供と運用一元化の取り組み - OpenStack最新情報セミナー(2017年3月)VirtualTech Japan Inc.
 
CloudWatch Eventsを使った ECSのAutoScaling
CloudWatch Eventsを使ったECSのAutoScalingCloudWatch Eventsを使ったECSのAutoScaling
CloudWatch Eventsを使った ECSのAutoScaling淳 千葉
 
20150920 中国地方db勉強会
20150920 中国地方db勉強会20150920 中国地方db勉強会
20150920 中国地方db勉強会yoyamasaki
 
Amazon ElastiCache(初心者向け 超速マスター編)JAWSUG大阪
Amazon ElastiCache(初心者向け 超速マスター編)JAWSUG大阪Amazon ElastiCache(初心者向け 超速マスター編)JAWSUG大阪
Amazon ElastiCache(初心者向け 超速マスター編)JAWSUG大阪崇之 清水
 
Running Kubernetes on Azure
Running Kubernetes on AzureRunning Kubernetes on Azure
Running Kubernetes on AzureMasaki Yamamoto
 
45分で作る Java EE 8 システム
45分で作る Java EE 8 システム45分で作る Java EE 8 システム
45分で作る Java EE 8 システムHirofumi Iwasaki
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話Yoshinori Matsunobu
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-PE-BANK
 

What's hot (20)

SQL+NoSQL!? それならMySQL Clusterでしょ。
SQL+NoSQL!? それならMySQL Clusterでしょ。SQL+NoSQL!? それならMySQL Clusterでしょ。
SQL+NoSQL!? それならMySQL Clusterでしょ。
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理する
 
クックパッドでのVPC移行について
クックパッドでのVPC移行についてクックパッドでのVPC移行について
クックパッドでのVPC移行について
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
[A31]AWS上でOracleを利用するためのはじめの一歩!by Masatoshi Yoshida
[A31]AWS上でOracleを利用するためのはじめの一歩!by Masatoshi Yoshida[A31]AWS上でOracleを利用するためのはじめの一歩!by Masatoshi Yoshida
[A31]AWS上でOracleを利用するためのはじめの一歩!by Masatoshi Yoshida
 
MySQL Technology Cafe #12 MySQL Database Service - High Availability Update
MySQL Technology Cafe #12 MySQL Database Service - High Availability UpdateMySQL Technology Cafe #12 MySQL Database Service - High Availability Update
MySQL Technology Cafe #12 MySQL Database Service - High Availability Update
 
MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良
 
awsで実現するミッションクリティカル業務のクラウド利用
awsで実現するミッションクリティカル業務のクラウド利用awsで実現するミッションクリティカル業務のクラウド利用
awsで実現するミッションクリティカル業務のクラウド利用
 
第10回しゃちほこオラクル倶楽部
第10回しゃちほこオラクル倶楽部第10回しゃちほこオラクル倶楽部
第10回しゃちほこオラクル倶楽部
 
AWS Black Belt Techシリーズ AWS Elastic Beanstalk
AWS Black Belt Techシリーズ  AWS  Elastic  BeanstalkAWS Black Belt Techシリーズ  AWS  Elastic  Beanstalk
AWS Black Belt Techシリーズ AWS Elastic Beanstalk
 
StackStorm で実現する、複数システムに対する統一インターフェイス提供と運用一元化の取り組み - OpenStack最新情報セミナー(2017年3月)
StackStorm で実現する、複数システムに対する統一インターフェイス提供と運用一元化の取り組み - OpenStack最新情報セミナー(2017年3月)StackStorm で実現する、複数システムに対する統一インターフェイス提供と運用一元化の取り組み - OpenStack最新情報セミナー(2017年3月)
StackStorm で実現する、複数システムに対する統一インターフェイス提供と運用一元化の取り組み - OpenStack最新情報セミナー(2017年3月)
 
第9回しゃちほこオラクル倶楽部
第9回しゃちほこオラクル倶楽部第9回しゃちほこオラクル倶楽部
第9回しゃちほこオラクル倶楽部
 
CloudWatch Eventsを使った ECSのAutoScaling
CloudWatch Eventsを使ったECSのAutoScalingCloudWatch Eventsを使ったECSのAutoScaling
CloudWatch Eventsを使った ECSのAutoScaling
 
20150920 中国地方db勉強会
20150920 中国地方db勉強会20150920 中国地方db勉強会
20150920 中国地方db勉強会
 
第11回しゃちほこオラクル倶楽部
第11回しゃちほこオラクル倶楽部第11回しゃちほこオラクル倶楽部
第11回しゃちほこオラクル倶楽部
 
Amazon ElastiCache(初心者向け 超速マスター編)JAWSUG大阪
Amazon ElastiCache(初心者向け 超速マスター編)JAWSUG大阪Amazon ElastiCache(初心者向け 超速マスター編)JAWSUG大阪
Amazon ElastiCache(初心者向け 超速マスター編)JAWSUG大阪
 
Running Kubernetes on Azure
Running Kubernetes on AzureRunning Kubernetes on Azure
Running Kubernetes on Azure
 
45分で作る Java EE 8 システム
45分で作る Java EE 8 システム45分で作る Java EE 8 システム
45分で作る Java EE 8 システム
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
 

Similar to Akka Clusterの耐障害設計

並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門Yoshimura Soichiro
 
スキーマつきストリーム データ処理基盤、 Confluent Platformとは?
スキーマつきストリーム データ処理基盤、 Confluent Platformとは?スキーマつきストリーム データ処理基盤、 Confluent Platformとは?
スキーマつきストリーム データ処理基盤、 Confluent Platformとは?Sotaro Kimura
 
AKSを活用した社内向けイベント支援プラットフォームをリリースした話
AKSを活用した社内向けイベント支援プラットフォームをリリースした話AKSを活用した社内向けイベント支援プラットフォームをリリースした話
AKSを活用した社内向けイベント支援プラットフォームをリリースした話Shingo Kawahara
 
本当にできるの?ミッションクリティカルシステムのクラウド移行ダイジェスト (Oracle Cloudウェビナーシリーズ: 2021年7月7日)
本当にできるの?ミッションクリティカルシステムのクラウド移行ダイジェスト (Oracle Cloudウェビナーシリーズ: 2021年7月7日)本当にできるの?ミッションクリティカルシステムのクラウド移行ダイジェスト (Oracle Cloudウェビナーシリーズ: 2021年7月7日)
本当にできるの?ミッションクリティカルシステムのクラウド移行ダイジェスト (Oracle Cloudウェビナーシリーズ: 2021年7月7日)オラクルエンジニア通信
 
使ってわかった!現場担当者が語るOpenStack運用管理の課題:OpenStack Days 2015 Tokyo 講演
使ってわかった!現場担当者が語るOpenStack運用管理の課題:OpenStack Days 2015 Tokyo 講演使ってわかった!現場担当者が語るOpenStack運用管理の課題:OpenStack Days 2015 Tokyo 講演
使ってわかった!現場担当者が語るOpenStack運用管理の課題:OpenStack Days 2015 Tokyo 講演VirtualTech Japan Inc.
 
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tkKubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tkwhywaita
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconKazuhiro Sera
 
Mackerelによる
簡単サーバー管理入門と発展形
Mackerelによる
簡単サーバー管理入門と発展形Mackerelによる
簡単サーバー管理入門と発展形
Mackerelによる
簡単サーバー管理入門と発展形Shinji Tanaka
 
機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介Cloudera Japan
 
OSC 2013.Cloud@Osaka
OSC 2013.Cloud@OsakaOSC 2013.Cloud@Osaka
OSC 2013.Cloud@Osakasamemoon
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Kenjiro Kubota
 
Azure IaaS update (2018年6月~8月 発表版)
Azure IaaS update (2018年6月~8月 発表版) Azure IaaS update (2018年6月~8月 発表版)
Azure IaaS update (2018年6月~8月 発表版) Takamasa Maejima
 
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]オラクルエンジニア通信
 
20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会samemoon
 
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきかAWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか真吾 吉田
 
「たまおきのクラウドウォッチ」筆者が語る、OpenStack導入最前線 - @IT様セミナー 「真剣に考える人だけにこっそり教えるOpenStackとスト...
「たまおきのクラウドウォッチ」筆者が語る、OpenStack導入最前線 - @IT様セミナー 「真剣に考える人だけにこっそり教えるOpenStackとスト...「たまおきのクラウドウォッチ」筆者が語る、OpenStack導入最前線 - @IT様セミナー 「真剣に考える人だけにこっそり教えるOpenStackとスト...
「たまおきのクラウドウォッチ」筆者が語る、OpenStack導入最前線 - @IT様セミナー 「真剣に考える人だけにこっそり教えるOpenStackとスト...VirtualTech Japan Inc.
 
Cloudera in the Cloud #CWT2017
Cloudera in the Cloud #CWT2017Cloudera in the Cloud #CWT2017
Cloudera in the Cloud #CWT2017Cloudera Japan
 
エンタープライズ・クラウドのシステム・デザイン・パターン [Oracle Cloud Days Tokyo 2016]
エンタープライズ・クラウドのシステム・デザイン・パターン [Oracle Cloud Days Tokyo 2016]エンタープライズ・クラウドのシステム・デザイン・パターン [Oracle Cloud Days Tokyo 2016]
エンタープライズ・クラウドのシステム・デザイン・パターン [Oracle Cloud Days Tokyo 2016]オラクルエンジニア通信
 
KLabのチャットシステム インフラ変遷
KLabのチャットシステム インフラ変遷KLabのチャットシステム インフラ変遷
KLabのチャットシステム インフラ変遷KLab Inc. / Tech
 

Similar to Akka Clusterの耐障害設計 (20)

並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
 
スキーマつきストリーム データ処理基盤、 Confluent Platformとは?
スキーマつきストリーム データ処理基盤、 Confluent Platformとは?スキーマつきストリーム データ処理基盤、 Confluent Platformとは?
スキーマつきストリーム データ処理基盤、 Confluent Platformとは?
 
AKSを活用した社内向けイベント支援プラットフォームをリリースした話
AKSを活用した社内向けイベント支援プラットフォームをリリースした話AKSを活用した社内向けイベント支援プラットフォームをリリースした話
AKSを活用した社内向けイベント支援プラットフォームをリリースした話
 
本当にできるの?ミッションクリティカルシステムのクラウド移行ダイジェスト (Oracle Cloudウェビナーシリーズ: 2021年7月7日)
本当にできるの?ミッションクリティカルシステムのクラウド移行ダイジェスト (Oracle Cloudウェビナーシリーズ: 2021年7月7日)本当にできるの?ミッションクリティカルシステムのクラウド移行ダイジェスト (Oracle Cloudウェビナーシリーズ: 2021年7月7日)
本当にできるの?ミッションクリティカルシステムのクラウド移行ダイジェスト (Oracle Cloudウェビナーシリーズ: 2021年7月7日)
 
使ってわかった!現場担当者が語るOpenStack運用管理の課題:OpenStack Days 2015 Tokyo 講演
使ってわかった!現場担当者が語るOpenStack運用管理の課題:OpenStack Days 2015 Tokyo 講演使ってわかった!現場担当者が語るOpenStack運用管理の課題:OpenStack Days 2015 Tokyo 講演
使ってわかった!現場担当者が語るOpenStack運用管理の課題:OpenStack Days 2015 Tokyo 講演
 
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tkKubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
 
Mackerelによる
簡単サーバー管理入門と発展形
Mackerelによる
簡単サーバー管理入門と発展形Mackerelによる
簡単サーバー管理入門と発展形
Mackerelによる
簡単サーバー管理入門と発展形
 
機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介
 
OSC 2013.Cloud@Osaka
OSC 2013.Cloud@OsakaOSC 2013.Cloud@Osaka
OSC 2013.Cloud@Osaka
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
Azure IaaS update (2018年6月~8月 発表版)
Azure IaaS update (2018年6月~8月 発表版) Azure IaaS update (2018年6月~8月 発表版)
Azure IaaS update (2018年6月~8月 発表版)
 
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
 
Azure Arc 概要
Azure Arc 概要Azure Arc 概要
Azure Arc 概要
 
20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会
 
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきかAWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
AWSへのWindows Server 2003の移行 そして今後インフラとどう向き合うべきか
 
「たまおきのクラウドウォッチ」筆者が語る、OpenStack導入最前線 - @IT様セミナー 「真剣に考える人だけにこっそり教えるOpenStackとスト...
「たまおきのクラウドウォッチ」筆者が語る、OpenStack導入最前線 - @IT様セミナー 「真剣に考える人だけにこっそり教えるOpenStackとスト...「たまおきのクラウドウォッチ」筆者が語る、OpenStack導入最前線 - @IT様セミナー 「真剣に考える人だけにこっそり教えるOpenStackとスト...
「たまおきのクラウドウォッチ」筆者が語る、OpenStack導入最前線 - @IT様セミナー 「真剣に考える人だけにこっそり教えるOpenStackとスト...
 
Cloudera in the Cloud #CWT2017
Cloudera in the Cloud #CWT2017Cloudera in the Cloud #CWT2017
Cloudera in the Cloud #CWT2017
 
エンタープライズ・クラウドのシステム・デザイン・パターン [Oracle Cloud Days Tokyo 2016]
エンタープライズ・クラウドのシステム・デザイン・パターン [Oracle Cloud Days Tokyo 2016]エンタープライズ・クラウドのシステム・デザイン・パターン [Oracle Cloud Days Tokyo 2016]
エンタープライズ・クラウドのシステム・デザイン・パターン [Oracle Cloud Days Tokyo 2016]
 
KLabのチャットシステム インフラ変遷
KLabのチャットシステム インフラ変遷KLabのチャットシステム インフラ変遷
KLabのチャットシステム インフラ変遷
 

More from TanUkkii

Distributed ID generator in ChatWork
Distributed ID generator in ChatWorkDistributed ID generator in ChatWork
Distributed ID generator in ChatWorkTanUkkii
 
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...TanUkkii
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on ScalaTanUkkii
 
スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成TanUkkii
 
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何かすべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何かTanUkkii
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門TanUkkii
 
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けーTanUkkii
 
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けーTanUkkii
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングTanUkkii
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語ScalaTanUkkii
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6TanUkkii
 

More from TanUkkii (16)

Distributed ID generator in ChatWork
Distributed ID generator in ChatWorkDistributed ID generator in ChatWork
Distributed ID generator in ChatWork
 
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
Non-blocking IO to tame distributed systems ー How and why ChatWork uses async...
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on Scala
 
JSON CRDT
JSON CRDTJSON CRDT
JSON CRDT
 
WaveNet
WaveNetWaveNet
WaveNet
 
スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成スケールするシステムにおけるエンティティの扱いと 分散ID生成
スケールするシステムにおけるエンティティの扱いと 分散ID生成
 
Akka HTTP
Akka HTTPAkka HTTP
Akka HTTP
 
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何かすべてのアクター プログラマーが知るべき 単一責務原則とは何か
すべてのアクター プログラマーが知るべき 単一責務原則とは何か
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門
 
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
 
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語Scala
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
 

Akka Clusterの耐障害設計

Editor's Notes

  1. Akka Clusterの耐障害設計について話します。TISさんの前セッションを聞いてからこの発表に臨むのがお勧めなのですが、前のセッションに参加した人はどのぐらいいますか? あとAkka Clusterを使ったり試したことのある方はどれぐらいいますか? 質問OKにするか。 スピーカーノートのリンクを張ってあるのでご活用ください。
  2. 自己紹介です。安田裕介といいます。Akka好きです。よろしくお願いします。
  3. Akka Clusterとは何かを説明するまえに、どこで活躍する技術かをはじめにお話します。Akka ClusterはBASEなシステムを構築する際に真価を発揮します。BASEとはsoft-stateによる高い可用性と結果整合性による高いスケーラビリティを主軸にするアプローチです。クラウドの登場により、以前より遥かに簡単にサーバーをスケールアウト/スケールインさせることができるようになりましたが、永続化層はダイナミックにスケールさせることはまだ難しいのが現状です。可用性を高めるにはクライアントにより近いレイヤーでsoft-stateを扱うことが重要になってきます。ダイナミックなメンバー管理と状態管理を得意とするのがAkka Clusterです。
  4. BASEなシステムを構築する技術の中でもAkka Clusterを選ぶ理由は、アクターの位置透過性が大きいでしょう。AkkaやErlangを始めとするアクタープログラミングでは、位置透過性によりどのスレッドでアクターが動いても同じように動作することが保証されています。この性質によりマシンにコアを追加すればコードを変えることなくアプリケーションをスケールアップすることができます。同様にアクターはどのサーバーで動いても同じように動作するで、ほとんどコードを変えずにスケールアウトに戦略を切り替えることができます。位置透過性はサービスの各段階において適したスケール戦略を少ないコストで可能にします。低コストとは具体的には、どのようなスケール戦略をとるかによってコードを変える必要がないという点と、スレッドや複数マシンへの分散環境の複雑なテストを書く量が少なくて済む点と、すべてのチームメンバーが分散プログラミングに精通している必要がないという点です。またエコシステムも魅力の1つです。
  5. Akka Clusterの基本を話します。前のセッションでTISさんがAkka Clusterを詳しく説明してくれたので、ここでは基礎をさらりと説明するにとどめます。
  6. Akka Clusterとは、クラスターのメンバーシップ管理を行うAkkaの拡張です。Amazon Dynamoやriakに影響を受けており、非中央集権的で対称な分散システムを構築するための基盤となります。Akka Clusterには主に2つの機能があります。gossipプロトコルによるメンバーの状態伝播と、failure detectorによる障害検知です。
  7. Akka Clusterのメンバーは互いにハートビートを送り合っています。failure detectorはハートビートをもとにメンバーの生死を推測します。failure detectorは生きているメンバーをreachable、死んでいるメンバーをunreachableとマークします。
  8. Akka Clusterのメンバーには状態があります。gossipプロトコルを使ってお互いに状態を同期します。gossipプロトコルで全メンバーに状態を同期したときに、一意に決まるリーダーという役割があります。リーダーはメンバーの状態を変えることに責任があり、その行為をリーダーアクションといいます。 クラスターに参加するメンバーはjoining状態から始まります。リーダーはjoining状態のメンバーをup状態にし、クラスターに参加させます。up状態からクラスターのメンバーと認識されます。またdown状態になったメンバーは、リーダーによってremoved状態にされ、クラスターから取り除かれます。これがクラスターメンバーのライフサイクルです。
  9. ここからがこの発表の本題です。前のTISさんのセッションがAkka Clusterの光を示したとしたら、ここからは影の部分です。これからAkka Clusterでどのような障害が起きるのか話します。すべての分散システムに言えることですが、耐障害設計は非常に難しいです。しかしここを乗り越えてこそ伝統的なシステムでは到達できないスケーラビリティと可用性を手に入れることができるのです。
  10. 耐障害性の解説に入る前に、故障の単位を定義しておきましょう。故障の単位をプロセスといいます。アクタープログラミングでは障害の単位はアクターですが、ここではAkka Clusterの1ノードと定義します。これはAkka ClusterアプリケーションのUNIXプロセスと同義になります。
  11. 耐障害性を議論する際に、どのような故障に対処するのかを定義しなければなりません。故障には主に4つの分類があります。 この4つの故障はそれぞれ下位の故障の上位集合になっています。上位の故障ほど対処が難しいです。
  12. 正常に処理を実行していたプロセスがある時刻以降処理を停止して2度と戻らない故障をクラッシュストップ故障といいます。故障のなかでもっとも単純な故障です。後により上位の故障を説明しますが、Akka Clusterのレイヤーで考えなければならない故障のほぼ全てはクラッシュストップ故障です。
  13. クラスターのメンバーの1つがクラッシュストップ故障を起こした場合、どの処理が止まるのか明らかにしましょう。Akka Clusterのレイヤーでは、このとき停止する処理はリーダーアクションです。メンバーの一部がクラッシュストップ故障を起こした場合、そのメンバーはfailure detectorによってunreachableと判定されます。このときクラスターは保守的に振る舞い、クラスターの状態を変えるリーダーアクションを行うことをやめます。具体的にはクラスターに新たなメンバーを追加することができなくなります。
  14. リーダーアクションを再び行えるようにするには、unreachableなメンバーがfailure detectorによって再びreachableとなるか、down状態にする必要があります。down状態にすると、その状態変化をほかの全メンバーが観測してゴシップは収束し、やがてリーダーはdownしたメンバーをremoved状態にしてクラスターから取り除きます。down状態になるとメンバーの追加が可能になります。
  15. デフォルトでは、Akka Clusterはunreachableなメンバーを自動的にdown状態にはしません。つまり人の手でdownする必要があります。 自動的に故障したメンバーをdownするには、auto-downというオプションを有効にします。この機能を有効にすると、unreachableなメンバーは指定時間後に自動的にdownします。しかしこの機能は使ってはいけません。なぜ使ってはならないのか、考えてみましょう。
  16. 根本的な問題は、failure detectorがメンバーをunreachableと判定したとき、そのメンバーは本当に死んでいるのか、ネットワーク遅延や分断なのか、GCによる遅延なのかが分からないということです。よいfailure detectorとは、あくまでノードがダウンしていることを精度良く **推定**できるだけにすぎません。この問題はすべての分散システムに言えることで、分散システムが難しい理由の1つです。downしたメンバーが実は生きていた場合、split brain問題がおきます。
  17. downと判定したメンバーが本当に停止しているわけではなく、生きていた場合を考えましょう。このメンバーはすでにクラスターから切り離され、状態は同期できなくなっています。このメンバーがクライアントに公開されてしまうと、誤った情報をクライアントに伝え、またその誤った状態をもとにデータベースなどの共有リソースを変更してしまいます。このようにクラスターが分裂してしまうことをsplit brain問題といいます。
  18. auto-downの危険性をよく理解するためにはAkka Clusterでリーダーがどのように決定されるかを知っておく必要があります。なぜならauto-down機能でメンバーをdown状態にするのはリーダーだからです。Akka Clusterにはリーダー選出という過程は存在しません。リーダーはgossipプロトコルで同期されたメンバーリストから決定論的に決定できます。リーダーはunreachableでないメンバーのうちUpとLeaving状態のものを優先的に選択し、アドレス順に並べて先頭のものです。
  19. この決定方法ではunreachableなメンバーがいない場合、つまりゴシップが収束しているときにクラスター内でリーダーをユニークに決定できます。しかしunreachableなメンバーが存在すると、メンバーによってどのメンバーがunreachableに見えるのかが異なるため、メンバーによって異なるリーダーを決定する場合があります。例えばネットワーク分断によりクラスターが2つに分断された場合、リーダーは2つできます。各リーダーが相手側をdownするので、split brain状態になります。Akka Clusterのリーダー選出はどのような状況でも可能で可用性が高い代わりに、整合性を犠牲にしています。これは整合性を取っているPaxosやRaftなどの分散合意プロトコルと異なる点です。
  20. split brain問題に対処するためにはいくつかの観点があり、それにどのような答えを出すかによってsplit brain問題を解決する方法が変わります。 - クラスターの中でリーダーよりももっと整合性の高い方法で決定でき、downを果たせる役割はいないでしょうか? - クラスターが2つに分割される場合、どちらが正しいクラスターなのでしょうか? - 正しくないクラスターを決めたとして、そのクラスターのメンバーをどうすべきでしょうか?
  21. split brain問題を様々な方法で解決するsplit brain resolverを紹介します。実装はLightbend社によるプロプライエタリなものと、私が作ったオープンソース実装があります。 split brain resolverのストラテジにはいくつかあり、この中の2つを紹介します。
  22. Keep Oldestストラテジは、クラスターがネットワーク分断を起こしたときに、最古のメンバーがいる側を正のクラスターとします。そうでない側のメンバーは自らシャットダウンします。unreachableなメンバーをdownする役割は最古メンバーが担います。 最古メンバーがどのように決まるのかを解説します。クラスターのメンバーは起動したときのタイムスタンプを持っています。状態がRemovedでないメンバーの中でこのタイムスタンプが最小のメンバーが最古メンバーです。リーダーとは異なり、最古メンバーはたとえgossipが収束していなくてもすべてのメンバーで一意に決まります。 Keep Oldestストラテジは可用性の点で問題があります。最古メンバーがクラッシュした場合、全クラスターメンバーがシャットダウンします。これを防ぐためには、`down-if-alone`オプションを有効にします。これにより最古メンバーのみがクラッシュした場合、代わりに最古メンバーがdownされます。
  23. 最古メンバーの決定はunreachableなメンバーに依存しないので分断されていても全メンバーで一意に決まります。最古メンバーを基準にする限りsplit brainはほぼおきません。
  24. Static Quorumストラテジはネットワーク分断のさい残存メンバーがquorum sizeに満たない場合、そのメンバーをdownします。メンバー数が9でquorum sizeが5の場合に5:4に分断した場合、5の側が生き残り4の側はdownします。 他のメンバーをdownする役割はリーダーが担います。quorum-size * 2 - 1を超えるメンバーを追加しない限りsplit brainはおきません。Static Quorumの可用性は総ノード数とquorum sizeで調節可能です。Static Quorumはメンバーの数を固定しなければならない点が弱点ですが、特定のロールに固定することで、他のロールはダイナミックにメンバー数を変えることができるので、この設定をお勧めします。
  25. 分断された場合leaderは2つできる点は変わらないのですが、残存ノードがquorum sizeを満たしているものは片方だけです。
  26. 残念ながら完璧なsplit brain resolverのストラテジはありません。FLPとして知られる有名な研究の結果では、非同期なシステムにおいては、ただ1つのプロセスが故障しただけでも、分散アルゴリズムによる合意はできないと結論付けています。 split brain resolverの各ストラテジは、合意できないケースが現実のシステムではごく稀な例外になっており、現実的な解法といえます。
  27. オミッション故障とは、プロセスが送るべきメッセージを送らない、あるいは受信するべきメッセージを受信できない故障です。プロセスがクラッシュした場合も送るべきメッセージを送れないので、オミッション故障はクラッシュストップ故障のより一般的な場合と見ることができます。
  28. Akka Clusterでは、送るべきはずのシステムメッセージを送信できず、ローカルとリモートのアクターシステム間の状態が同期できなくなったときにオミッション故障となります。システムメッセージはユーザーメッセージとは異なり、exactly-once送信保証で実装されています。具体的にシステムメッセージとは、リモートスーパーバイザーに管理されたアクターのライフサイクルイベント、watchによる死活監視、リモートアクターのデプロイメントが該当します。これらの送信が確認できないときにAkka Remoteの状態はquarantinedになります。quarantinedになると、そのメンバーはunreachableから戻ってこれなくなります。解消するにはクラスターから取り除くかアクターシステムを再起動する必要があります。auto-downやsplit brain resolverを使用している場合、unreachableなメンバーをクラスターから取り除く作業は自動で行われ、取り除かれたメンバーはアクターシステムをシャットダウンします。つまりこの場合Akka Clusterにおいてオミッション故障はクラッシュストップ故障と全く同じ扱いになります。
  29. クラッシュ・リカバリー故障はプロセスがクラッシュしただけでなく、そこからリカバリーできない、あるいはクラッシュと再起動を繰り返してしまう故障です。リカバリーできない場合、送るべきはずのメッセージを送れないので、オミッション故障と見ることもできます。
  30. Akka Clusterのレイヤーではクラッシュしてクラスターから取り除かれたノードが再起動してクラスターに再加入することを前提としていません。なのでクラッシュしたままでも問題はなく、クラッシュ・リカバリー故障はおきません。
  31. Akka Clusterが再起動したノードをどのように扱うかを解説します。Akka Clusterはメンバーを3つの識別子のタプルで認識します。hostname:port:uidです。uidはアクターシステム起動時に発行されるユニークなIDです。このuidによってたとえホストとポートが同じでも、再起動した後ではuidが異なります。つまり再起動してクラスターに再加入することは、新しいメンバーがクラスターに加入することと全く同じです。こうすることによってAkka Clusterはクラッシュ・リカバリー故障を考慮する必要がなく、単純化しています。
  32. ノードがクラッシュした後再起動してクラスターに加入する際、クラッシュしたメンバーはunreachableとなってリーダーアクションがとれないため、ノードが再加入できるのか疑問が残ります。このような蘇り(incarnation)ノードの扱いについて解説します。クラスターのメンバーと同じホスト:ポートのペアをもつメンバーが加入してきた場合、Leaderは古いメンバーを自動的にdownします。これはauto-downやsplit brain resolverを使わなくても行われます。これによって再起動したノードはクラスターに参加することができます。なぜこのケースでdownが安全に可能かというと、同じホスト:ポートのペアをもつメンバーが同時に2つ存在することはありえないからです。古いメンバーはクラッシュしたということをLeaderは確実に判断できます。このような特徴があるので、基本的にプロセスを再起動することを勧めます。そうすればクラッシュしてもクラスターが縮小することはなく、自動的にもとの大きさに戻ります。
  33. 複数のDCにAkka Clusterをデプロイしている場合、再起動には注意が必要です。2つのAZ間でネットワーク分断を起こした場合、split brain resolverによって片方のAZのメンバーのみが生き残ります(AZ2とします)。自ら死を選んだもう一方のAZ(AZ1とします)のメンバーは再起動した後、この図のようにjoining状態でネットワーク分断が解消されるまで待ち続け、ネットワーク分断が解消されたら再びクラスターに戻ることが理想です。このときクラスターに加入するための第一seedノードは、生き残った方のAZ2に存在しなければなりません。第一seedノードとはクラスターを0から構築する際の起点になるノードのことで、設定に記述します。
  34. これがクラスターに加入するための第一seedノードを、AZ1に設定してしまった場合です。再起動したAZ1のノードたちは、それらだけでクラスターを作ってしまい、split brain状態になってしまいます。第一seedノードはクラスターを0から構築する際の起点になるので、split brain resolverで残す判断の基準になるノード群(この場合quorum sizeの3を満たせる側のAZ2)があるAZに置く必要があります。プロセスの再起動を有効にして複数のAZで利用する際は、どのAZをクラスターの正とするか決め、それを固定することをお勧めします。