Zookeeper
是Apache开发的开源组件。是Hadoop的子间件之一,但是不只是支持Hadoop,支持常见的大部分的分布式框架。
分布式存在的问题
- 需要设置管理节点
- 如果管理节点只有一个,那么就存在单点问题:即这台服务器一旦宕机,那么入口被封闭。
- 为了解决单点问题,引入管理集群,就会产生多个管理者的情况
- 需要在管理集群中选出一个leader
- 确定一套选举机制
- 管理节点之间实现信息的共享
- 需要一套机制来确定一个唯一的leader
- 分布式锁:死锁,活锁(没有把持资源,占用CPU)。
搭建单机的Zookeeper
- 运行环境中必须安装了JDK1.6及以上
- 解压Zookeeper的压缩包
- 打开conf(配置)
- cp zoo_sample.cfg zoo.cfg — zookeeper在启动的时候需要自动寻找zoo.cfg
- cd …/bin
- 启动Zookeeper的服务器:sh zkServer.sh start
- jps:查看java进程,如果是单机的,可以用这种方式查看,如果是集群版本,则不意味着集群就搭建成功
- sh zkServer.sh status Standalone
- Zookeeper进行启动的时候,会在启动的目录下生成一个zookeeper.out,存储的就是启动的信息日志。
Zookeeper的默认端口号是2181
Zookeeper的结构
- Zookeeper本身一个树状结构
- 根节点是/
- 每一个节点都要存储数据
- 没有相对路径,只有绝对路径
- 每一个节点的路径是唯一的
- 任意一个持久节点都可以挂载子节点
- 所有的临时节点都不能挂载子节点
- 所有节点存储的数据是字节形式
- Zookeeper构成的这棵树是维系在内存中
- 每一个节点是一个znode节点
Zookeeper的基本命令
- ls 路径 查看指定路径下的所有的子节点
- create 路径 数据 创建节点
- create -e 路径 数据 创建临时节点
- get 路径 查看指定节点的信息
- set 路径 数据 修改指定节点的数据
- delete 路径 删除指定节点,但是要求节点下没有子节点
- rmr 路径 删除这个节点及其子节点
节点信息
Zookeeper会对每一次发生的事务(创建、更新、删除)进行一个编号,编号是依次递增1个
cZxid 创建事务id
ctime 创建时间
mZxid 修改事务id
mtime 修改时间
pZxid 最大事务id
cversion 创建版本
dataVersion 数据版本 节点的数据每修改依次,那么数据版本就+1
Zookeeper节点的类型
持久节点 - 0:可以挂载子节点
临时节点 - 1:不能挂载子节点,关机即没
持久顺序节点 - 2:会对节点顺次编号
临时顺序节点 - 3:-e -s
Zookeeper本身是基于Netty的
Zookeeper的API操作
pom文件需要加入的依赖:
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
Zookeeper的集群配置
-
解压压缩包
-
进入conf目录
-
cp zoo_sample.cfg zoo.cfg
-
编辑zoo.cfg,改变属性dataDir=/home/software/zookeeper-3.4.8/tmp
-
server.编号=ip地址:2888:3888 — 2888是原子广播端口,3888是选举端口,只要端口不冲突就可以使用
-
需要在dataDir指定的目录下来创建一个文件:myid,文件内容就是当前服务器的编号
-
其他服务器依次做类似操作 scp -r 文件 ip地址:存放路径
scp -r zookeeper-3.4.8 10.9.130.83:/home/software
注意:如果在集群中只启动了一个节点,那么这个节点默认是失败的,至少出现一半以上的节点才能查看状态。
ZooKeeper的选举机制
- 数据恢复阶段:保证每一个节点都能找到当前节点的最大事务id
- 选举阶段:每一个节点都会提交自己的选举信息,并且推荐自己当leader。在选举的时候比较每一个节点所提交的选举信息(最大事务id—pZxid,选举id—myid,逻辑时钟 — 保证是同一轮选举),在选举的时候是先比较两个节点的最大事务id,谁大谁就胜出。如果事务id一致,那么就根据myid进行比较,谁大谁胜出。选举的时候不是一次胜出就能够当leader,而是要满足过半性原则。一旦选出leader,后续添加的节点无论事务id和myid是多少,都只能作为follower。每一个节点将会对应不同的状态:Looking(选举),Follower(追随),Leader(管理),Observer(观察)
- 集群要想对外提供服务,也需要满足过半性:即至少有一半以上有选举权的服务器还存活。
- 集群在选举过程中不对外提供服务。
Observer - 观察者
和follower一样具有对外提供事务的能力,但是不参加选举。适用于网络不稳定条件下的事务处理。
过半性的意义
- 选举要满足过半性
- 处理事务的时候需要有过半的节点同意才能处理
- 防止脑裂 — 通常都会将节点个数设置为奇数个
Zookeeper根据Paxos来进行选举的。
[外链图片转存失败(img-hO70Tt3t-1563594858658)(C:\Users\PC\AppData\Roaming\Typora\typora-user-images\1539937171529.png)]
[外链图片转存失败(img-LZw4XDCY-1563594858662)(C:\Users\PC\AppData\Roaming\Typora\typora-user-images\1539937533921.png)]
log文件的位置由dataDir来决定
节点的事务id实际上是有64位,前32和leader有关,后32位就是实际的事务id