Split Brain Resolver

當(dāng)使用Akka cluster時(shí),必須要考慮如何處理集群分區(qū)(split brain)和 機(jī)器宕機(jī) (Jvm和硬件故障)。如果在使用Cluster Singleton或Cluster Sharding昧捷,尤其是與Akka Persistence一起使用時(shí)潮罪,解決這個(gè)問題是至關(guān)重要的螃壤。

問題

分布式系統(tǒng)的基本的問題就是描扯,系統(tǒng)的觀察者不知道到底是網(wǎng)絡(luò)分區(qū)還是機(jī)器故障。例如:一個(gè)節(jié)點(diǎn)故障了,但是另外一個(gè)節(jié)點(diǎn)不會(huì)知道他是宕機(jī)永遠(yuǎn)不可達(dá)酗电,還是網(wǎng)絡(luò)問題一會(huì)就會(huì)恢復(fù)魄藕。由于必須在有限的時(shí)間內(nèi)做出判斷,所以不能區(qū)分到底是短暫的還是永久的故障撵术。并且往往短暫的故障持續(xù)時(shí)間也會(huì)超過系統(tǒng)的決策時(shí)間背率。

第三種類型的問題是,如果進(jìn)程無響應(yīng)荷荤,例如:由于過載退渗,CPU匱乏或長時(shí)間垃圾收集暫停。這也是無法從網(wǎng)絡(luò)分區(qū)和宕機(jī)中區(qū)分出來的蕴纳。 我們唯一的決定信號(hào)是“在給定時(shí)間內(nèi)沒有回復(fù)心跳”,這意味著導(dǎo)致延誤或心跳丟失的現(xiàn)象彼此不可區(qū)分个粱,并且必須以相同的方式處理古毛。

發(fā)生宕機(jī)時(shí),我們希望立即從集群中刪除受影響的節(jié)點(diǎn)都许。 1稻薇、當(dāng)存在網(wǎng)絡(luò)分區(qū)或無響應(yīng)的進(jìn)程時(shí),我們希望等待一段時(shí)間胶征,希望這是一個(gè)暫時(shí)的問題塞椎,系統(tǒng)會(huì)再次恢復(fù)過來,但在某些時(shí)候睛低,我們必須放棄其中的一部分案狠。 2、此外钱雷,某些功能在分區(qū)過程中并不完全可用骂铁,因此如果分區(qū)時(shí)間過長,分區(qū)可能不是很重要罩抗。這兩個(gè)目標(biāo)相互沖突拉庵,我們可以在 快速移除崩潰節(jié)點(diǎn) 和 快速應(yīng)對(duì)網(wǎng)絡(luò)分區(qū) 之間進(jìn)行權(quán)衡。(注:宕機(jī)節(jié)點(diǎn)需要快速刪掉套蒂,網(wǎng)絡(luò)分區(qū)需要等一會(huì)钞支,所以在選擇上就要進(jìn)行權(quán)衡)

這是一個(gè)難以解決的問題,由于網(wǎng)絡(luò)分區(qū)時(shí)不同側(cè)的節(jié)點(diǎn)不能相互通信操刀。關(guān)于分區(qū)的哪一側(cè)該繼續(xù)運(yùn)行烁挟,哪一側(cè)該結(jié)束,兩個(gè)分區(qū)必須要做出相同的決策馍刮。

Akka集群有一個(gè)失敗檢測(cè)器信夫,它會(huì)注意到網(wǎng)絡(luò)分區(qū)和機(jī)器崩潰(但它不能區(qū)分這兩者)昌犹。它使用定期心跳消息來檢查節(jié)點(diǎn)是否可用。 這些由故障檢測(cè)器發(fā)現(xiàn)的節(jié)點(diǎn)被稱為不可達(dá)的節(jié)點(diǎn)腔丧,如果不可達(dá)節(jié)點(diǎn)再次發(fā)通心跳葫哗,那么就會(huì)變成可達(dá)節(jié)點(diǎn)。

故障檢測(cè)器不能夠在所有場(chǎng)景下都做出正確決定振湾。原始的方法就是在超過一定的時(shí)間后刪除掉不可達(dá)節(jié)點(diǎn)杀迹。這對(duì)宕機(jī)和短暫的網(wǎng)絡(luò)分區(qū)是有效的,但是不能解決長時(shí)間網(wǎng)絡(luò)分區(qū)的問題押搪。網(wǎng)絡(luò)分區(qū)的兩端都會(huì)將另一端視為無法訪問树酪,并在一段時(shí)間后將其從群集成員中刪除。 由于這發(fā)生在雙方大州,結(jié)果是創(chuàng)建了兩個(gè)獨(dú)立的群集续语。This approach is provided by the opt-in (off by default) auto-down feature in the OSS version of Akka Cluster.

