2015-06-01 5 views
11

Ich lese in documentation von Akka, dass bei Verwendung von Cluster Singleton sollte man automatische Abschaltung zu vermeiden. Ich verstehe nicht, wie Downing in diesem Fall konfiguriert werden sollte. Ich verstehe, dass ich Cluster-Mitgliedschaftsereignisse abonnieren und meine Strategie entsprechend diesen Nachrichten planen kann. Allerdings verstehe ich nicht, wie praktisch es sich vom automatischen Downing unterscheidet.So konfigurieren Sie Downing in akka Cluster, wenn ein Singleton vorhanden ist

Wenn ein Knoten irgendwie vom Cluster partitioniert ist, "denkt" der partitionierte Knoten, wenn das automatische Herunterfahren verwendet wird, dass der gesamte Cluster verloren gegangen ist und einen eigenen Cluster (mit eigenem Singleton) gestartet hat. Aber andererseits kann ich unerreichbare Knoten nicht für immer in unerreichbarem Zustand halten, weil der Cluster keine Konvergenz erreicht (neue Knoten können nicht beitreten) und wenn der partitionierte Knoten der Singleton selbst ist, ein neuer Singleton Der Knoten wird nicht zugewiesen und daher muss ich nach meinem Verständnis nur noch nicht erreichbare Knoten nach einer gewissen Gnadenzeit entfernen, was genau das ist, was ein automatischer Abstieg tut.

Was vermisse ich hier?

+0

ich habe die gleiche Frage wie Sie. Es scheint, dass wir keine Möglichkeit, zu verhindern, dass zwei Cluster-Partition starten ihre eigenen Cluster Singleton – mingchuno

Antwort

1

Überprüfen Sie den folgenden Code. Ich habe die auto-down-unreachable-after Funktion ausgeschaltet, wie das Dokument sagte. Stattdessen implementiere ich eine benutzerdefinierte Logik, die ein bisschen anders als normal ist. Der Schlüssel des folgenden Codes ist, wenn Netzwerkpartition passiert, nur Cluster-Knoten, die Mehrheit haben, wird UnreachableMember nach einigen konfigurierbaren 5s herunterfahren. Auf der anderen Seite, wird die Minderheit der Cluster-Knoten ihre UnreachableMember (die die Mehrheitsgruppe als unreachable ist) und sie nicht zu einer Insel zu bilden. Die Idee der Anzahl der Mehrheit ist von MongoDB zu leihen, die ich denke, ist in der Informatik-Bereich nicht neu.

class ClusterListener extends Actor with ActorLogging { 

    val cluster = Cluster(context.system) 
    var unreachableMember: Set[Member] = Set() 

    // subscribe to cluster changes, re-subscribe when restart 
    override def preStart(): Unit = { 
    //#subscribe 
    cluster.subscribe(self, initialStateMode = InitialStateAsEvents, classOf[UnreachableMember], classOf[ReachableMember]) 
    //#subscribe 
    } 
    override def postStop(): Unit = cluster.unsubscribe(self) 

    def receive = { 
    case UnreachableMember(member) => 
     log.info("Member detected as unreachable: {}", member) 
     val state = cluster.state 
     if (isMajority(state.members.size, state.unreachable.size)) { 
     scheduletakeDown(member) 
     } 
    case ReachableMember(member) => 
     unreachableMember = unreachableMember - member 
    case _: MemberEvent => // ignore 
    case "die" => 
     unreachableMember.foreach { member => 
     cluster.down(member.address) 
     } 
    } 

    // find out majority number of the group 
    private def majority(n: Int): Int = (n+1)/2 + (n+1)%2 

    private def isMajority(total: Int, dead: Int): Boolean = { 
    require(total > 0) 
    require(dead >= 0) 
    (total - dead) >= majority(total) 
    } 

    private def scheduletakeDown(member: Member) = { 
    implicit val dispatcher = context.system.dispatcher 
    unreachableMember = unreachableMember + member 
    // make 5s config able!!! 
    context.system.scheduler.scheduleOnce(5 seconds, self, "die") 
    } 

} 
+0

Danke für Ihren Kommentar, aber ich verstehe nicht, etwas Wenn die partitionierten (Minoritäts-) Knoten zur Mehrheit zurückkehren, sagen wir, die Netzwerk-/GC-Probleme wurden gelöst, es sei denn, die Minoritätsknoten starten ihr Akteursystem neu (um ein neues Token zu regenerieren), könnten sie wieder eine Verbindung zur Mehrheit herstellen ? denn soweit ich weiß Wenn a Der Knoten wurde aus dem Cluster gelöscht und kann nicht mit demselben Token zurückgegeben werden. – Mizh

+0

Hallo, ich weiß, das ist alt. Aber für jeden, der nach der Antwort sucht. Die partitionierten Knoten, die von der Mehrheit als "down" markiert wurden, müssten explizit neu gestartet werden, um dem Cluster erneut beizutreten. http://doc.akka.io/docs/akka/2.4.2/scala/cluster-usage.html#Joining_to_Seed_Nodes – Cal

+1

Ich habe dies auf Akka 2.4.3 getestet und habe bestätigt, dass es funktioniert. Ich habe zwei Maschinen, ich betreibe die Mehrheit meiner Knoten auf Maschine A und eine Minderheit auf Maschine B. Ich durchtrenne die Verbindung zwischen A und B, um eine Partition zu simulieren. Die Knoten der Maschine A setzen die Minoritäten außer Gefecht (Knoten der Maschine B) und die Minderheitenknoten können erkennen, dass sie tatsächlich die Minderheit sind. Beachten Sie, dass sich die Minoritätsknoten nicht selbst beenden und weiterlaufen. Zusätzliche Logik ist erforderlich, um sie herunterzufahren. Suche "akka cluster split brain und reconnect" für weitere Informationen. Vielen Dank für die Freigabe @michuno – Cal

Verwandte Themen