zookeeper的理解---初级第一篇

来源:互联网 发布:矩阵相乘值的性质 编辑:程序博客网 时间:2024/05/19 16:07

 完了很久的hbase,从单机版的,玩到分布式,感觉很奇怪,这个zookeeper和hmaster到底是什么关系,所以,最近也看了不少资料,有了一点理解

对于一个分布式系统来说,肯定存在master和slaver,如果master只在台机器上跑的话,毫无疑问的会出现单点问题,所以一般都会在多台机器上同时运行多个master,当然了,这些master之间都是数据同步的,要不然怎么实现热备,热切换。

说道这儿,zookeeper就该登场了。zookeeper就可以作为一个分布式数据同步的中间过程,或者可以分担一些master的工作,减轻master的负担。

Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,后面将会详细介绍 Zookeeper 能够解决的一些典型问题,这里先介绍一下,Zookeeper 的操作接口和简单使用示例。

如果想和zookeeper交互,可以通过创建一个 org.apache.zookeeper. ZooKeeper 的一个实例对象,然后调用这个类提供的接口来和服务器交互。

前面说了 ZooKeeper 主要是用来维护和监控一个目录节点树中存储的数据的状态,所有我们能够操作 ZooKeeper 的也和操作目录节点树大体一样,如创建一个目录节点,给某个目录节点设置数据,获取某个目录节点的所有子目录节点,给某个目录节点设置权限和监控这个目录节点的状态变化。

Zookeeper Demo:

 // 创建一个与服务器的连接 ZooKeeper zk = new ZooKeeper("localhost:" + CLIENT_PORT,         ClientBase.CONNECTION_TIMEOUT, new Watcher() {             // 监控所有被触发的事件            public void process(WatchedEvent event) {                 System.out.println("已经触发了" + event.getType() + "事件!");             }         });  // 创建一个目录节点 zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,   CreateMode.PERSISTENT);  // 创建一个子目录节点 zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),   Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);  System.out.println(new String(zk.getData("/testRootPath",false,null)));  // 取出子目录节点列表 System.out.println(zk.getChildren("/testRootPath",true));  // 修改子目录节点数据 zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1);  System.out.println("目录节点状态:["+zk.exists("/testRootPath",true)+"]");  // 创建另外一个子目录节点 zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(),    Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);  System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo",true,null)));  // 删除子目录节点 zk.delete("/testRootPath/testChildPathTwo",-1);  zk.delete("/testRootPath/testChildPathOne",-1);  // 删除父目录节点 zk.delete("/testRootPath",-1);  // 关闭连接 zk.close();输出的结果如下:已经触发了 None 事件! testRootData  [testChildPathOne] 目录节点状态:[5,5,1281804532336,1281804532336,0,1,0,0,12,1,6] 已经触发了 NodeChildrenChanged 事件! testChildDataTwo 已经触发了 NodeDeleted 事件!已经触发了 NodeDeleted 事件!

只要node中的数据发生变化,就会触发watcher的方法  ------------------------》》》实现多master的同步

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

话说回来,如果有多个master,那总该有个leader吧,这是zookeeper的另一个重要的功能


Zookeeper 如何实现 Leader Election,也就是选出一个 Master Server。和前面的一样每台 Server 创建一个 EPHEMERAL 目录节点,不同的是它还是一个 SEQUENTIAL 目录节点,所以它是个 EPHEMERAL_SEQUENTIAL 目录节点。之所以它是 EPHEMERAL_SEQUENTIAL 目录节点,是因为我们可以给每台 Server 编号,我们可以选择当前是最小编号的 Server 为 Master,假如这个最小编号的 Server 死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。

选举Demo:

void findLeader() throws InterruptedException {         byte[] leader = null;         try {             leader = zk.getData(root + "/leader", true, null);         } catch (Exception e) {             logger.error(e);         }         if (leader != null) {             following();         } else {             String newLeader = null;             try {                 byte[] localhost = InetAddress.getLocalHost().getAddress();                 newLeader = zk.create(root + "/leader", localhost,                 ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);             } catch (Exception e) {                 logger.error(e);             }             if (newLeader != null) {                 leading();             } else {                 mutex.wait();             }         }     }


0 0
原创粉丝点击