如果將基于超時(shí)的auto-down功能與Cluster Singleton或Cluster Sharding結(jié)合使用,這意味著將運(yùn)行兩個(gè)具有相同標(biāo)識(shí)符的Cluster Singleton或Cluster Sharding厦画。 例如疮茄,當(dāng)與Akka Persistence一起使用時(shí),可能導(dǎo)致具有相同persistenceId的持久化actor的兩個(gè)實(shí)例正在同時(shí)運(yùn)行并寫入同一個(gè)持續(xù)事件流根暑,這將產(chǎn)生致命的后果力试。

Akka集群中的默認(rèn)設(shè)置不會(huì)自動(dòng)刪除無法訪問的節(jié)點(diǎn), 建議由操作人員或外部監(jiān)控系統(tǒng)決定應(yīng)采取的措施排嫌。 這是一個(gè)有效的解決方案畸裳,但如果您因?yàn)槠渌驔]有該員工或外部系統(tǒng),則會(huì)很不方便淳地。

如果無法訪問的節(jié)點(diǎn)完全沒有關(guān)閉怖糊,它們?nèi)匀皇羌撼蓡T的一部分。 這意味著群集Singleton和Cluster Shardin不會(huì)將故障轉(zhuǎn)移到另一個(gè)節(jié)點(diǎn)薇芝。雖然有無法訪問的節(jié)點(diǎn)蓬抄,但加入群集的新節(jié)點(diǎn)不會(huì)將狀態(tài)置為Up(也就是分區(qū)狀態(tài)時(shí),新節(jié)點(diǎn)加入不進(jìn)來)夯到。同樣嚷缭,在所有不可達(dá)節(jié)點(diǎn)都解決之前,不會(huì)刪除離開的成員(同樣這時(shí)有節(jié)點(diǎn)離開集群耍贾,也不會(huì)影響集群的信息)阅爽。 換句話說,讓無法訪問的成員無限期地工作是不可取的荐开。

隨著問題的引入付翁,是時(shí)候看下 網(wǎng)絡(luò)分區(qū)、無響應(yīng)節(jié)點(diǎn)和宕機(jī)節(jié)點(diǎn) 的解決策略了晃听。

Using the Split Brain Resolver
要使用Split Brain Resolver功能百侧,必須添加對(duì)akka-split-brain-resolver組件依賴砰识。
sbt : "com.lightbend.akka" %% "akka-split-brain-resolver" % "1.1.0"
Gradle:
dependencies {
compile group: 'com.typesafe.akka', name: 'akka-split-brain-resolver_2.11', version: '1.1.0'
}
maven:
<dependency>
<groupId>com.lightbend.akka</groupId>
<artifactId>akka-split-brain-resolver_2.11</artifactId>
<version>1.1.0</version>
</dependency>

啟用Split Brain Resolver:,您需要將ActorSystem (* application.conf *)中的akka.cluster.downing-provider-class配置為
akka.cluster.downing-provider-class = "com.lightbend.akka.sbr.SplitBrainResolverProvider"

具體的策略如下所介紹:
沒有一個(gè)方案可以解決上述所有問題佣渴。你必須選一種最適合你系統(tǒng)的策略辫狼。每個(gè)策略都有失敗的場(chǎng)景。

通過配置akka.cluster.split-brain-resolver.active-strategy.來讓策略生效辛润。
注:同時(shí)也必須刪除akka.cluster.auto-down-unreachable-after配置膨处。

在集群達(dá)到穩(wěn)定之前這個(gè)策略還是沒有生效的。在網(wǎng)絡(luò)分區(qū)時(shí)新增成員也不會(huì)影響集群狀態(tài)砂竖。

// To enable the split brain resolver you first need to enable the provider in your application.conf:
// akka.cluster.downing-provider-class = "com.lightbend.akka.sbr.SplitBrainResolverProvider"

