李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Zookeeper简介
Leefs
2020-03-13 AM
1329℃
0条
# Zookeeper简介 ### 一、Zookeeper是什么? zookeeper是一个高性能、开源的分布式应用协调服务,它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如实现同步(分布式锁)、配置管理、集群管理。它被设计为易于编程,使用文件系统目录树作为数据模型。服务端使用Java语言编写,并且提供了Java和C语言的客户端。 > 分布式意味着由多台计算机构成的集群,每台计算机之间通过网络通信,这些计算机协调完成共同的目标,对外看来这些机器就是一个整体; > > 协调:多个节点一起完成某一个动作。 ### 二、Zookeeper数据模型 zookeeper数据模型是一种分层的树形结构: ![Zookeeper简介01.png][1] > + 1.树形结构中每个节点称为Znode(znode既可以是文件夹又可以是文件的概念); > + 2.每个Znode都可以有数据(byte[]类型),也可以有子节点; > + 3.Znode的路径使用斜线分割,例如:/app1/p_1,zookeeper中没有相对路径的说法,也即所有节点的路径都要写为绝对路径的方式; > + 4.zookeeper定义了`org.apache.zookeeper.data.Stat`数据结构来存储数据的变化、ACL(访问权限)的变化和时间戳; > + 5.当zookeeper中节点的数据发生变化时,版本号会递增; > + 6.可以对Znode中的数据进行读写操作; > + 7.znode只适合存储非常小量的数据,不能超过1M,最好小于1K。 ### 三、Zookeeper典型的应用场景 **数据发布/订阅** 数据发布/订阅即所谓的配置中心:发布者将数据发布到zk的一个或一系列节点上,订阅者进行数据订阅,可以及时得到数据的变化通知,如下图所示: ![Zookeeper简介02.png][2] 应用A将数据发布到zkServer的某个节点(Znode)上,应用B和C会现在zkServer上注册监听该节点的watcher(相当于Listener,基于RPC实现),一旦该节点有数据变化,B和C上的watcher变化得到通知,继而从zkServer上获取最新的数据 **负载均衡** zookeeper实现负载均衡本质上是利用zookeeper的配置管理功能,zookeeper实现负载均衡的步骤为: 1.服务提供者把自己的域名及IP端口映射注册到zookeeper中; 2.服务消费者通过域名从zookeeper中获取到对应的IP及端口,这里的IP及端口可能有多个,只是获取其中一个; 3.当服务提供者宕机时,对应的域名与IP的对应就会减少一个映射; 4.阿里的dubbo服务框架就是基于zookeeper来实现服务路由和负载; **命名服务** 在分布式系统当中,命名服务(name service)也是很重要的应用场景,通过zookeeper也可以实现类似于J2EE中JNDI的效果;分布式环境下,命名服务更多的是资源定位,并不是真正的实体资源,其本质也是到zookeeper的集中配置的管理 **分布式协调/通知** 例如通过zookeeper的watcher和通知机制实现分布式锁和分布式事务 **集群管理** 获取当前集群中机器的数量,集群中机器的运行状态、集群中节点的上下线操作、集群节点的统一配置等 此外还可以通过zookeeper实现集群master节点的选举、分布式锁(排它锁、共享锁)、分布式队列等。 ### 四、Zookeeper集群角色 Zookeeper中分为Leader,Follower,Observer三种角色。 ![Zookeeper简介03.png][3] Zookeeper集群中所有的机器通过一个Leader选举过程来选定一台Leader机器,**Leader既可以为客户端提供写服务又能提供读服务。Follower和Observer都只提供读服务。**Follower和Observer唯一的区别是Observer不参与Leader的选举过程,也不参与写操作的“过半写成功”策略,因此Observer机器可以在不影响写性能的情况下提升集群的读性能。 当Leader服务器出现网络中断、崩溃退出或者重启等异常情况时,ZAB协议就会进入恢复模式并选举产生新的Leader服务器。 选举Leader的过程如下: (1)Leader election-选举阶段,节点在一开始都处于选举节点,只要有一个节点得到超半数节点的票数,它就可以当选准leader。 (2)Discovery-发现阶段,follower和准Leader进行通信,同步follower最近接受的事务提议。 (3)Synchronization-同步阶段,利用Leader在前一阶段获取到的最新提议历史,同步集群中所有副本,同步完成后,准Leader才成为真正的Leader。 (4)Broadcast-广播阶段,Zookeeper集群正式对外提供事务服务,并且Leader可以进行消息广播,同时如果有新节点加入,还需要对新节点进行同步。 ### 五、Zookeeper的概念 #### **Session会话** Session是指Zookeeper服务器与客户端会话。在Zookeeper中,一个客户端连接是指客户端和服务器之间的一个TCP长连接。客户端启动的时候,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期就开始了。通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够像Zookeeper服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的Watch事件通知。 Session的sessionTimeout可以设置客户端会话的超时事件。由于服务压力大,网络故障或者客户端主动断开连接等各种原因导致客户端连接断开时,只要在sessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。 在为客户端创建会话之前,服务端首先会为每个客户端都分配一个sissionID,由于sessionID是Zookeeper会话的一个重要标识,许多与会话相关的运行机制都是基于sessionID的,因此,无论是哪台服务器为客户端分配的sessionID,都需要保证全局唯一。 #### ZNode 在Zookeeper中,节点分为两类,第一类是指构成集群的机器,称为机器节点,第二类是指数据模型中的数据单元,称为数据节点-ZNode。 Zookeeper将所有数据存储在内存中,数据模型是一棵树,由/进行分割的路径,就是一个Znode,每个节点上都会保存自己的数据内容,同时还会保存一系列属性信息。 Zookeeper中node 分为两类,分为持久节点和临时节点。同时Zookeepe还允许为每个节点添加一个属性:SEQUENTIAL。一旦节点被标记上这个属性,那么这个节点被创建的时候,Zookeeper会自动在其节点名后追加上一个整型数字,这个整型数字是由一个父节点维护的自增数字。 #### 版本 Zookeeper的每个ZNode上都会存储数据,对应于每个ZNode,Zookeeper都会为其维护一个State数据结构,Stat中记录了这个ZNode的三个数据版本,分别是Version-当前ZNode的版本,cversion-当前ZNode子节点的版本和aversion-当前ZNode的ACL版本。 #### watcher Watcher-事件监听器,是Zookeeper中一个很重要的特性。Zookeeper允许用于在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,Zookeeper服务端会将事件通知到感兴趣的客户端上去,该机制是Zookeeper实现分布式协调服务的重要特性。 #### ACL Zookeeper采用ACL策略来进行权限控制,分为: (1)CREATE:创建子节点的权限。 (2)READ:获取节点数据和子节点列表的权限。 (3)WRITE:更新节点数据的权限。 (4)DELETE:删除子节点的权限。 (5)ADMIN:设置节点的ACL权限。 其中CREATE和DELETE这两种权限都是针对子节点的控制权限。 ### 补充:CAP理论 C(Consistency)**一致性**:在分布式系统中的所有数据备份,在同一时刻是否是同样的值。(等同于所有节点访问同一份最新的数据副本) A(Availability )**可用性**:在集群中一部分节点故障后,在一定时间内,集群整体是否 还能响应客户端的读写请求。(对数据更新具备高可用性) P(Partition tolerance )分区容错性:系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。 **定理: 任何分布式 存储 系统只可同时满足二点,没法三者兼顾。** MySQL:满足 CA ZooKeeper:满足 CP *附:* *参考文章链接1:https://blog.csdn.net/zkp_java/article/details/82635101* *参考文章链接2:https://www.jianshu.com/p/57913c3a7f0a* [1]: https://lilinchao.com/usr/uploads/2020/03/1155784524.png [2]: https://lilinchao.com/usr/uploads/2020/03/2118285765.png [3]: https://lilinchao.com/usr/uploads/2020/03/2878742564.png
标签:
Zookeeper
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/723.html
上一篇
RPC简介
下一篇
Consul简介
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
43
标签云
Golang基础
Shiro
Elasticsearch
并发线程
链表
二叉树
JavaScript
设计模式
Flume
Kibana
GET和POST
Java编程思想
Jquery
序列化和反序列化
Flink
Thymeleaf
Sentinel
VUE
稀疏数组
查找
SQL练习题
Yarn
DataX
JavaWEB项目搭建
Beego
Livy
Hadoop
Spark Core
随笔
Spark SQL
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