2015-06-01 34 views
11

Akka'nın documentation numarasını okuduğumda, kümelenme tekilini kullanırken otomatik azaltmayı kullanmaktan kaçınmalıdır. Bu durumda aşağı inmenin nasıl yapılandırılacağını anlamıyorum. Küme üyelik etkinliklerine abone olabileceğimi ve stratejimi bu mesajlara göre planlayabildiğimi anlıyorum. Ancak, otomatik inişten ne kadar farklı olacağımı anlamıyorum.Tekton mevcut olduğunda akka kümelenmesinde düşüşü yapılandırma

Düğüm bir şekilde kümeden bölümlenmişse, otomatik düşürme kullanılırsa, bölümlenmiş düğüm tüm kümenin kaybolduğunu ve kendi kümesini (kendi tekiliyle) başladığını "düşünür". Ancak, diğer yandan, ulaşılamaz düğümleri ulaşılamaz durumda tutamıyorum çünkü küme yakınsamaya ulaşmayacak (yeni düğümler birleştiremeyecektir) ve bölümlenmiş düğüm singletonun kendisi yeni bir singleton ise node atanmayacak ve benim anlayışıma göre, yapılacak tek şey, tam olarak ne zaman otomatik olarak azalmanın tam olarak gerçekleştiği belli bir süre sonra erişilemeyen düğümleri kaldırmaktır.

Burada neleri özlüyorum?

+0

sen. biz – mingchuno

cevap

1

aşağıdaki kodu inceleyin. Doktorun dediği gibi auto-down-unreachable-after özelliğini kapattım. Bunun yerine, normalden biraz farklı bir özel mantık uygularım. Aşağıdaki kodun anahtarı, ağ bölümünün gerçekleşmesi durumunda, çoğunluğu olan küme düğümleri, bazı yapılandırılabilir 5'lerden sonra UnreachableMember'u aşağı çekecektir. Öte yandan, küme düğümlerinin azınlıkları UnreachableMember (unreachable gibi çoğunluk grubu) ve bir ada oluşturmak için onları aşağı çekmeyeceklerdir.Çok sayıda kişinin fikri, düşündüğün MongoDB'den borçlanmaktadır bilgisayar bilimi alanında yeni değildir.

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

teşekkürler yorum için kendi küme başlatmak Singleton 2 küme bölünmeyi önlemek için hiçbir yolu var gibi görünüyor gibi aynı soru var ama bir şey anlamıyorum Bölümlenmiş (azınlık) düğümler çoğunluğa geri döndüğünde, azınlık düğümleri aktör sistemini yeniden başlatmazsa (yeni belirteci yeniden oluşturmak için), ağ/gc sorunlarının çözüleceğini söyleyin, tekrar çoğunluğa bağlanabilirler. Çünkü bildiğim kadarıyla eğer düğüm, aynı simge ile geri dönemediği kümeden silindi. – Mizh

+0

Merhaba, bunun eski olduğunu biliyorum. Ama cevap arayan herkes için. Çoğunlukla aşağıya işaretlenmiş bölümlenmiş düğümlerin, kümeye tekrar katılmak için açıkça yeniden başlatılması gerekir. http://doc.akka.io/docs/akka/2.4.2/scala/cluster-usage.html#Joining_to_Seed_Nodes – Cal

+1

Bunu Akka 2.4.3 üzerinde test ettim ve çalıştığını doğruladım. İki makinem var, düğümlerimin çoğunluğunu A Makine'sinde ve Makine B'deki bir azınlıkta yapıyorum. Bir bölümü simüle etmek için A ve B arasındaki bağlantıyı kesiyorum. Makine Azınlıklara (Makine B düğümleri) ve azınlık düğümlerine karşı bir düğüm noktası çıkarılması, aslında azınlık olduklarını fark edebilir. Azınlık düğümlerinin kendilerini sonlandırmadıklarını ve çalışmaya devam ettiklerini unutmayın. Bunları kapatmak için ek mantık gereklidir. Daha fazla bilgi için "akka küme bölünmüş beyin ve yeniden" ara. @mingchuno paylaşım için teşekkürler – Cal