zoukankan      html  css  js  c++  java
  • [译]ZOOKEEPER RECIPES-Leader Election

    选主

    使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志。主要思想是,使用一个znode,比如"/election",每个客户端创建一个子节点"/election/guid-n_",并同时使用Sequence和Ephemeral标志。使用sequence标志后ZooKeeper会自动递增序列号。拥有最小编号的节点就是主节点。
    这还不是全部,同时还需要watch主节点的失效,在当前主节点失效后,会产生新的主节点。一般情况是所有节点都监视着最小的那个节点,并在主节点失效时检查自己是否成为新的主节点(由于使用了ephemeral,节点失效就会删除对应znode)。但是这会造成羊群效应,当前主节点失效,所有其他进程都会收到通知,并运行getChildren来获得当前所有存活的节点。如果节点数量很大,就会导致ZooKeeper的工作量激增。为了避免羊群效应,可以只监视比自己小的那个节点。如果一个客户端收到一个watch通知,它就成为新的主节点。这样就避免所有节点监视一个节点导致的羊群效应。

    伪代码

    假设ELECTION是用于选主的路径。为了竞选主节点:
    1.创建znode z路径为"ELECTION/guid-n_"并同时使用SEQUENCE和EPHEMERAL
    2.假设C是"ELECTION"的子节点集,i是z的序列号
    3.监视"ELECTION/guid-n_j",j是仅次于自己的序列号。j<i且在C中存在n_j节点
    在被监视节点删除后收到通知:
    1.假设C是ELECTION最新的子节点集
    2.如果z是C中最小的节点,则进行主节点的工作
    3.不然监视"ELECTION/guid-n_j",j是仅次于自己的序列号。j<i且在C中存在n_j节点

    注意

    • 如果一个znode是最小的节点,并不代表它知道自己是主节点,所以可以通过在一个不同的目录创建节点来标识已经完成主节点的操作。
    • guid的使用可以参考可恢复错误和GUID

    Curator实现

    Leader Latch

    public LeaderLatch(CuratorFramework client,
                       String latchPath)
    /**
    client 		客户端实例
    latchPath 	选举路径
    **/
    
    leaderLatch.start();	//开启选举
    leaderLatch.heasLeadership()	//返回是否为主节点
    leaderLatch.await();	//等待直到成为主节点
    leaderLatch.close();	//关闭
    

    Leader Election

    public LeaderSelector(CuratorFramework client,
                          String mutexPath,
                          LeaderSelectorListener listener)
    /**
    client 		客户端实例
    mutexPath 	选举路径
    listener 	被选中后的监听器
    **/
    
    leaderSelector.start();	//开启选举
    leaderSelector.close();	//关闭选举
    
  • 相关阅读:
    HDU 4379 水题,大水,但我WA了很多次,做了很久
    HDU 1712分组背包 考试复习安排
    所谓的二维背包Triangular Pastures POJ 1948
    ZOJ 1203 Swordfish Kruskal算法求最小生成树
    POJ 2576 Tug of War二维背包恰好装满.
    O(n*m)复杂度的多重背包coinsPOJ 1742
    拓扑排序POJ 1094
    页面右键下拉表
    gb2312 unicode转换工具
    INPUT读出URL里的变量名称
  • 原文地址:https://www.cnblogs.com/resentment/p/6258813.html
Copyright © 2011-2022 走看看