您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > zookeeper学习笔记
2020/1/9zookeeper学习笔记2014-10-29Page2我们都知道,想要打败一个强悍的对手,那你就要寻找他的弱点,而要知道他弱点,你就得了解他,也许他的弱点只是一个很小的点,但为此你得付出更多。就像一个黑客,为了找到一个漏洞,他必须尝试着用各种方式去嗅探,直到达到目的。做技术也是一样,当你遇到一个问题时,比如程序运行时出现异常,你可能要打个断点,跟踪这个程序的运行逻辑。也许你可以直接将异常信息复制到网上搜索答案,但实际上,只不过是别人替你去做了那个工作。而我关于zookeeper的学习是从dubbo的一个bug开始的,按照下面的任务顺序去学习并解决问题:1.dubbobug,zkclient共存;2.zookeeperAPI的使用;3.使用zookeeper进行配置管理,修改配置不用重启应用。Page3目录简单介绍dubbo+zookeeper1.概念2.zookeeper在dubbo中的角色3.dubbo使用zookeeper客户端的一个bug4.dubbo同时使用两套client的解决办法(没有什么意义)5.扯一下使用maven插件修复开源应用bug的技巧Zookeeper1.概述2.典型应用场景3.数据模型4.操作实现一致性1.会话2.安装与配置3.Zookeeper客户端curatorPage4简单介绍dubbo+zookeeper概念1.Dubbo:是一个分布式服务框架,致力于提供高性能和透明化的RPC(RemoteProcedureCallProtocol)远程服务调用方案,以及SOA(Service-OrientedArchitecture)服务治理方案。2.zookeeper:是一个分布式协调服务。Page5简单介绍dubbo+zookeeperzookeeper在dubbo中的角色1.节点角色说明:Provider:暴露服务的服务提供方。Consumer:调用远程服务的服务消费方。Registry:服务注册与发现的注册中心。Monitor:统计服务的调用次调和调用时间的监控中心。Container:服务运行容器。1.调用关系说明:0.服务容器负责启动,加载,运行服务提供者。1.服务提供者在启动时,向注册中心注册自己提供的服务。2.服务消费者在启动时,向注册中心订阅自己所需的服务。3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。Page6简单介绍dubbo+zookeeperzookeeper在dubbo中的角色3.zookeeper的角色:注册中心1.注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小2.监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销3.服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销4.注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外5.注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者6.注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表7.注册中心和监控中心都是可选的,服务消费者可以直连服务提供者其他可扮演注册中心的技术:redisPage7简单介绍dubbo+zookeeperdubbo使用zookeeper客户端的一个bugdubbo目前支持使用的zookeeper客户端有两个:Zkclient和curator,Zkclient是其默认的客户端。bug描述:dubbo在ZookeeperRegistry这个类中显示依赖了Zkclient的异常类,导致在缺失Zkclient包的时候使用zookeeper注册中心报错。解决办法是去掉这个显示依赖,或者在使用curator的时候也引入Zkclient包。指定使用curator需要使用client属性,如下:!--使用注册中心暴露服务地址--dubbo:registryid=curatoraddress=zookeeper://127.0.0.1:2181client=curator/dubbo:registryid=zkclientaddress=zookeeper://127.0.0.1:2181client=zkclient/Page8简单介绍dubbo+zookeeperdubbo同时使用两套client的解决办法(没有什么意义)问题描述:如果在一个服务中同时指定用Zkclient和curator,则实际上只会用到一个。解决办法:增加key值判断。AbstractRegistryFactory.getRegistry方法。Page9简单介绍dubbo+zookeeper扯一下使用maven修复开源应用bug的技巧当我们修改了一个开源应用的bug,怎么把修改后的文件合到jar包里面去?一个比较靠谱的方式就是使用maven的maven-shade-plugin插件,在打包是过滤掉原有jar包中要替换的文件。可参考:的另外一个打包插件:maven-assembly-plugin,可参考:最后,关于dubbo,提供一篇很好的文章:(这篇文章对于dubbo的性能优化是很不错的参看)Page10简单介绍dubbo+zookeeper问题dubbo为什么要使用注册中心?点对点直连方式:概述Zookeeper作为注册中心的概念其实是抽象的,官方说明:ZooKeeperisahigh-performancecoordinationservicefordistributedapplications.其实它的核心是一个精简的文件系统,提供基于目录节点树方式的数据存储,以及一些额外的抽象操作,如排序,通知和监控。节点存储的数据主要包括:statusinformation,configuration,locationinformation,etc.Page12Zookeeper典型应用场景统一命名服务(NameService)配置管理(ConfigurationManagement)LeaderElection共享锁(Locks)队列管理组成员关系(GroupMembership)Page13Zookeeper数据模型前面提到Zookeeper的核心就是文件系统,所以掌握Zookeeper就必须了解它的数据模型。类似于unix的文件系统,它维护着一个属性层次结构,树中的节点被称为znode,znode可以用来存储数据,并且与之关联一个ACL(AccessControlList)。一.和标准文件系统的区别:1.一个znode既可以是文件也可以是目录;2.每个znode存储的数据有限,不超过1M(zookeeper有内置的检查)。3.Zookeeper中的文件系统路径是绝对路径,必须以“/”开头,而且路径必须是标准的,即不能包含像unix那样可以表示当前路径或者当前路径上一级目录的符合“.”或“..”Page14Zookeeper数据模型二.znode的一些性质1.znode的两种类型:短暂的和持久的。该类型在创建时确定,之后不能再修改。短暂znode不能有子节点。(短暂znode应用:需要知道特定时刻有哪些分布式资源可用的应用,如组成员管理服务。)2.顺序号:在创建znode的时候,我们可以设置顺序标识,这样创建的zonde名称后面会附加一个值(单调递增),这个值便是顺序号,由其父节点维护。(顺序znode的应用:共享锁。)3.观察(watch):当znode以某种方式发生改变时,这种机制可以让客户端得到通知。(应用:配置管理,后面将配置管理的时候,具体去讲)Page15Zookeeper实现zookeeper支持单机模式,也支持集群(复制)模式。两个注意点:1.只要集群中半数以上的机器处于可用状态,它就能提供服务;2.它确保最znode树中的每一个修改都会被复制到集群中半数以上的机器。因此能确保在可用状态下,至少有一个机器保存最新的状态,,其余副本也会更新到这个最新状态。如何实现:Zab协议阶段一:领导者选举阶段二:原子广播Page16Zookeeper会话故障切换时间:ticktime,用于设置交互时间表,其他设置基本上依赖这个参数Page17Zookeeper一致性Zab协议导致了Zookeeper的一致性问题。解决一致性:每一个对znode的树的更新状态都被赋予一个全局唯一zxid,zookeeper对其进行排序,越小,则发生越早。zookeeper的几点考虑:顺序一致性,原子性,单一系统映象,持久性,及时性注:使用sync来解决跨过Zookeeper的机制进行通信导致的数据不一致。Page18Zookeeper操作Zookeeper中有九种基本操作。操作描述create创建一个znode(必须要有父节点,创建时可以设置数据)delete删除一个znode(该znode不能有任何子节点)exists测试一个znode是否存在并且查询它的元数据getACL,setACL获取/设置一个znode的ACLgetChildren获取一个znode的子节点列表getData,setData获取/设置一个znode所保存的数据sync将客户端的znode试图与ZooKeeper同步Page19Zookeeper操作api对于Zookeeper的客户端来说,主要有两种语言绑定:Java和C,也可以使用其他的语言,如Perl,Pythod等。对于各种语言的绑定使用,可参考:api的调用有同步和异步两种方式。异步操作的结果使用回调来传送。如:同步方式:publicvoidexists(Stringpath,Watcherwatcher;异步方式:publicvoidexists(Stringpath,Watcherwatcher,StatCallbackcb,Objectctx);Page20Zookeeper操作观察触发器在读操作exists、getChildren和getData上可以设置观察,这些观察可以被写操作create、delete和setData触发。注:ACL的相关操作不参与任何观察。下表是设置观察的操作及其对应的触发器:设置观察的操作观察触发器createdeletesetDataznode子节点znode子节点existsNodeCreatedNodeDeletedNodeDataChangedgetDataNodeDeletedNodeDataChangedgetChildrenNodeChildrenChangedNodeDeletedNodeChildrenChange
本文标题:zookeeper学习笔记
链接地址:https://www.777doc.com/doc-2829968 .html