akka.cluster.split-brain-resolver {
// Select one of the available strategies (see descriptions below):
// static-quorum, keep-majority, keep-oldest, keep-referee
// if left "off" when the downing provider is enabled cluster startup will fail.
active-strategy = off

// Time margin after which shards or singletons that belonged to a downed/removed
// partition are created in surviving partition. The purpose of this margin is that
// in case of a network partition the persistent actors in the non-surviving partitions
// must be stopped before corresponding persistent actors are started somewhere else.
// This is useful if you implement downing strategies that handle network partitions,
// e.g. by keeping the larger side of the partition and shutting down the smaller side.
// Decision is taken by the strategy when there has been no membership or
// reachability changes for this duration, i.e. the cluster state is stable.
stable-after = 20s

注:
stable-after:一個(gè)時(shí)間段真椿,用來將持久化的actor從將要?jiǎng)h除的分區(qū)中移到 其他分區(qū)。
active-strategy = off :active-strategy配置為off那么集群分區(qū)策略不會(huì)生效
}

stable-after 時(shí)間不要設(shè)置的太短乎澄,更不要小于整個(gè)系統(tǒng)的通信時(shí)間突硝,建議設(shè)置如下:
cluster size stable-after
5 7 s
10 10 s
20 13 s
50 17 s
其余不同的策略還有其他配置,下面將會(huì)介紹:

分區(qū)中將要關(guān)閉的一部分三圆,會(huì)使用cluster down命令從集群成員中刪除狞换。

當(dāng)從集群中刪除節(jié)點(diǎn)時(shí),最好終止ActorSystem并退出JVM舟肉。
在Akka 2.5.x中 使用Coordinated Shutdown終止ActorSystem,但是退出Jvm建議使用如下配置:
akka.coordinated-shutdown.exit-jvm = on

在Akka 2.4.x中 查库, ActorSystem不會(huì)自動(dòng)關(guān)閉路媚。 要實(shí)現(xiàn)這個(gè),你必須關(guān)閉ActorSystem 樊销,然后像這樣退出JVM:
/*
import java.util.concurrent.TimeUnit;
import scala.concurrent.Await;
import scala.concurrent.duration.Duration;
import akka.cluster.Cluster;
*/
Cluster.get(system).registerOnMemberRemoved(() -> {
// exit JVM when ActorSystem has been terminated
system.registerOnTermination(() -> System.exit(0));

// shut down ActorSystem
system.terminate();

// In case ActorSystem shutdown takes longer than 10 seconds,
// exit the JVM forcefully anyway.
// We must spawn a separate thread to not block current thread,
// since that would have blocked the shutdown of the ActorSystem.
new Thread() {
@Override public void run(){
try {
Await.ready(system.whenTerminated(), Duration.create(10, TimeUnit.SECONDS));
} catch (Exception e) {
System.exit(-1);
}

}

}.start();
});
Note:
Some legacy containers may block calls to System.exit(..) and you may have to find an alternate way to shut the app down. For example, when running Akka on top of a Spring / Tomcat setup, you could replace the call to System.exit(..) with a call to Spring’s ApplicationContext .close() method (or with a HTTP call to Tomcat Manager’s API to un-deploy the app).


Static Quorum(靜態(tài)法定人數(shù))

該策略會(huì)關(guān)閉分區(qū)中節(jié)點(diǎn)數(shù)量小于quorum-size的部分整慎。換句話說, quorum-size定義了集群必須運(yùn)行的最小節(jié)點(diǎn)數(shù)量围苫。
如果你的群集節(jié)點(diǎn)數(shù)量固定時(shí)裤园,或者集群中某個(gè)節(jié)點(diǎn)具有確定角色,此策略是一個(gè)不錯(cuò)的選擇剂府。
例如拧揽,在一個(gè)9節(jié)點(diǎn)群集中,您將配置quorum-size為5.如果存在4個(gè)和5個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)分割腺占,則包含5個(gè)節(jié)點(diǎn)的邊將生存下來淤袜,而其他4個(gè)節(jié)點(diǎn)將停止。 之后衰伯,在5節(jié)點(diǎn)群集中铡羡,不能再處理更多的故障,因?yàn)槭S嗟娜杭笮⑿∮?.在5節(jié)點(diǎn)群集中發(fā)生另一次故障的情況下意鲸,所有節(jié)點(diǎn)都將被關(guān)閉烦周。
因此尽爆,在刪除舊節(jié)點(diǎn)時(shí)加入新節(jié)點(diǎn)非常重要。

