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(); } } }
- zookeeper的理解---初级第一篇
- 资深屌丝,初级程序猿的第一篇博客
- 第一篇 :概念理解
- 第一篇 理解线程
- linux 学习心得笔记<初级>第一篇
- 【opencv2 初级篇】第一篇:前言
- ZooKeeper学习总结 第一篇:ZooKeeper快速入门
- 第一篇在CSDN的文章-----教你如何成为一名Java初级程序员
- 彻底理解指针第一篇
- [黑马程序员]第一篇:我理解的面向对象思想
- 第一篇 对Javascript中原型的深入理解
- android MediaPlayer理解_我的第一篇博客
- javaweb回顾第一篇servlet的学习和理解
- 从科学的角度来理解和田玉---第一篇
- 我的第一篇博客之安装和配置zookeeper的点点滴滴
- JAVA和Zookeeper交互的初级代码
- 对于Zookeeper的理解
- zookeeper自己的理解
- memcached搭建缓存系统
- Linux关于find操作
- 设计模式C++实现——外观模式
- 第2次实验——算法基本功 与 综合思考
- setjmp&longjmp
- zookeeper的理解---初级第一篇
- ImageView.ScaleType设置图解
- 第1次实验——NPC问题(回溯算法、聚类分析)
- 用jQuery AJAX调用WCF服务
- hdu1529 差分约束(好题)
- 入门DP专练
- 浅谈搜狐云景PAAS平台
- maven setting配置
- 第一个博客-麦泽明