一、什么是Zookeeper
打开Apache zookeeper的官网,一句话定义zookeeper:Apache ZooKeeper致力于开发和维护可实现高度可靠的分布式协调的开源服务器。
zookeeper是个服务,服务的对象我们都称为客户端,在大数据生态里面的客户,hadoop、hbase、hive…组件都是分布式部署,这些组件们利用zookeeper的服务做了一些维持自身平衡的事情,比如集群管理、master选举、消息发布订阅、数据存储、分布式锁等等。作为整个集群的心脏的存在,zookeeper本身也是分布式,只有在分布式的基础上才能实现高度可靠。
二、客户端命令操作
命令基本语法 | 功能描述 |
---|---|
help | 显示所有操作命令 |
ls path | 使用 ls 命令来查看当前znode的子节点 |
ls path | -w 监听子节点变化 |
ls path | -s 附加次级信息 |
create | 普通创建 |
create | -s 含有序列 |
create | -e 临时(重启或者超时消失) |
get path | 获得节点的值 |
get path | -w 监听节点内容变化 |
get path | -s 附加次级信息 |
set | 设置节点的具体值 |
stat | 查看节点状态 |
delete | 删除节点 |
deleteall | 递归删除节点 |
三、ZAB协议
Zab(Zookeeper Atomic Broadcast)是为ZooKeeper协设计的崩溃恢复原⼦⼴播协议,它保证zookeeper集群数据的⼀致性和命令的全局有序性。
- 半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
- Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。
1. 选举流程
- 所有节点第一票先选举自己当leader,将投票信息广播出去
- 各个已启动节点从队列中接受投票信息
- 按照规则判断是否需要更改投票信息,将更改后的投票信息再次广播(各个节点比较ZXID,投事务版本最新的,如果ZXID一致就比较/opt/module/zookeeper-3.5.7/conf/zoo.cfg中dataDir配置路径下的myid)
- 判断是否有超过一半的投票选举同一个节点,在此之前自己的服务状态都是Looking,如果选举结束根据投票结果设置自己的服务状态(Leader 和 Follower),否则继续进入投票流程
2.写数据流程(广播)
- Client请求向Zookeeper的Server上写数据
- 如果Server不是Leader,那么Server会把接收到的请求进一步转发给Leader,通过Leader来进行选举,此时Leader会给请求附一个ZXID,然后Leader会将写请求广播给各个Server,各个Server会将该写请求加入待写队列,并向Leader发送成功信息
- 当Leader收到半数以上Server的成功信息,说明该写操作可以执行,Leader就会向各个Server发送提交信息,各个Server收到信息后会将待写队列中的数据写入
- 最后Server会通知Client数据写成功,此时就认为整个写操作成功
投票未通过的情况
- 各个server通过写请求的ZXID与本机最新的ZXID作比较,如果本机ZXID小,投票通过,如果本机ZXID大,投票未通过(好马不吃回头草)。
- 投票未通过的server,在Leader发送写请求时,发现自己未通过却还要执行写请求,此时已经知道本机数据已经和大部分机器上的数据不一致了,就会原地“自杀”,将自己重启,重启后更新数据,得到和已经执行完写请求的机器一样的数据。