這樣做的另一個(gè)結(jié)果是读慎,如果在啟動(dòng)群集時(shí)存在無法訪問的節(jié)點(diǎn)漱贱,則在達(dá)到此限制之前,群集可能會(huì)立即關(guān)閉贪壳。 如果您幾乎同時(shí)啟動(dòng)所有節(jié)點(diǎn)饱亿,或者在the leader將“joining”更改為“up”之前使用akka.cluster.min-nr-of-members定義所需的成員數(shù)量,則這不是問題闰靴。您可以調(diào)整超時(shí)后彪笼,使用stable-after設(shè)置進(jìn)行下達(dá)決策。

注意不要是系統(tǒng)的節(jié)點(diǎn)數(shù)量超過quorum-size * 2 - 1蚂且,這樣就可能形成兩個(gè)單獨(dú)的集群配猫。

1.如果群集分成3個(gè)(或更多)部分,那么每個(gè)小于配置的quorum-size將自行關(guān)閉杏死,并可能關(guān)閉整個(gè)群集泵肄。

2.如果超過了quorum-size數(shù)量的分區(qū)被關(guān)閉了,同時(shí)其他運(yùn)行節(jié)點(diǎn)會(huì)自行關(guān)閉淑翼,因?yàn)樗麄冋J(rèn)為它們不是大多數(shù)腐巢,從而導(dǎo)致整個(gè)集群終止。(注:一個(gè)較大的分區(qū)被關(guān)閉玄括,會(huì)導(dǎo)致其他較小的分區(qū)關(guān)閉冯丙,即時(shí)數(shù)量多于quorum-size)

決策可以基于具有配置role的節(jié)點(diǎn)而不是集群中的所有節(jié)點(diǎn)。 當(dāng)某些類型的節(jié)點(diǎn)比其他節(jié)點(diǎn)更有價(jià)值時(shí)遭京,這會(huì)很有用胃惜。 例如,您可能有一些節(jié)點(diǎn)負(fù)責(zé)持久性數(shù)據(jù)和一些具有無狀態(tài)工作服務(wù)的節(jié)點(diǎn)哪雕。 那么盡可能多地保留持久數(shù)據(jù)節(jié)點(diǎn)可能更重要船殉,即使這意味著要關(guān)閉更多的工作節(jié)點(diǎn)。

這個(gè)role還有另一個(gè)用途斯嚎。 通過為集群中的少數(shù)(例如7個(gè))穩(wěn)定節(jié)點(diǎn)定義role并在static-quorum配置中使用該角色利虫,您將能夠動(dòng)態(tài)地添加和刪除沒有此角色的其他節(jié)點(diǎn),并且能夠更好的決策什么節(jié)點(diǎn)需要keep running 孝扛、什么節(jié)點(diǎn)需要shut down列吼。這種方法相對(duì)于keep-majority (下文將描述)的優(yōu)勢(shì)在于,您不必冒險(xiǎn)將群集分成兩個(gè)獨(dú)立的群集苦始。同樣還是不能啟動(dòng)太多具有role的節(jié)點(diǎn)寞钥。因?yàn)檫@樣的話就還會(huì)面對(duì)所有節(jié)點(diǎn)被關(guān)閉的風(fēng)險(xiǎn)。

Configuration:

akka.cluster.split-brain-resolver.active-strategy=static-quorum
akka.cluster.split-brain-resolver.static-quorum {
// minimum number of nodes that the cluster must have
quorum-size = undefined

// if the 'role' is defined the decision is based only on members with that 'role'
role = ""
}


Keep Majority

基于集群最后得知的成員信息陌选,該策略會(huì)關(guān)閉數(shù)量較少的一部分理郑。 如果兩部分分區(qū)數(shù)量相同蹄溉,那么將保持地址較低的節(jié)點(diǎn)。
如果集群的節(jié)點(diǎn)是動(dòng)態(tài)變化的您炉,那么該策略會(huì)是一個(gè)不錯(cuò)的選擇柒爵。因此也不能使用static-quorum策略.
但是這個(gè)策略也有個(gè)小問題,如果兩個(gè)分區(qū)基于不同的信息赚爵,那么就會(huì)導(dǎo)致兩個(gè)分區(qū)決策不一致棉胀。也就是說當(dāng)網(wǎng)絡(luò)分區(qū)的同時(shí)發(fā)生了成員資格的變更,就會(huì)出現(xiàn)這種情況冀膝。例如:有兩個(gè)節(jié)點(diǎn)在分區(qū)的一側(cè)唁奢,狀態(tài)變?yōu)椤癠P”,但是另一側(cè)并不知道窝剖,這樣會(huì)導(dǎo)致兩個(gè)分區(qū)都認(rèn)為自己是最多數(shù)麻掸,從而形成兩個(gè)集群。同樣在網(wǎng)絡(luò)分區(qū)之后分區(qū)決策之前有一些節(jié)點(diǎn)宕機(jī)赐纱,也會(huì)導(dǎo)致這種情況出現(xiàn)脊奋。
在這方面,使用static-quorum會(huì)更安全疙描,但這種策略的動(dòng)態(tài)性優(yōu)勢(shì)可能比風(fēng)險(xiǎn)更重要诚隙。

