• [译]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();	//关闭选举
    
  • 相关阅读:
    Linux下串口编程入门
    arm-linux-gdb+gdbserver环境搭建以及远程调试
    google jib容器打包工具
    docker入门——构建镜像
    Docker搭建MySQL服务
    docker基本操作
    Docker 使用指南—— 基本操作
    使用docker Maven插件本地构建docker镜像并发布到远程服务器
    10张图带你深入理解Docker容器和镜像
    springboot+Jib+Maven+Idea+Docker 实践
  • 原文地址:https://www.cnblogs.com/resentment/p/6258813.html
Copyright © 2020-2023  润新知