




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大数据技术培训Zookeeper第1章Zookeeper概述概述Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。ZookeeperZookeeperMaster/Slave管理模式Zookeeper=文件系统+通知机制特点1)Zookeeper:一个领导者(leader),多个跟随者(follower)组成的集群。2)Leader负责进行投票的发起和决议,更新系统状态Follower过程中参与投票Zookeeperserverclientserverclient能读到最新数据。数据结构ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。zookeeperznode1MBZNode应用场景
数据结构图典型应用场景–数据发布与订阅集中式配置中心(推+拉)
Zookeeper数据模型Server01/ConfigSyslogServer02Database配置管理员应用启动时主动到Server01/ConfigSyslogServer02Database配置管理员配置管理员变更Zookeeper配置节点的内容。Zookeeper推送变更到应用,触发Watcher回调函数。应用根据逻辑,主动获取新的配置信息,更改自身逻辑。适用于配置信息多设备共享,会发生动态变化典型应用场景–软负载均衡文章查询服务价格查询服务文章查询服务价格查询服务认证与授权服务Register负责域名的注册,服务启动后将域名信息通过Register注册到Zookeeper相对应的域名服务下。Dispatcher负责域名的解析。可以实现软负载均衡。Register Dispatcher ScannerRegister Dispatcher ScannerSDK(OpenAPI)服务提供者...服务消费者MonitorControllerMonitor负责收集服务信息与状态监控。Controller提供后台Console,提供配置管理功能。典型应用场景–集群管理有多少机器在工作?每台机器的运行状态收集。对集群中设备进行上下线操作。分布式任务的状态汇报…下载地址1)官网首页:/2)下载截图第2章Zookeeper安装本地模式安装部署filezillazookeeperlinux系统下[atguigu@hadoop102software]$tar-zxvfzookeeper-3.4.10.tar.gz-C/opt/module/2)配置修改将/opt/module/zookeeper-3.4.10/conf这个路径下的zoo_sample.cfg修改为zoo.cfg;进入zoo.cfg文件:vimzoo.cfg修改dataDir路径为dataDir=/opt/module/zookeeper-3.4.10/zkData在/opt/module/zookeeper-3.4.10/这个目录上创建zkData文件夹mkdirzkData3)操作zookeeper启动zookeeper[atguigu@hadoop102zookeeper-3.4.10]$bin/zkServer.shstart[atguigu@hadoop102zookeeper-3.4.10]$jps4020Jps4001QuorumPeerMain[atguigu@hadoop102zookeeper-3.4.10]$bin/zkServer.shstatusZooKeeperJMXenabledbydefaultUsingconfig:/opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfgMode:standalone[atguigu@hadoop102zookeeper-3.4.10]$bin/zkCli.sh[zk:localhost:2181(CONNECTED)0]quit停止zookeeper[atguigu@hadoop102zookeeper-3.4.10]$bin/zkServer.shstop配置参数解读解读zoo.cfg文件中参数含义tickTime:通信心跳数,ZookeeperZookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)initLimit:LF初始通信时限集群中的follower跟随者服务器(F)与leader领导者服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。投票选举新leader的初始化时间Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在initLimit时间内完成这个工作。3)syncLimit:LF同步通信时限集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit*tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在线了。dataDir保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。clientPort第3章Zookeeper内部原理选举机制半数机制(Paxos协议):集群中半数以上机器存活,集群可用。所以zookeeper适合装在奇数台机器上。Zookeeperslave。但是,zookeeper工作时,leaderfollower,LeaderZookeeperServiceServer1myid=1Server2myid=2LeaderServer3 Server4myid=3 myid=4Server5myid=5ZookeeperServiceServer1myid=1Server2myid=2LeaderServer3 Server4myid=3 myid=4Server5myid=5ClientClientClientClientClientClientClientClient1LOOKING状态。21id2以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING331、、3leader。44234中最了。54节点类型Znode有两种类型:短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除持久(persistent):客户端和服务器端断开连接后,创建的节点不删除Znode(persistent)(PERSISTENT)客户端与zookeeper断开连接后,该节点依旧存在(PERSISTENT_SEQUENTIAL)客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号(EPHEMERAL)客户端与zookeeper断开连接后,该节点被删除(EPHEMERAL_SEQUENTIAL)客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号znodestat结构体1)czxid-引起这个znode创建的zxid,创建节点的事务的zxidzxidID。IDzxidzxid1小zxid2,那么zxid1zxid2之前发生。2)ctime-znode(1970)3)mzxidznodezxid4)mtime-znode最后修改的毫秒数(从1970年开始)5)pZxid-znode最后更新的子节点zxidcversionznode子节点修改次数dataversionznode数据变化号znodeephemeralOwner-sessionid。如果不是临时节0。dataLength-znode的数据长度numChildrenznode子节点数量监听器原理监听器原理注册的监听器列表port5“/”路径数据发生变化注册的监听器列表port5“/”路径数据发生变化3getChildren(“/”,true)4Client:ip:port:/path2创建zkClientListener6process()connect
zookeeper线程ZookeeperconnectZookeeper。Zookeeper线程。6)listenerprocess()方法。getpath[watch]lspath[watch]写数据流程ZooKeeper的写数据流程主要分为以下几步:比如向ZooKeeper的Server1Server1Server1为每个的里面有一个是Leader。这个会将写请求广播给各个ServerServer1Server2。收到大多数三个节点的话,只要有两个节点数据写成功了,那么就认为数据写成功了。写成功之后,LeaderServer1数据写成功了。Server1会进一步通知第4章Zookeeper实战分布式安装部署集群规划hadoop102、hadoop103hadoop104Zookeeper。1)解压安装解压zookeeper安装包到/opt/module/目录下[atguigu@hadoop102software]$tar-zxvfzookeeper-3.4.10.tar.gz-C/opt/module/在/opt/module/zookeeper-3.4.10/这个目录下创建zkDatamkdir-pzkData重命名/opt/module/zookeeper-3.4.10/confzoo_sample.cfgzoo.cfgzoo_sample.cfgzoo.cfg配置zoo.cfg文件#######################cluster##########################Server.A=B:C:D。A是一个数字,表示这个是第几号服务器;B是这个服务器的ip地址;C是这个服务器与集群中的Leader服务器交换信息的端口;D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。3)集群操作在/opt/module/zookeeper-3.4.10/zkDatamyid的文件touchmyid添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码myid文件vimyid在文件中添加与server对应的编号:如2拷贝配置好的zookeeper到其他机器上scp-rzookeeper-3.4.10/root@:/opt/app/scp-rzookeeper-3.4.10/root@:/opt/app/并分别修改myid文件中内容为3、4zookeeper[root@hadoop102zookeeper-3.4.10]#bin/zkServer.shstart[root@hadoop103zookeeper-3.4.10]#bin/zkServer.shstart[root@hadoop104zookeeper-3.4.10]#bin/zkServer.shstart[root@hadoop102zookeeper-3.4.10]#bin/zkServer.shstatusJMXenabledbydefaultUsingconfig:/opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfgMode:follower[root@hadoop103zookeeper-3.4.10]#bin/zkServer.shstatusJMXenabledbydefaultUsingconfig:/opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfgMode:leader[root@hadoop104zookeeper-3.4.5]#bin/zkServer.shstatusJMXenabledbydefaultUsingconfig:/opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfgMode:follower客户端命令行操作命令基本语法功能描述help显示所有操作命令lspath[watch]使用ls命令来查看当前znode中所包含的内容ls2path[watch]查看当前节点数据并能看到更新次数等数据create普通创建-s含有序列-e临时(重启或者超时消失)getpath[watch]获得节点的值set设置节点的具体值stat查看节点状态delete删除节点rmr递归删除节点1)启动客户端[atguigu@hadoop103zookeeper-3.4.10]$bin/zkCli.sh2)显示所有操作命令[zk:localhost:2181(CONNECTED)1]help查看当前znode中所包含的内容[zk:localhost:2181(CONNECTED)0]ls/[zookeeper][zk:localhost:2181(CONNECTED)1]ls2/[zookeeper]cZxid=0x0ctime=ThuJan0108:00:00CST1970mZxid=0x0mtime=ThuJan0108:00:00CST1970pZxid=0x0cversion=-1dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=0numChildren=15)创建普通节点[zk:localhost:2181(CONNECTED)2]create/app1"helloapp1"Created/app1[zk:localhost:2181(CONNECTED)4]create/app1/server101"01"Created/app1/server101[zk:localhost:2181(CONNECTED)6]get/app1helloapp1cZxid=0x20000000actime=MonJul1716:08:35CST2017mZxid=0x20000000amtime=MonJul1716:08:35CST2017pZxid=0x20000000bcversion=1dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=10numChildren=1[zk:localhost:2181(CONNECTED)8]get/app1/server10101cZxid=0x20000000bctime=MonJul1716:11:04CST2017mZxid=0x20000000bmtime=MonJul1716:11:04CST2017pZxid=0x20000000bcversion=0dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=13numChildren=07)创建短暂节点[zk:localhost:2181(CONNECTED)9]create-e/app-emphemeral8888[zk:localhost:2181(CONNECTED)10]ls/[app1,app-emphemeral,zookeeper][zk:localhost:2181(CONNECTED)12]quit[atguigu@hadoop104zookeeper-3.4.10]$bin/zkCli.sh[zk:localhost:2181(CONNECTED)0]ls/[app1,zookeeper]app2[zk:localhost:2181(CONNECTED)11]create/app2"app2"[zk:localhost:2181(CONNECTED)13]create-s/app2/aa888Created/app2/aa0000000000[zk:localhost:2181(CONNECTED)14]create-s888Created/app2/bb0000000001[zk:localhost:2181(CONNECTED)15]create-s/app2/cc888Created/app2/cc000000000211[zk:localhost:2181(CONNECTED)16]create-s/app1/aa888Created/app1/aa0000000001[zk:localhost:2181(CONNECTED)2]set/app199910)节点的值变化监听104节点数据变化[zk:localhost:2181(CONNECTED)26]get/app1watch103/app1节点的数据[zk:localhost:2181(CONNECTED)5]set/app1 777104WATCHER::WatchedEventstate:SyncConnectedtype:NodeDataChangedpath:/app111)节点的子节点变化监听(路径变化)104节点的子节点变化[zk:localhost:2181(CONNECTED)1]ls/app1watch[aa0000000001,server101]103主机/app1[zk:localhost:2181(CONNECTED)6]create/app1/bb666Created/app1/bb104WATCHER::WatchedEventstate:SyncConnectedtype:NodeChildrenChangedpath:/app112)删除节点[zk:localhost:2181(CONNECTED)4]delete/app1/bb13)递归[zk:localhost:2181(CONNECTED)7]/app214)[zk:localhost:2181(CONNECTED)12]stat/app1cZxid=0x20000000actime=MonJul1716:08:35CST2017mZxid=0x200000018mtime=MonJul1716:54:38CST2017pZxid=0x20000001ccversion=4dataVersion=2aclVersion=0ephemeralOwner=0x0dataLength=3numChildren=2API应用eclipse环境搭建创建一个Maven工程<dependencies><dependency><groupId>junit</groupId><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><!--/artifact/org.apache.zookeeper/zookeeper--><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version></dependency></dependencies>perties文件到项目根目录perties创建ZooKeeper客户端privatestaticStringprivatestaticStringconnectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";privatestaticintprivatestaticintsessionTimeout=2000;privateZooKeeperzkClient=null;@Beforepublicvoidinit()throwsException{zkClient=newZooKeeper(connectString,sessionTimeout,newWatcher(){@Overridepublicvoidprocess(WatchedEventevent){//收到事件通知后的回调函数(用户的业务逻辑)System.out.println(event.getType()+"--"+event.getPath());//再次启动监听try{zkClient.getChildren("/",true);}catch(Exceptione){e.printStackTrace();}}});}//创建子节点@Testpublicvoidcreate()throwsException{////创建子节点@Testpublicvoidcreate()throwsException{////14String nodeCreated = zkClient.create("/eclipse", "hello Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);}获取子节点并监听////获取子节点@TestpublicvoidgetChildren()throwsException{List<String>children=zkClient.getChildren("/",true);for(Stringchild:children){System.out.println(child);}//延时阻塞Thread.Thread.sleep(Long.MAX_VALUE);}//znodepublicvoidexist()throwsException{Statstat=zkClient.exists("/eclipse",false);System.//znodepublicvoidexist()throwsException{Statstat=zkClient.exists("/eclipse",false);System.out.println(stat==null?"notexist":"exist");}案例实战监听服务器节点动态上下线案例需求分析服务器动态上下线案例分析业务功能服务器1服务器2服务器3业务功能服务器1服务器2服务器331服务端启动时去注册信息(创建都是临时节点)业务功能业务功能Zookeeper集群客户端2客户端32getChildren客户端2客户端3
客户端14服务器节点上下线事件通知
/servers节点[zk:localhost:2181(CONNECTED)10]create/servers"servers"Created/serverspackagecom.atguigu.zkcase;packagecom.atguigu.zkcase;importjava.io.IOException;importorg.apache.zookeeper.CreateMode;importorg.apache.zookeeper.WatchedEvent;importorg.apache.zookeeper.Watcher;importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.ZooDefs.Ids;publicclassDistributeServer{private static String connectString "hadoop102:2181,hadoop103:2181,hadoop104:2181";privatestaticintsessionTimeout=2000;privateZooKeeperzk=null;privateStringparentNode="/servers";//zkpublicvoidgetConnect()throwsIOException{zk=newZooKeeper(connectString,sessionTimeout,newWatcher(){@Overridepublicvoidprocess(WatchedEventevent){}});}//注册服务器publicvoidregistServer(Stringhostname)throwsException{String create = zk.create(parentNode + "/server", Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname+"isnoline"+create);}//业务功能publicvoidbusiness(Stringhostname)throwsException{System.out.println(hostname+"isworking...");Thread.sleep(Long.MAX_VALUE);}publicstaticvoidmain(String[]args)throwsException{//zk连接DistributeServerserver=newDistributeServer();server.getConnect();server.getConnect();//zk连接注册服务器信息server.registServer(args[0]);//启动业务功能server.business(args[0]);}}"hadoop102:2181,hadoop103:2181,hadoop104:2181";privatestaticintsessionTimeout=2000;privateZooKeeperzk=null;"hadoop102:2181,hadoop103:2181,hadoop104:2181";privatestaticintsessionTimeout=2000;privateZooKeeperzk=nu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 版式设计(第二版)课件-版式设计的内涵
- 互联网成本控制试题及答案
- 校招操作系统面试题目及答案
- 复杂系统设计中的算法选择试题及答案
- 常见网络管理员考试问题及试题及答案
- 2025年可持续发展战略试题及答案
- 风险管理在企业中的应用试题及答案
- Oracle数据库内部培训体系
- 校招:采购工程师面试题库及答案
- 企业战略的灵活性与适应性试题及答案
- 大班科学《神奇的中草药》课件
- VMWare VSAN软件定义的超融合解决方案
- “小风筝大创意”小学STEM项目式学习活动案例
- 生态环境执法大练兵练习(行政处罚法、新固废法、大气法)
- 现浇箱梁混凝土浇筑方案计划
- 青霉素皮试液的配制PPT学习教案
- 热菜加工流程图
- RAL 劳尔色卡电子版
- 《加油站安全管理人员安全生产目标责任书》
- 第三章:船舶主机安装工艺
- 计件工薪酬制度
评论
0/150
提交评论