1、如果出現(xiàn)不止兩個(gè)分區(qū)起胰,且其中沒有一個(gè)分區(qū)是最多的(應(yīng)該是多余總數(shù)的一半最楷,因?yàn)樵摲謪^(qū)不知道另外的分區(qū)是多個(gè)還是一個(gè)),則整個(gè)集群都會(huì)被終止待错。
2、如果超過一半以上的節(jié)點(diǎn)同時(shí)宕機(jī)烈评,那么其他正在運(yùn)行的節(jié)點(diǎn)將會(huì)自動(dòng)關(guān)閉火俄,因?yàn)樗麄冋J(rèn)為自己不是大多數(shù),從而導(dǎo)致整個(gè)集群終止讲冠。

這個(gè)策略可以基于配置了role的節(jié)點(diǎn)瓜客,而不是所有節(jié)點(diǎn),當(dāng)某些類型的節(jié)點(diǎn)比其他節(jié)點(diǎn)更有價(jià)值時(shí)竿开,這會(huì)很有用谱仪。例如,您可能有一些負(fù)責(zé)持久數(shù)據(jù)的節(jié)點(diǎn)和一些具有無狀態(tài)工作服務(wù)的節(jié)點(diǎn)否彩。 那么盡可能多地保留持久數(shù)據(jù)節(jié)點(diǎn)可能更重要疯攒,即使這意味著要關(guān)閉更多的工作節(jié)點(diǎn)。
Configuration:
akka.cluster.split-brain-resolver.active-strategy=keep-majority

akka.cluster.split-brain-resolver.keep-majority {
// if the 'role' is defined the decision is based only on members with that 'role'
role = ""
}


Keep Oldest

名為“ keep-oldest ”的策略將停止不包含最舊成員的部分列荔。 有趣的是Cluster Singleton instance運(yùn)行在最老的成員上敬尺。

有一個(gè)例外:如果配置的down-if-alone 為on 枚尼,然后最好的員與其他節(jié)點(diǎn)網(wǎng)絡(luò)分區(qū),那么這個(gè)最老的節(jié)點(diǎn)會(huì)被終止砂吞,其他所有節(jié)點(diǎn)保持運(yùn)行署恍。但是如果集群只有這一節(jié)點(diǎn),改策略不會(huì)生效蜻直。

請(qǐng)注意盯质,down-if-alone 為on時(shí) , 如果最老的節(jié)點(diǎn)崩潰概而,其他節(jié)點(diǎn)將會(huì)將其從群集中刪除呼巷,否則 會(huì)關(guān)閉整個(gè)群集以及最早的節(jié)點(diǎn)。

當(dāng)你使用Cluster Singleton并且不想讓運(yùn)行該singleton instance的節(jié)點(diǎn)關(guān)掉到腥,這是個(gè)不錯(cuò)的策略朵逝。如果最老的節(jié)點(diǎn)宕機(jī),那么一個(gè)新的singleton instance將會(huì)在下一個(gè)最老的節(jié)點(diǎn)上被啟動(dòng)乡范。缺點(diǎn)是在集群分區(qū)是配名,該策略有可能只保存較少部分節(jié)點(diǎn)。 例如晋辆,如果一個(gè)最舊的部分由2個(gè)節(jié)點(diǎn)組成渠脉,另一個(gè)部分由98個(gè)節(jié)點(diǎn)組成,那么它將保留2個(gè)節(jié)點(diǎn)并關(guān)閉98個(gè)節(jié)點(diǎn)瓶佳。

