以下概念性的语言均为本人理解,欢迎大佬指出错误,小白希望深入理解请到官网
它是什么?
Zookeeper 本质上是一个分布式文件系统, 适合存放小文件,也可以理解为一个数据库
。Zookeeper是一个分布式协调中心,它具有订阅发布,分布式集群协调,分布式队列,分布式锁等功能。(Zookeeper是不存储实际数据,只存储系统配置,集群间交流的配置文件等)
![](https://img.haomeiwen.com/i3345015/b326996f4c35de0e.png)
zookeeper类似一个文件系统,图中一个行(/servers/host1)称为一个znode.它可能携带配置信息,比如 /servers/host1 ------ 192.168.1.100
它有什么用
1.数据发布/订阅
数据发布/订阅系统,需要发布者将数据发布到Zookeeper的节点上,供订阅者进行数据订 阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。
发布/订阅一般有两种设计模式:推模式和拉模式,服务端主动将数据更新发送给所有订阅的 客户端称为推模式;客户端主动请求获取最新数据称为拉模式.
Zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点 数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知,客户端接收到此通知 后,主动到服务端获取最新的数据。
2.分布式协调/通知
Zookeeper中特有的Watcher注册于异步通知机制,能够很好地实现分布式环境下不同机 器,甚至不同系统之间的协调与通知,从而实现对数据变更的实时处理。通常的做法是不同 的客户端都对Zookeeper上的同一个数据节点进行Watcher注册,监听数据节点的变化(包括 节点本身和子节点),若数据节点发生变化,那么所有订阅的客户端都能够接收到相应的 Watcher通知,并作出相应处理。 在绝大多数分布式系统中,系统机器间的通信无外乎心跳检测、工作进度汇报和系统调 度。
3.分布锁
分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访 问一个或一组资源时的一致性,主要分为排它锁和共享锁。
排它锁又称为写锁或独占锁,若事务T1对数据对象O1加上了排它锁,那么在整个加锁期 间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能再对这个数据对象进行任 何类型的操作,直到T1释放了排它锁。
① 获取锁,在需要获取排它锁时,所有客户端通过调用接口,在/exclusive_lock节点下创建 临时子节点/exclusive_lock/lock。Zookeeper可以保证只有一个客户端能够创建成功,没有成 功的客户端需要注册/exclusive_lock节点监听。
![](https://img.haomeiwen.com/i3345015/e0fc540f964a49bc.png)
② 释放锁,当获取锁的客户端宕机或者正常完成业务逻辑都会导致临时节点的删除,此 时,所有在/exclusive_lock节点上注册监听的客户端都会收到通知,可以重新发起分布式锁获 取。
![](https://img.haomeiwen.com/i3345015/6b4e9d52c5e3846f.png)
共享锁又称为读锁,若事务T1对数据对象O1加上共享锁,那么当前事务只能对O1进行读取操 作,其他事务也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都被释放。 在需要获取共享锁时,所有客户端都会到/shared_lock下面创建一个临时顺序节点
4.分布式队列
有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交 给B团队继续计算,B完成了自己任务再交给C团队继续做。这就有点像业务系统的工作流一 样,一环一环地传下去。
分布式环境下,我们同样需要一个类似单进程队列的组件,用来实现跨进程、跨主机、跨网 络的数据共享和数据传递,这就是我们的分布式队列。
角色分配
![](https://img.haomeiwen.com/i3345015/6710d3d2e7c91013.png)
选举机制
1.首先在zookeeper集群中,每一个集群节点投票都会投给自己
2.节点间会相互通知自己的票信息
3.最后处理通过myid和ZXID
列子:
三个zookeeper节点,分别myid为1,2,3,ZXID为零,名字为A,B,C.
首先启动A,A处于LOOKING状态不投票
然后启动B,A,B都投票给自己
A,B相互发送票数,A发现B的myid比自己大,然后B改票为A。
此时A两票,且节点数过半,所以A为leader
C的自动成为follower,江山已定
搭建:
![](https://img.haomeiwen.com/i3345015/e7dfe24f13b706a0.png)
第一步:下载zookeeeper的压缩包,下载网址如下
http://archive.apache.org/dist/zookeeper/
第二步:解压
解压zookeeper的压缩包到你的目录路径下去,然后准备进行安装
第三步:修改配置文件
第一台机器修改配置文件
tar -zxvf zookeeper-3.4.9.tar.gz -C ../servers/
cd /zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg(将zookeeper下conf下的zoo-sample.cfg修改)
dataDir=/zookeeper-3.4.9/zkdatas # 保留多少个快照
autopurge.snapRetainCount=3 # 日志多少小时清理一次
autopurge.purgeInterval=1 # 集群中服务器地址
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
第四步:添加myid配置
在第一台机器的
zookeeper-3.4.9/zkdatas /这个路径下创建一个文件,文件名为myid ,文件内容 为1
mkdir -p /zookeeper-3.4.9/zkdatas/
echo 1 > /zookeeper-3.4.9/zkdatas/myid
第五步:安装包分发并修改myid的值
安装包分发到其他机器
第一台机器上面执行以下两个命令
scp -r 你的目录/zookeeper-3.4.9/ node02:你的目录
scp -r 你的目录/zookeeper-3.4.9/ node03:你的目录
第二台机器上修改myid的值为2
echo 2 > 你的目录/zookeeper-3.4.9/zkdatas/myid
第三台机器上修改myid的值为3
echo 3 > 你的目录/zookeeper-3.4.9/zkdatas/myid
第六步:三台机器启动zookeeper服务
三台机器启动zookeeper服务
这个命令三台机器都要执行
zookeeper-3.4.9/bin/zkServer.sh start
查看启动状态
zookeeper-3.4.9/bin/zkServer.sh status
网友评论