zookepper的概述
zookepper是一个开源的分布式协调服务框架,主要用来解决分布式集群中应用系统的一致性问题和数据管理问题。
zookepper的特点
zookepper本质上是一个分布式文件系统,适合存放小文件,也可以理解为一个数据库。
zookepper中存储的其实是一个又一个Znode,Znode是zookepper中的节点
Znode是有路径的,例如 /data/host1, /data/host2 这个路径也可以理解为是Znode的Name
Znode也可以携带数据,例如说某个数据Znode的路径是 /data/host1 , 其值是一个字符串“127.0.0.1”
zookepper的应用场景
数据发布/订阅
数据发布/订阅 需要发布者将数据发布到zookeeper的节点上,供订阅者进行数据订
阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态
更新。
发布/订阅一般有两种设计模式:推模式和拉模式, 服务端主动将数据更新发送
给所有订阅的客户端称为推模式,客户端主动请求获取最新数据称为拉模式。
zookepper 采用推拉相结合的模式,客户端想服务端注册自己需要关注的节点,
一旦该节点数据发生变更,那么服务端将会向相应的客户端推送watcher事件
通知,客户端接收到通知后,主动到服务端获取最新的数据。
命名服务
命名服务是分布实现系统中较为常见的一类场景,分布式系统中,被命名的实体通
常可以是集群中的机器、提供的服务地址或远程对象等,通过命名服务,客户端可
以根据指定名字来获取资源的实体,在分布式环境中,上层应用仅仅需要一个全局
唯一的名字。zookepper可以实现一套分布式全局唯一ID分配机制。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200218130129790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3podW1lbmdndWFuZw==,size_16,color_FFFFFF,t_70)
通过zookepper节点创建API接口就可以创建一个顺序节点,并且在API返回值中会返回这个节点的完整名字,利用此特性,可以生成全局ID,步骤:
1.客户端根据任务类型,在指定类型的任务下通过调用接口创建一个顺序节点,如: job-。
2.创建完成后,会返回一个完整的节点名,如:“job-00000001”
3.客户端拼接type类型和返回值后,就可以作为全局唯一ID,如:“type2-job-00000001”
分布式协调/通知
zookeeper 中特有的watcher注册于异步通知机制,能够很好地实现分布式环境下不
同机器,甚至不同系统之间的协调与通知,从而实现对数据变更的实时处理。
通常的做法是不同的客户端都对zookepper上的同一个数据节点进行watcher注册
,监听数据节点的变化(包括节点本身和子节点),若数据节点发生变化,那么
所有订阅的客户端都能够接收到相应的watcher通知,并作出相应处理。
在绝大多数分布式系统中,系统机器间的通信无外乎 **心跳检测,工作进度汇报和系统调度**
心跳检测
不同机器间需要检测到彼此是否正常运行,可以使用zookepper实现机器间的心跳检测,
基于其临时节点特性(临时节点的生存周期是客户端会话,客户端若宕机后,其临时节点自然不存在),可以让不同机器都在zookepper的指定节点下创建临时节点,不同的机器之间可以根据
这个临时节点来判断对应的客户端机器是否存活。通过zookepper可以大大减少系统耦合。
工作进度汇报
通常任务被分发到不同机器后,需要实时的将自己的任务执行进度汇报给分发系统,可以在
zookepper上选择一个节点,每个任务客户端都在这个节点下面创建临时子节点,这样不仅可以
判断机器是否存活,同时各个机器可以将自己的任务执行进度写到该临时节点中去,以便中心
系统能够实时获取任务的执行进度。
系统调度
zookepper能够实现系统调度模式:分布式系统由控制台和一些客户端系统两部分组成,控制
台的职责就是需要将一些指令信息发送给所有的客户端,以控制他们进行相应的业务逻辑,
后台管理人员在控制台上做一些操作,实际上就是修改zookepper上某些节点的数据,
zookepper可以把数据变更以时间通知的形式发送给订阅客户端。
分布式锁
分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访问
一个或一组资源时的一致性,主要分为排它锁和共享锁。
排他锁又称写锁或独占锁,
若事物T1对数据对象O1 加上了排它锁,那么在整个加锁期间,只允许事物T1对O1进行读取
和更新操作,其他任何事物都不能再对这个数据进行任何操作,知道T1释放了排它锁。
1.**获取锁**, 在需要获取排它锁时,所有客户端通过调用接口,在/exclusive_lock 节点下创建临时子节点/exclusive_lock/lock 。 zookepper可以保证只有一个客户能够创建成功,没有成功的客户端需要注册/exclusive_lock 节点监听。
2. 释放锁,当获取锁的客户端宕机或者正常完成业务逻辑都会导致临时节点的删除,此时所有在/exclusive_lock节点上注册监听的客户端都会收到通知,可以重新发起分布式锁获取。
共享锁又称为读锁:
若事物T1对数据对象O1加上共享锁,那么当前事物只能对O1进行读取操作,其他事物也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都被释放。在获取共享锁时,所有客户端都会到/share_lock下面创建一个临时顺序节点。
分布式队列
有一些时候,多个团队需要共同完成一个任务,比如,A团队将hadoop集群计算的结果交给B团
队继续计算,B完成了自己任务再交给C团队继续做。这就有点像业务系统的工作流一样,一环
一环地传递下去。
分布式环境下,我们同样需要一个类型单进程队列组件,用来实现跨进程、跨主机、跨网络的数据共享和数据传递,这就是分布式队列。