2015-06-01 14 views
11

Tôi đọc trong Akka của documentation rằng khi sử dụng cụm singleton nên tránh sử dụng tự động downing. Tôi không hiểu làm thế nào nên downing được cấu hình trong trường hợp đó. Tôi hiểu rằng tôi có thể đăng ký các sự kiện thành viên nhóm và lập kế hoạch chiến lược của mình theo những thông điệp đó. Tuy nhiên, tôi không hiểu làm thế nào thực tế nó sẽ khác với downing tự động. Khi một nút bằng cách nào đó được phân đoạn từ cụm, nếu tự động downing được sử dụng, nút phân vùng sẽ "nghĩ" rằng toàn bộ cụm bị mất và bắt đầu một cụm của riêng nó (với singleton riêng của nó). Nhưng, mặt khác, tôi không thể giữ các nút không thể truy cập ở trạng thái không thể truy cập được vì cụm sẽ không đạt được hội tụ (các nút mới sẽ không thể tham gia) và nếu nút được phân đoạn là bản thân singleton mới nút sẽ không được chỉ định và theo đó, theo sự hiểu biết của tôi, điều duy nhất còn lại để làm là loại bỏ các nút không thể truy cập sau một số thời gian gia hạn mà chính xác là những gì tự động downing nào.Làm thế nào để cấu hình xuống trong cụm akka khi một singleton là hiện tại

Tôi bỏ lỡ điều gì ở đây?

+0

tôi có câu hỏi tương tự như bạn. dường như chúng ta không có cách nào để ngăn chặn phân vùng 2 cụm bắt đầu cụm riêng mình Singleton – mingchuno

Trả lời

1

kiểm tra mã bên dưới. Tôi đã tắt tính năng auto-down-unreachable-after như tài liệu đã nói. Thay vào đó, tôi thực hiện một logic tùy chỉnh khác một chút so với bình thường. Chìa khóa của mã bên dưới là nếu phân vùng mạng xảy ra, chỉ các nút cụm có phần lớn sẽ giảm xuống UnreachableMember sau một số 5s có ​​thể định cấu hình. Mặt khác, thiểu số các nút cụm sẽ đi theo số UnreachableMember (là nhóm đa số là unreachable và không đưa chúng xuống để tạo thành một hòn đảo. Ý tưởng về số lượng đa số là vay từ MongoDB mà tôi nghĩ là không phải là mới trong lĩnh vực khoa học máy tính.

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

Cám ơn nhận xét của bạn nhưng tôi không hiểu điều gì đó Khi các nút được phân chia (đa số) trở về phần lớn, cho phép các vấn đề mạng/gc được giải quyết, trừ khi các nút thiểu số khởi động lại hệ thống diễn viên của chúng (để tạo lại mã thông báo mới), chúng sẽ có thể kết nối lại với đa số ? Bởi vì theo như tôi biết nút đã bị xóa khỏi cụm, nó không thể trở lại với cùng một mã thông báo. – Mizh

+0

Xin chào, tôi biết đây là cũ. Nhưng đối với bất cứ ai tìm kiếm câu trả lời. Các nút được phân đoạn đã được đánh dấu là giảm xuống bởi đa số sẽ rõ ràng phải được khởi động lại để tham gia nhóm một lần nữa. http://doc.akka.io/docs/akka/2.4.2/scala/cluster-usage.html#Joining_to_Seed_Nodes – Cal

+1

Tôi đã thử nghiệm điều này trên Akka 2.4.3 và đã xác nhận rằng nó đang hoạt động. Tôi có hai máy, tôi chạy phần lớn các nút của tôi trên Máy A và một thiểu số trên Máy B. Tôi cắt đứt kết nối giữa A và B để mô phỏng một phân vùng. Máy Một nút đưa ra các yêu cầu gỡ bỏ trên nhóm thiểu số (nút B của máy) và các nút thiểu số có thể nhận ra rằng thực tế chúng là thiểu số. Lưu ý rằng các nút thiểu số không chấm dứt chính nó và vẫn chạy. Cần thêm logic để tắt chúng. Tìm kiếm "bộ não phân chia cụm từ và kết nối lại" để biết thêm thông tin. Cảm ơn bạn đã chia sẻ @mingchuno – Cal

Các vấn đề liên quan