1.ZooKeeper的开源分布式协调服务是Google的Chubby的开源实现。它是一种为分布式应用程序提供一致服务的软件。2、ZooKeeper提供的功能配置和维护域名服务分布式锁组服务3、ZooKeeper的特点是简单ZooKeeper的核心是一个精简的文件系统,它支持一些简单的操作和一些抽象的操作。ZooKeeper的操作非常丰富,可以实现一些协调数据的结构和协议。例如分布式队列、分布式锁、同一级别的一组节点中的“leader选举”等都是高可靠的。ZooKeeper支持集群模式,可以轻松解决单点故障问题。松耦合交互不同进程之间的交互不需要相互认识,甚至不需要同时存在。一个进程在ZooKeeper中留下消息后,其他进程在该进程结束后也可以读取这条消息。4.ZooKeeper的角色领导者(leader)负责投票的发起和决议,更新系统状态。学习者(learner)包括追随者(followers)和观察者(observers)。Followers用于接受客户终端请求并将结果返回给客户端,并在选举过程中参与投票。Observer可以接受客户端连接,并向leader转发写请求,但是observer不参与投票过程,只同步leader的状态。观察者的目的是扩展系统,提高阅读速度。客户端(client)请求发起者5.ZooKeeper数据模型具有层次化的目录结构,命名符合常规的文件系统规范。每个节点在zookeeper中称为一个znode,它有一个唯一的路径标识。节点znode可以包含数据和子节点,但是EPHEMERAL类型的节点在znode中不能有子节点数据可以有多个版本。比如某个路径下有多个数据版本,查询这个路径下的数据需要带上版本。客户端应用程序可以在节点上设置监视器。是一次性完全读写的6.ZooKeeper节点Zookeeper中的节点包括以下两类节点。临时节点(ephemeral)和持久节点(persistent)znode的类型在创建时就确定了,以后不能修改。未指定默认的znode类型。Persistentnodeephemeraltypenode会在节点客户端会话结束时删除zookeeper中的节点客户端与服务端的通信采用长连接方式。每个客户端和服务器通过心跳保持连接。这种连接状态称为会话。如果znode是临时节点,则seesion失败并删除znode。7.ZooKeeper中选举机制服务器的ID分别为1、2、3,数字越大,在选举算法中的权重越大。数据ID服务器中存储的最大数据ID。值越大,数据越新,选举算法中的数据权重越新编辑时钟投票数越大,同一轮投票中的逻辑时钟值相同。每投一票这个数据都会增加,然后和其他服务器收到的投票信息返回的值进行比较,根据选举状态LOOKING和选举状态的不同值做出不同的判断。FOLLOWING、Follower状态、同步leader状态、参与投票。OBSERVING,观察状态,同步leader状态,不参与投票。LEADING,领袖地位。选举信息的内容投票完成后,需要向集群中的所有服务器发送投票信息,其中包含以下内容。ServerIDDataIDLogicalClockElectionStatus选举机制的结果zk启动后,通过选举机制选举出一个leader。8.ZooKeeper集群搭建需要大于1的奇数机器。8.1准备安装包zookeeper-3.4.6.tar。gz8.2解压tar-zxvfzookeeper-3.4.6.tar.gz-C/opt/8.3renamemvzookeeper-3.4.6/zookeeper8.4配置环境变量exportZOOKEEPER_HOME=/opt/zookeeperexportPATH=PATH:ZOOKEEPER_HOME/bin8.5配置zookeepercpzoo_sample.cfgzoo.cfgdataDir=/opt/zookeeper/data8.6myid文件在每台zookeeper机器中创建myid文件(/opt/zookeeper/data),内容为1238.7配置zoo.cfgserver.1=uplooking03:2888:3888server.2=uplooking04:2888:3888server.3=uplooking05:2888:38888.8查看zookeeper集群的时间,确保zookeeper集群中的时间不能有超过20秒的误差ntpdate-untp.api.bz根据时间同步服务器同步时间,-u为绕过防火请启动zookeeper服务zkServer.sh8.9start9。ZooKeeper9.1zookeepershell操作createznodenamedata:createznodedeleteznodenodequit:exitsessiondelete:deletenodesetquota-blengthquota:设置节点长度配额setquota-nquantityquota:设置节点数量配额listquotapath:listquotadelquotapath:在zookeeper中删除quota配额管理超过quota大小后仍然可以操作create-eznode:创建临时节点临时节点不能创建子节点临时节点可以有数据临时节点会在会话结束时自动删除.junit.After;importorg.junit.Before;importorg.junit.Test;publicclassZookeeperTest{private动物园管理员;@Beforepublicvoidinit()throwsException{StringconnStr="uplooking03:2181,uplooking04:2181,uplooking05:2181";zooKeeper=newZooKeeper(connStr,3000,newWatcher(){@Overridepublicvoidprocess(WatchedEventwatchedEvent){System.out.println("watch..."+watchedEvent.getType());}});}/***创建节点*/@TestpublicvoidtestCreateZNode()throwsException{Stringpath="/test01";zooKeeper.exists(path,true);Stringret=zooKeeper.create(path,"HELLO2".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);System.out.println(ret);}@测试publicvoidtestSetZnode()throwsKeeperException,InterruptedException{zooKeeper.setData("/test02","uplooking02".getBytes(),1);}@TestpublicvoidtestGetZnode()throwsKeeperException,InterruptedException{byte[]data=zooKeeper.getData("/test02",true,null);System.out.println(newString(data,0,data.length));}@TestpublicvoidtestDeleteZnode()throwsKeeperException,InterruptedException{zooKeeper.delete("/test02",-1);}@Afterpublicvoiddestroy()throwsException{zooKeeper.close();}}实现注册监听的方法existsgetDatagetChild事件类型NodeCreatedNodeDeletedNodeDataChanged......10ZooKeeper客户端神器CuratorNetflix一套开源的Zookeeper客户端框架,封装了原生zookeeperAPI操作Apache的顶级项目基于Fluent编程风格(链编程)Curator有2.x.x和3.x.x两个系列版本,支持不同版本的Zookeeper,其中Curator2.x.x兼容Zookeeper3.4.x和3.5.x。Curator3.x.x只兼容Zookeeper3.5.x,提供动态重配置、watch删除等新特性,推荐使用curator2.x11版本。Curator中的组件名称描述了RecipesZookeeper的典型实现应用场景。这些实现基于CuratorFramework。FrameworkZookeeperAPI的高层封装大大简化了Zookeeper客户端的编程,增加了例如Zookeeper连接管理和重试机制。实用程序Zookeeper提供的各种实用程序。ClientZookeeper客户端封装,用于替代原生的Zookeeper客户端(ZooKeeper类),提供一些非常实用的客户端特性。ErrorsCurator如何处理错误、连接问题、可恢复异常等。12依赖POMorg.apache.curatorcurator-recipes2.12.0packagecom.uplooking.bigdata.动物园管理员;导入org.apache.curator.framework.CuratorFramework;导入org.apache.curator.framework.CuratorFrameworkFactory;导入org.apache.curator.retry.RetryForever;导入org.junit.Before;导入org.junit.Test;公共classCuratorTest{publicStringconnStr="uplooking03:2181,uplooking04:2181,uplooking05:2181";私有CuratorFrameworkzkClient;@Beforepublicvoidinit(){zkClient=CuratorFrameworkFactory.newClient(connStr,newRetry0Forever).600kstart();}/***创建一个空节点(其实不是空节点,而是给节点默认设置了ip地址)**@throwsException*/@TestpublicvoidcreateZnode()throwsException{zkClient。创造()。forPath("/test03");}@TestpublicvoidcreateZnode1()抛出异常{zkClient.create().forPath("/test02","h".getBytes());}@TestpublicvoiddeleteZnode()throwsException{zkClient.delete().deletingChildrenIfNeeded().forPath("/test02");}@TestpublicvoidsetZnode()throwsException{zkClient.setData().forPath("/test03");}@TestpublicvoidgetZnode()throwsException{byte[]bytes=zkClient.getData().forPath("/test03");System.out.println(newString(bytes,0,bytes.length));}}10ZooKeeper客户端神器Curator10.1Curator简介Netflix开源的一套Zookeeper客户端框架封装了原生zookeeperAPI操作Apache的顶层项目基于Fluent编程风格(链式编程)Curator有两个系列版本,2.x.x和3.x.x,并支持不同版本的Zookeeper。Curator2.x.x与Zookeeper3.4.x和3.5.x兼容。Curator3.x.x只兼容Zookeeper3.5.x,并提供动态重配置、watch删除等新特性,推荐使用curator2.x10.2版本。Curator中的组件名称描述了RecipesZookeeper典型应用场景的实现。这些实现基于CuratorFramework。FrameworkZookeeperAPI的高层封装大大简化了Zookeeper客户端的编程,增加了例如Zookeeper连接管理和重试机制。实用程序Zookeeper提供的各种实用程序。ClientZookeeper客户端封装,用于替代原生的Zookeeper客户端(ZooKeeper类),提供一些非常实用的客户端特性。ErrorsCurator如何处理错误、连接问题、可恢复异常等。10.3Curator基本API操作/*Curator基本节点操作*/packagecom.uplooking.bigdata.zookeeper;importorg.apache.curator.framework.CuratorFramework;importorg.apache.curator.framework.CuratorFrameworkFactory;importorg.apache.curator.retry.RetryForever;importorg.junit.Before;importorg.junit.Test;publicclassCuratorTest{publicStringconnStr="uplooking03:2181,uplooking04:2181,uplooking05:2181";私有CuratorFrameworkzkClient;@Beforepublicvoidinit(){zkClient=CuratorFrameworkFactory.newClient(connStr,newRetryForever(6000));zkClient.start();}/***创建一个空节点(其实不是空节点,而是给节点设置了默认ip地址)**@throwsException*/@TestpublicvoidcreateZnode()throwsException{zkClient.create().forPath("/test03");}@TestpublicvoidcreateZnode1()throwsException{zkClient.create().forPath("/test02","h".getBytes());}@TestpublicvoiddeleteZnode()throwsException{zkClient.delete().deletingChildrenIfNeeded().forPath("/test02");}@TestpublicvoidsetZnode()throwsException{zkClient.setData().forPath("/test03");}@TestpublicvoidgetZnode()throwsException{byte[]bytes=zkClient.getData().forPath("/test03");System.out.println(newString(bytes,0,bytes.length));}}10.4Curator的监听器PathChildrenCache(监听一级子节点的变化)如果被监听的节点不存在,会自动创建一个被监听的节点。如果中途删除了,那么监听器就失效了。NodeCache(当前节点的变化)节点变化(节点的添加也属于节点的变化)节点的删除TreeCache(当前节点和后代节点的变化)10.4.1NodeCachelistenerStringconnStr="uplooking03:2181,uplooking04:2181,uplooking05:2181";RetryPolicyretryPolicy=newRetryNTimes(3,3000);CuratorFrameworkzkClient=CuratorFrameworkFactory.newClient(connStr,retryPolicy);zkClient.start();Stringpath="/test01";//创建监听器NodeCachenodeCache=newNodeCache(zkClient,path);nodeCache.start();nodeCache.getListenable().addListener(newNodeCacheListener(){@OverridepublicvoidnodeChanged()throwsException{if(nodeCache.getCurrentData()==null){System.out.println("Deletednode...."+path);}else{System.out.println("Nodechanged.."+"Thepathis:"+nodeCache.getCurrentData().getPath()+"Thedatais:"+newString(nodeCache.getCurrentData().getData()));}}});Thread.sleep(Integer.MAX_VALUE);zkClient.close();10.4.2PathChildrenCachelistenerStringconnStr="uplooking03:2181,uplooking04:2181,uplooking05:2181";RetryPolicyretryPolicy=newRetryNTimes(3,3000);CuratorFrameworkzkClient=CuratorFrameworkFactory(connewStringFrameworkFactory.retryPolicy);zkClient.start();Stringpath="/test01";//创建监听PathChildrenCachepathChildrenCache=newPathChildrenCache(zkClient,path,true);pathChildrenCache.start();pathChildrenCache.getListenable().addListener(newPathChildrenCacheListener(){@OverridepublicvoidchildEvent(CuratorFrameworkclient,PathChildrenCacheEventevent)throwsException{System.out.println("一级子节点变化.."+event.getData()+event.getType());}});Thread.sleep(Integer.MAX_VALUE);zkClient.close();