這個(gè)策略有一個(gè)風(fēng)險(xiǎn)芋膘。如果分區(qū)的兩邊關(guān)于那個(gè)節(jié)點(diǎn)最老有不同的意見,可能兩邊都關(guān)閉霸饲,或者兩邊都運(yùn)行为朋。
兩邊都關(guān)閉的場(chǎng)合:集群分區(qū)后但是在決策之前,最老的節(jié)點(diǎn)宕機(jī)厚脉。
兩邊都運(yùn)行的場(chǎng)景:集群分區(qū)之前习寸,最老的節(jié)點(diǎn)宕機(jī),但是信息只傳播到一半的時(shí)候發(fā)生了集群分區(qū)傻工。

同樣這個(gè)策略可以基于配置了role的節(jié)點(diǎn)霞溪,而不是所有節(jié)點(diǎn)。
Configuration:

akka.cluster.split-brain-resolver.active-strategy=keep-oldest
akka.cluster.split-brain-resolver.keep-oldest {
// Enable downing of the oldest node when it is partitioned from all other nodes
down-if-alone = on

// if the 'role' is defined the decision is based only on members with that 'role',
// i.e. using the oldest member (singleton) within the nodes with that role
role = ""
}


Keep Referee

名為keep-referee的策略會(huì)放棄不包含給定裁判節(jié)點(diǎn)的部分中捆。
如果剩余節(jié)點(diǎn)數(shù)量少于配置 down-all-if-less-than-nodes鸯匹,那么剩余節(jié)點(diǎn)也會(huì)被關(guān)閉。如果裁判節(jié)點(diǎn)被刪除泄伪,那么所有節(jié)點(diǎn)也會(huì)被關(guān)掉殴蓬。
如果您有一個(gè)承載一些關(guān)鍵資源的節(jié)點(diǎn),并且沒有他系統(tǒng)無法運(yùn)行臂容,那么此策略很有用科雳。有一個(gè)缺點(diǎn)就是這個(gè)裁判節(jié)點(diǎn)只有一個(gè)根蟹。也不會(huì)造成兩個(gè)獨(dú)立的集群。
Configuration:
akka.cluster.split-brain-resolver.active-strategy=keep-referee
akka.cluster.split-brain-resolver.keep-referee {
// referee address on the form of "akka.tcp://system@hostname:port"
address = ""
down-all-if-less-than-nodes = 1
}


Multiple data centers
Akka Cluster支持多數(shù)據(jù)中心糟秘,每個(gè)數(shù)據(jù)中心相互獨(dú)立管理其分區(qū)的成員信息简逮。The Split Brain Resolver包含了該策略,也就是說其他分區(qū)的成員變更不會(huì)對(duì)該分區(qū)產(chǎn)生影響尿赚。

當(dāng)數(shù)據(jù)中心之間進(jìn)行網(wǎng)絡(luò)分區(qū)時(shí)散庶,典型的解決方案就是:等(do nothing)。其他決定應(yīng)由外部監(jiān)督工具或人員操作執(zhí)行凌净。


Cluster Singleton and Cluster Sharding
Cluster Singleton和Cluster Sharding的目的是在任何時(shí)間點(diǎn)至多運(yùn)行一個(gè)給定actor的一個(gè)實(shí)例悲龟。當(dāng)這種實(shí)例關(guān)閉時(shí),應(yīng)該在集群中的其他地方啟動(dòng)一個(gè)新實(shí)例冰寻。在舊實(shí)例停止之前须教,新實(shí)例未啟動(dòng)很重要。 當(dāng)單例或分片實(shí)例是持久化實(shí)例的時(shí)候斩芭,這是特別重要的轻腺,因?yàn)橐粋€(gè)持久化的actor實(shí)例的日志事件只能被一個(gè)actor寫。

由于分區(qū)的兩側(cè)不能通信划乖,所以分區(qū)兩側(cè)做決策的時(shí)間也會(huì)稍有不同贬养,因此必須有基于時(shí)間的余量,以確保新實(shí)例在舊的停止前未啟動(dòng)琴庵。
此持續(xù)時(shí)間有如下配置:
// Time margin after which shards or singletons that belonged to a downed/removed
// partition are created in surviving partition. The purpose of this margin is that
// in case of a network partition the persistent actors in the non-surviving partitions
// must be stopped before corresponding persistent actors are started somewhere else.
// This is useful if you implement downing strategies that handle network partitions,
// e.g. by keeping the larger side of the partition and shutting down the smaller side.
// Decision is taken by the strategy when there has been no membership or
// reachability changes for this duration, i.e. the cluster state is stable.
stable-after = 20s

