`

zookeeper学习笔记二

阅读更多

这几天尝试进行leader/follower的测试,当然目前还没去看源码实现.但觉得还是相当的.

以下是对网上一段代码的修改,因为原来的测不出来什么东西.

note:

运行时只有两个节点时(leader&follower),当leader down后,the other one 一般很少自动切换到ld;但三个以上是没有问题的,何解?不知道是不是所谓的'ensemble'模式下'大部分机器正常动作才提供supply services这个原因呢...

 

 
/**
 * LeaderElection
 * 通用实现方案:(MY)
 * 假如这个最小编号的 Server 死去,**由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除**,
 * 所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。
 * 这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。(可以参考本项目Locks.java)
 * NOTE:这里的实现是简化的
 * 
 * 本测试需要先单独启动TestMainServer(也可以打开TestMainServer.start()再启clients RAW),
 *  然后再启动其它若干个,
 *  再手工删除master node:/GroupMembers/leader,
 * 观察其它节目是否可以顺利过渡到新的leader-followers状态.

 */
public class LeaderElection extends TestMainClient {
    public static final Logger logger = Logger.getLogger(LeaderElection.class);
 
    public LeaderElection(String connectString, String root) {
        super(connectString);
//        try {
//            connectedSignal.await();    //MY test result:no effect
//        } catch (InterruptedException e1) {
//            e1.printStackTrace();
//        }     
         
        this.root = root;
        if (zk != null) {
            try {
                Stat s = zk.exists(root, false);
                if (s == null) {
                    zk.create(root, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
                }
            } catch (KeeperException e) {
                logger.error(e);
            } catch (InterruptedException e) {
                logger.error(e);
            }
        }
    }
 
    void findLeader() throws InterruptedException, UnknownHostException, KeeperException {
        byte[] leader = null;
        try {
            leader = zk.getData(root + "/leader", true, null);
        } catch (KeeperException e) {
            if (e instanceof KeeperException.NoNodeException) {    //this exception is acceptable
                logger.error(e);
                e.printStackTrace();
            } else {
                throw e;
            }
        }
        //已经存在master,只能作为follower
        if (leader != null) {
            System.out.println("10");
            following();
            //MY
            synchronized(mutex){
                mutex.wait();
            }
            System.out.println("14");
            findLeader();    //继续竟争master
        } else {
            System.out.println("11");
            String newLeader = null;
            byte[] localhost = InetAddress.getLocalHost().getAddress();
            try {
                newLeader = zk.create(root + "/leader", localhost, ZooDefs.Ids.OPEN_ACL_UNSAFE, 
                        CreateMode.EPHEMERAL);    //NOTE: 必须为临时节点,server死亡后可以由其它节点实时选举leader
                zk.exists(root + "/leader", true);    //set a watch for the COMING leader!
                
            } catch (KeeperException e) {
                //并发运行时可能出现此情况,this exception is acceptable
                if (e instanceof KeeperException.NodeExistsException) {
                    logger.error(e);
                    e.printStackTrace();
                } else {
                    throw e;
                }
            }
            if (newLeader != null) {
                leading();
                //other things to process...
                //for example
              //MY 驻留
                System.out.println("1");
                synchronized(mutex){
                    try {
                        System.out.println("2");
                        mutex.wait();
                        System.out.println("3");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //完成任务后放弃leader权限,但继续竟选leader
                
                //模拟死亡
                System.out.println("4");
                System.exit(1);        //EXIT
                System.out.println("5");
            } else {
                System.out.println("12");
                synchronized(mutex){
                    mutex.wait();
                }
                System.out.println("13");
                //MY
                findLeader();////继续竟争master
            }
        }
    }
 
    @Override
    public void process(WatchedEvent event) {
        System.out.println("9");
        if(event.getState() == KeeperState.SyncConnected){
            //MY
            //connectedSignal.countDown();
        }
         
        if (event.getPath().equals(root + "/leader") ) {
            if(event.getType() == Event.EventType.NodeCreated){
                System.out.println("得到通知-leader NodeCreated");
                //RAW
//                super.process(event);
//                following();
                
            }
            //MY 删除master时通知其它followers竟争选择新master
            if(event.getType() == Event.EventType.NodeDeleted){
                System.out.println("6");
                synchronized(mutex){
                    //System.out.println("7");
                    mutex.notify();    //如果每个应用中只存在一个waiter则可以使用这方法,否则使用notifyAll()
                } 
                System.out.println("8");
                //MY
                //模拟:如果是本server宕机了,删除master node(如果没删除),让其它nodes选举一个继任master
//                try {
//                    byte[] localhost = InetAddress.getLocalHost().getAddress();
//                    byte[] leader = zk.getData(root + "/leader", true, null);
//                    if(new String(localhost).equals(new String(leader))){
//                        zk.delete(root + "/leader", -1);
//                        //退出本应用.所以本应用最好使用TestMainServer先运行提供服务,
//                        //而不是利用一个启动LeaderElection驻留来提供服务
//                    }else{
//                        //do nothing,其它node继续寻求继任master
//                    }
//                } catch (UnknownHostException e) {
//                    e.printStackTrace();
//                } catch (KeeperException e) {
//                    e.printStackTrace();
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
            }
        }
    }
 
    void leading() {
        System.out.println("成为领导者");
    }
 
    void following() {
        System.out.println("成为组成员");
    }
 
    public static void main(String[] args) {
//        TestMainServer.start();        //if enable this clause,the flag EXIT must be commented
        String connectString = "localhost:" + TestMainServer.CLIENT_PORT;
 
        LeaderElection le = new LeaderElection(connectString, "/GroupMembers");
        try {
            le.findLeader();
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
        }
    }
}

 

 

tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例(hbase也

集群模式配置(比单机模式多添加的项)
 initLimit=5
 syncLimit=2
 server.1=192.168.211.1:2888:3888
 server.2=192.168.211.2:2888:3888
* initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
* syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
* server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

利用zkCli.sh -server <host>:<port>可以连接指定的zk Servers;
不同的host或port建立的nodes,是存放不同的.

zk.setData()方法后,watch恢复false默认
是否产生event只决定于最后一次的设置true/false

分享到:
评论

相关推荐

    zookeeper学习笔记

    ### Zookeeper 学习笔记 #### 一、Zookeeper 简介与安装配置 **Zookeeper** 是一个分布式协调服务框架,它提供了一种高效可靠的机制来维护集群中的配置信息、命名服务以及提供分布式锁等功能,使得开发人员能够...

    基于Java语言的Zookeeper学习笔记设计源码

    该项目为基于Java语言的Zookeeper学习笔记设计源码,总计包含20个文件,具体构成包括15个Java源文件、3个PNG图片文件以及1个Markdown文件。此外,项目还包含1个XML配置文件,适用于学习和实践Zookeeper相关知识。

    Zookeeper学习笔记.docx

    ZooKeeper 学习笔记 ZooKeeper 是一个开源的分布式协调服务,由 Hadoop 的创始人 Doug Cutting 等人开发。它为分布式应用提供了一个高效、可靠的协调机制,帮助开发者快速构建高可用、可扩展的分布式系统。 ...

    Zookeeper学习笔记.pdf

    Zookeeper是一种重要的分布式协调服务,尤其在处理高可用性、高性能的应用场景中。它最初设计的核心功能是提供分布式锁服务,但随着社区的发展,Zookeeper的功能得到了扩展,现在还用于配置维护、组服务、分布式消息...

    Zookeeper学习笔记

    【Zookeeper学习笔记】 Zookeeper是一个分布式协调服务,它的核心目标是简化分布式环境下的数据管理与系统协调。作为Apache Hadoop和HBase的重要组件,Zookeeper提供了简单的原语集,支持分布式应用程序之间的通信...

    zookeeper学习笔记.pptx

    本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,

    ZooKeeper学习笔记

    ### ZooKeeper概述 ZooKeeper,如同其名字所暗示的那样,扮演着“动物园管理员”的角色,主要负责管理和协调各种分布式应用程序(如Hadoop、Hive、Pig等)。它是一个开源的分布式协调服务框架,旨在帮助开发者解决...

    2021尚硅谷技术之Zookeeper笔记

    总的来说,尚硅谷2021年的ZooKeeper笔记提供了一套全面的学习资源,帮助开发者深入了解ZooKeeper的工作原理及其在分布式系统中的关键作用。通过深入学习和实践,可以提升在分布式协调领域的技术水平。

    zookeeper完整学习笔记

    【Zookeeper概述】 Apache ZooKeeper 是一款开源的分布式协调服务,设计用于管理和简化分布式环境中的数据协调任务。它提供了一种简单、高可用且容错的机制,使得开发者可以专注于核心业务逻辑,而不是复杂的分布式...

    Zookeeper学习资源和笔记(附代码)

    Zookeeper是Apache Hadoop项目下的一个子项目,它是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。...通过深入学习和实践,可以更好地应对分布式环境中的各种挑战。

    zookeeper笔记

    ### Zookeeper概述 Zookeeper是一种分布式协调服务框架,它的核心任务是为用户的分布式应用程序提供一系列的协调...无论是从其提供的服务还是从其内部的机制来看,Zookeeper都是值得深入学习和掌握的重要技术之一。

    Hbase与zookeeper笔记备份.rar

    2. 协同机制:Hbase依赖Zookeeper进行状态维护和故障恢复,而Zookeeper依赖Hbase提供高可用的服务,两者相互协作,共同构建起强大的分布式数据处理平台。 总结,Hbase与Zookeeper在大数据处理中的作用不可替代。...

    学习笔记--zookeeper

    2. **状态同步服务**:Zookeeper能够帮助分布式系统中的节点保持同步状态,确保所有节点看到的数据是一致的。 3. **集群管理**:Zookeeper可以协助进行集群成员的动态管理,如节点的加入和退出,以及集群状态的监控...

    zookeeper一站式学习资料

    《Zookeeper一站式学习资料》是一份全面覆盖Zookeeper基础到高级知识的学习资源包,旨在帮助初学者快速入门并深入理解Zookeeper。这份资料包含了丰富的文本资料、视频教程以及相关的实践代码,是学习分布式协调服务...

    zookeeper资料

    “zookeeper学习笔记.vsdx”可能是一个Visio图表,用于可视化Zookeeper的数据结构、工作流程或架构;而“zookeeper-trunk”可能是一个源码仓库,包含Zookeeper的源代码,适合深入理解其内部机制和进行二次开发。 ...

    尚硅谷大数据技术之zookeeper

    而“尚硅谷大数据技术之Zookeeper.xmind”思维导图,则是将整个Zookeeper的知识体系以图形化的形式展现出来,帮助学习者梳理知识点,形成全面的认知框架。 总的来说,这个教程提供了从理论到实践的全面学习材料,...

    dubbo+zookeeper入门资源

    【描述】"dubbo+zookeeper入门资源,可直接使用,适合新手练习使用"意味着这个压缩包包含了学习和实践这两个技术的基础材料。通过这个资源,初学者可以了解如何配置和使用Dubbo与Zookeeper来实现服务间的通信和管理...

    zookeeper+hbase快速入门全套笔记

    #### 二、Zookeeper整体运行机制 Zookeeper的核心是原子广播(Atomic Broadcast)协议,该协议保证了事务的顺序一致性。当客户端向Zookeeper发起请求时,Zookeeper会通过一系列机制确保所有的服务器最终达成一致的...

Global site tag (gtag.js) - Google Analytics