来源|说出你的愿望来源|juejin.im/post/5d0bd358e51d45105e0212db高并发分布式开发技术体系已经非常庞大。从国内互联网公司的使用情况可以发现,RPC、Dubbo、ZK是最基本的技能需求。你还停留在Dubbo注册中心对Zookeeper的印象中吗?它是如何工作的?经典的应用场景呢?对于前三个问题,如果你没有自己的想法或者回答的时候听不懂,那么我想我可以帮助你入门,加深这方面的知识,让你在面试中回答得更好。话不多说,进入正题1.并发环境面临的挑战应用程序运行在多个服务器集群上,解决单台服务器无法处理高并发的情况。而试图处理这些情况,我们将面临许多这样的问题。比如我们现在是一个3台服务器的集群,如何保证所有机器共享的配置信息保持一致?如果一台机器死了,其他机器如何感知这种变化并接管任务?用户数量突然暴增,需要增加机器来缓解压力。如何在不重启集群的情况下完成机器的添加?在分布式系统中,如何高效协调多个服务写入同一个网络文件(网络不是即时的,不可靠的,还有延迟)?这时候,我们就需要一个类似线程协调机制的工具来协调进程。2.Zookeeper简介①Zookeeper名字的由来Apache上很多开源项目都使用动物图片作为图标,比如tomcat是猫,hive是黄蜂等,Zookeeper的工作就是协调这些动物的动作②简介ZookeeperZookeeper是一种用于分布式应用程序的高性能协调服务。它的特点是数据存储在内存中。持久化是在日志中实现的。它的内存类似于树形结构,具有高吞吐量和低延迟,可以帮助我们实现分布式的统一配置中心、服务注册、分布式锁等。组成ZooKeeper服务的服务器必须相互理解。它们在内存中维护状态图像,以及持久存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务就可用。客户端连接到单个ZooKeeper服务器。客户端维护一个TCP连接,它通过该连接发送请求、获取响应、获取监视事件并发送报价单。如果与服务器的TCP连接丢失,客户端将连接到不同的服务器。③Zookeeper安装(linux下)1.JDK版本需要1.6以上2.下载:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.2/zookeeper-3.5.2.tar.gz3。在解压的conf目录下添加配置文件zoo.cfg4.启动服务器bin/zkServer.shstart5.测试,客户端连接:bin/zkCli.sh-server127.0.0.1:2181zoo中有3个关键配置。cfg:tickTime=2000:一次心跳的基本时间,dataDir:数据和日志存储clientPort:端口号④Zookeeper的特点1、数据结构简单,类似于Unix文件系统的树结构。每一个目录都成为一个Znode节点,但是对于文件系统来说,可以看做是一个文件夹或者一个文件来存放数据,但是我们还是要叫它节点,别叫文件夹那么贱。需要注意的是,同一个节点下的子节点名称不能相同,命名是规范的。它的路径没有相对路径的概念,是绝对路径,以“/”开头,以“/”开头,结尾是对存储数据的大小有限制。2.数据模型特点Hierarchicalnamespace:上面说了,类似于Unix文件系统,以“/”为根,节点可以包含关联数据和子节点,绝对路径Znode:名字唯一,命名是标准化的。有4种类型:persistent,sequence,temporary,temporarysequence。数据形成后会提到节点的数据。3.命名规范节点名可以使用任何unicode字符,但有以下限制:1.空字符(\u0000)不能是路径名的一部分;2.以下字符无法使用,因为它们显示效果不佳或呈现混乱:\u0001-\u0019和\u007F-\u009F。3.不允许使用以下字符:\ud800-uf8fff、\uFFF0-uFFFF。4.“。”字符可以用作另一个名称的一部分,但“.”和“..”不能单独用来表示路径上的节点,因为ZooKeeper不使用相对路径。以下是无效的:'/a/b/./c'或'c/a/b/。./'。5.“zookeeper”是保留的节点名。4、一些命令因为我的电脑是window系统,所以找了一个window版的zookeeper来演示。下面我简单介绍一下各个目录的内容。--->zookeeper配置zoo.cfgcontrib--->一些其他组件和发布版本dist-maven--->一些maven发布的jar包文档--->文档库--->libraryrecipe--->一些应用实例src--->zookeeper源码,因为zookeeper是java写的,启动bin目录下的zkServer.cmd,然后启动zkClient.cmd。不知道怎么学的时候,一般比如输入help、-help、-h命令得到帮助。下图中,我在客户端输入了-help命令。因为命令比较简单,就不演示了。唯一要注意的就是注意路径。“/”问题,比如ls/是根目录,create/zk123,以及各个命令的支持条件,比如create必须提供一个父节点,删除一个节点,副节点不能有子节点等5.Zookeeper的一个重要特性---Orderly提供了多种方式来跟踪时间。ZooKeeper为每个更新附加一个数字。这个数字反映了所有ZooKeeper事务的顺序。严格顺序意味着可以在客户端实现复杂的同步原语czxid、version、zoo.cfg中ticks配置Zxid的解释:Zookeeper中的每一个写请求都对应一个唯一的事务id,称为Zxid,它是全局的、有序的。如果Zxid1小于Zxid2,那么Zxid1必须在Zxid2versionnumbers之前发生:版本号,对节点的写请求会导致节点的三个版本号递增(其实套路类似于乐观锁),dataVersion(znode数据变化次数),cversion(znode子节点变化次数),aclVersion(znodeACL变化次数ticks:当使用多服务器Zookeeper时,服务器使用一个“tick”来定义事件的时间,例如状态上传、会话超时等,这些事件传递最小会话超时(默认为ticktimex2)indirectpublic上,如果客户端请求超过这个时间,客户端将无法再连接到服务器。实时:Zookeeper不使用实时。您可以使用statpath或ls2查看此信息。节点创建时间mZxid:节点最后修改时间zxidmtime:节点最后修改时间pZxid:节点最后子节点修改zxidcversion:节点子节点修改次数dataVersion:修改次数节点数据修改次数aclVersion:节点ACL变化次数aphemeraOwner:临时节点所有者sessionid,非临时为0dataLength:节点数据长度numChildren:子节点个数这些数据从侧面告诉我们,zookeeper是一个协调器6.zookeeper的第二个特性---可复制的数据可以复制备份Zookeeper可以快速搭建集群。它内部带有一些工具和机制。我们只需要设置一些配置就可以保证服务可靠,不会成为单点故障。7、zookeeper的第三个特点---快速zookeeper的一些特点可以应用于大型分布式系统三、zookeeper的理论①Zookeeper的会话机制Sessionsession1.一个client连接一个session,zookeeper分配一个唯一的sessionid2.客户端在特定的时间间隔发送心跳,以保持会话有效,3.如果超过会话超时时间还没有收到客户端的心跳,则判断客户端无效(默认为2倍的tickTime)。4、session中的请求按照FIFO(先进先出原则)的顺序执行②znode的数据构成一个节点Data:存储的基本信息(状态、配置、位置等)节点元数据:一些数据stat命令下数据大小:限制1M③znode的节点类型1.持久节点:通过createpathvalue直接创建2.临时节点:create-epathvalue3.序列节点:create-spathvalue注1.当session会话失败,临时节点会被删除2.序列节点的创建,后面跟一个10位十进制数,每个父节点都有一个计数器,这个计数器也是有限制的,2147483647之后会溢出。3.会话结束后,顺序节点仍然存在。④watch监听机制客户端可以在znodes上设置watch,监听znode的变化,包括增删改查,通过stat路径和ls2路径触发watch事件有4个条件,create,delete,change,child(子节点事件)watch重要特性1.Onlyone-time:watch触发后,立即删除。如果要持续监控变化,就必须继续提供settingwatch,这也是watch的注意事项2.有序性:客户端只有在watch通知后才能查看变化结果。watch注意事项1.刚才说的只有一次2.获取事件发送watch,getwatch,这些请求可能有延迟,所以获取到每个节点上发生的每一个变化并不是绝对可靠的3.一个watch对象只会被通知一次,如果一个watch同时注册了多个接口(exists,getData),如果此时节点被删除,虽然这个事件对exists和getData都有效,但是watchonly阻塞线程唤醒机制会被调用一次——客户端可以被动接受其他客户端进程状态通知⑤zookeeper的特点1.顺序一致性(SequentialConsistency),保证客户端操作有序;2.原子性(Atomicity),更新成功或失败无部分结果。3.单一的系统镜像,无论连接到哪个服务器,客户端看到的内容都是一样的。4、可靠性,数据变化不会丢失,除非被客户端覆盖修改。5、及时性,保证系统客户端当时读取的数据是最新的。最后=======通过上面的讲解,我们应该对zookeeper有了一个初步的了解,接下来说说分布式锁、集群和一些应用场景