您希望將此配置設(shè)置為短時(shí)間以實(shí)現(xiàn)快速故障切換误算,但這會(huì)增加多個(gè)單例/分片實(shí)例同時(shí)運(yùn)行的風(fēng)險(xiǎn),并且可能需要不同的時(shí)間來處理該決策
建議將其配置為與stable-after屬性相同的值迷殿。 不同簇大小的建議最小持續(xù)時(shí)間:
cluster size down-removal-margin
5 7 s
10 10 s
20 13 s
50 17 s

Expected Failover Time
如您所見儿礼,有幾個(gè)配置的超時(shí)會(huì)增加總故障切換延遲。 使用默認(rèn)配置的是:
failure detection 5 seconds(故障檢測(cè)5秒)
stable-after 20 seconds
down-removal-margin 20 seconds
總而言之庆寺,通過默認(rèn)配置蜘犁,您可以預(yù)計(jì)單例或分片實(shí)例的故障轉(zhuǎn)移時(shí)間大約為45秒。默認(rèn)配置的大小為100個(gè)節(jié)點(diǎn)的群集止邮。 如果您有大約10個(gè)節(jié)點(diǎn),則可以將stable-after 和down-removal-margin設(shè)置到10秒左右奏窑,從而可以實(shí)現(xiàn)預(yù)計(jì)約25秒的故障切換時(shí)間导披。

商用產(chǎn)品需要?jiǎng)?chuàng)建憑證,詳細(xì)信息參考:
https://www.lightbend.com/product/lightbend-reactive-platform/credentials
翻譯自:
https://developer.lightbend.com/docs/akka-commercial-addons/current/split-brain-resolver.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末埃唯,一起剝皮案震驚了整個(gè)濱河市撩匕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墨叛,老刑警劉巖止毕,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件模蜡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扁凛,警方通過查閱死者的電腦和手機(jī)忍疾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谨朝,“玉大人卤妒,你說我怎么就攤上這事∽直遥” “怎么了则披?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洗出。 經(jīng)常有香客問我士复,道長,這世上最難降的妖魔是什么翩活? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任阱洪,我火速辦了婚禮,結(jié)果婚禮上隅茎,老公的妹妹穿的比我還像新娘澄峰。我一直安慰自己,他們只是感情好辟犀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布俏竞。 她就那樣靜靜地躺著,像睡著了一般堂竟。 火紅的嫁衣襯著肌膚如雪魂毁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天出嘹,我揣著相機(jī)與錄音席楚,去河邊找鬼。 笑死税稼,一個(gè)胖子當(dāng)著我的面吹牛烦秩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播郎仆,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼只祠,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了扰肌?” 一聲冷哼從身側(cè)響起抛寝,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盗舰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晶府,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年钻趋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了川陆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爷绘,死狀恐怖书劝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情土至,我是刑警寧澤购对,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站陶因,受9級(jí)特大地震影響骡苞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜楷扬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一解幽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烘苹,春花似錦躲株、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廊鸥,卻和暖如春望浩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惰说。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工磨德, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吆视。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓典挑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啦吧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搔弄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)丰滑,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • Elasticsearch 是一個(gè)兼有搜索引擎和NoSQL數(shù)據(jù)庫功能的開源系統(tǒng),基于Java/Lucene構(gòu)建褒墨,可...
    PythonMaO閱讀 406評(píng)論 1 1
  • 系統(tǒng)環(huán)境: centos73.10.0-514.26.2.el7.x86_64 機(jī)器數(shù)量:五臺(tái) 硬盤:四塊一塊為系...
    think_lonely閱讀 4,673評(píng)論 0 5
  • 文/ 轉(zhuǎn) 01 說一句很有內(nèi)涵的詩句 一懶眾衫小 02 你聽過的第一個(gè)3D環(huán)繞音樂是什么炫刷? 丟手絹 03 一整個(gè)披...
    時(shí)間蒼白了誓言閱讀 244評(píng)論 0 0
  • 1.學(xué)習(xí)方面。學(xué)習(xí)了《恰好其分的自尊》了解到正視自己的缺點(diǎn)十分重要郁妈。 2浑玛,工作方面。前段時(shí)間我錯(cuò)誤的定義了自己噩咪。導(dǎo)...
    zhangqinqin閱讀 160評(píng)論 0 0