zookeeper
***1.***概述:
·是一个开源的分布式协调服务框架,主要用来解决分布式集群中应用系统的一致性问题和数据管理问题。
2.zookeeper的特点
·zookeeper本质上是一个分布式文件系统,适合存放小文件,也可以存放数据库。
在上图中,zookeeper中存储的是一个又一个Znode,Znode是zookeeper中的节点
~Znode是有路径的,例如/data/host1,/data/host2,这个路径也可以理解为Znode的name。
~Znode也可以携带数据,例如说某个Znode路径是/data/host1,其值是一个字符串。
·正因为Znode的特性,所以zookeeper可以对外提供一个类似于文件系统的试图,可以通过操作文件系统的方式来操作zookeeper
~使用路径获取Znode
~获取Znode携带的数据
~修改Znode携带的数据
~删除Znode
~添加Znode
3.zookeeper的架构
zookeeper集群是一个基于主从架构的高可用集群
每个服务器承担着如下三种角色中的一种:
·****Leader一个zookeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护各种Follwer及Observer间的心跳。所有的写操作必须通过Leader完成再由Leader将写操作广播给其他服务器。
·****Follower一个Zookeeper集群可能同时存在多个Follower,它会响应Leader的心跳。
Follower可以直接处理并返回客户端的读请求,同时会将写请求转发给Leader处理,并且负责Leader在写请求时对请求进行投票。
·Observer角色与Follower类似,但是无投票权。
4.zookeeper的应用场景
4.1数据发布/订阅
数据发布/订阅系统,需要发布者将数据发布到zookeeper的节点上,供订阅者进行订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。
**发布/订阅一般有俩种设计模式:**推模式和拉模式,服务端主动将数据更新发送给所订阅的客户端称为推模式;客户端主动请求获取最新数据称为拉模式。
zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知,客户端接收到此通知后,主动到服务端获取最新数据。
4.2命名服务
命名服务是发布实现系统中较为常见的一种场景,分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或者远程对象等,通过命名服务,客户端可以根据指定名字来获取资源的实体,在分布式环境中,上层应用仅仅需要一个全局唯一的名字。zookeeper可以实现一套分布式全局唯一ID的分配机制。
通过调用zookeeper节点创建API接口就可以创建一个顺序节点,并且在API返回值中会返回这个节点的完整名字,利用此特性就可以返回全局ID,步骤如下:
1.客户端根据任务类型,在指定类型的任务下通过调用接口创建一个顺序节点,如“job-”。
2.创建完成后,会返回一个完整的节点,如,“job-00000001”。
3.客户端拼接type类型和返回值后,就会作为全局唯一ID了,如“type1-job-000000001”。
4.3 分布式协调/通知
zookeeper中特有的Whatcher注册于异步通知机制,能够很好的实现分布式环境下不同机器,甚至不同系统之间的协调和通知,从而实现数据变更的实时处理,通常的做法是不同的客户端都对zookeeper上的同一数据节点进行watcher注册,监听数据节点的变化(包括节点本身和子节点),若数据节点发生变化,那么所有订阅的客户端都能够接受到相应的watcher通知,并作出响应的处理。
在绝大部分数据系统中,系统机器间的通信无外乎 心跳检测、工作进度汇报和系统调度。
1).心跳检测,不同机器需要检查到彼此是否正常运行,可以使用zookeeper实现机器间的心跳检测,基于其临时节点的特性(临时节点的生存周期是客户端会话,客户端若宕机后,其临时节点自然不再存在),可以让不同机器在zookeeper的一个指定节点下创建临时子节点,不同机器之间根据临时子节点来判断客户端机器是否存在。通过zookeeper可以大大减少系统耦合。
2).工作进度汇报,通常任务被分发到不同机制后,需要实时将自己的任务执行进度汇报给分发的系统,可以在zookeeper上选择一个节点,每个任务客户端都在这个节点下创建临时子节点,这样不仅可以判断机器是否存活,同时各个机器可以将自己的任务执行进度写到该临时节点中去,以便中心系统能够获取任务的执行进度。
3).系统调度,zookeeper能够实现如下系统调度模式:分布式系统由控制台和一些客户端系统两部分构成,控制台的职责就是需要将一些指令信心发送给所有的客户端,以控制相应的业务逻辑,后台管理人员在控制台上进行一些操作,实际上就是修改zookeeper上某些节点的数据,zookeeper可以把数据变更时间通知的形式发送给客户订阅端。
4.4 分布式锁
分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访问一个或一组资源时的一致性,主要是排它锁和共享锁。
排它锁又称为写锁或者独占锁,若事物T1对数据对象O1加上了排它锁,那么整个加锁期间,只允许事物T1对O1进行读取和更新操作,其他任何事物都不能再对这个数据对象进行任何类型的操作,直到T1释放了排它锁。
共享锁又称为读锁,若事务T1对数据对象O1加上共享锁,那么当前事务只能对O1进行读写操作,其他对象也只能对这个数据对象加共享锁,直到该数据对象上所有共享锁都被释放。
5.5 分布式队列
有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交给B团队继续计算,B完成了自己的任务再交给C团队去做,这就有点像业务系统的工作流一样,一环一环的传下去。
分布式环境下,我们同样需要一个类似单进程队列的组件,用来实现跨进度、跨主机、跨网络的数据共享和数据传递,这就是我们的分布式队列。
文章来源: blog.csdn.net,作者:一只IT猿.,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/m0_46934891/article/details/115047388