zookeeper
zookeeper翻译成中文就是动物园管理员
非常形象,hadoop的图标是个大象,hive是个蜜蜂,pig是个猪
zookeeper就是管理这些动物的管理员,负责统筹这些框架
起到一个非常重要的作用
工作机制
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在Zookeeper上注册的那些观察 者做出相应的反应。
特点
1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
2)集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。
5)数据更新原子性,一次数据更新要么成功,要么失败。
6)实时性,在一定时间范围内,Client能读到最新数据。
数据储存方式就是一棵树,每个节点就是一个ZNode,每个ZNode内部可以存储1mb的数据,数据存储量比较少,可以看出zookeeper并不是一个存储型的框架,其中每个节点都可以通过路径达到唯一标识,这一点非常重要。
可应用于的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下
线、软负载均衡等。
选举机制
我们都知道zookeeper是可以组集群的,既然是集群,肯定要有一个领导者,也就是统筹的那台机器,那么zookeeper是如何决定哪一台集群的呢
这时候分为两种情况
在讲选举规则的时候我们需要了解zookeeper内部的各种编号
SID:服务器ID。用来唯一标识一台 ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
ZXID:事务ID。ZXID是一个事务ID,用来 标识一次服务器状态的变更。在某一时刻, 集群中的每台机器的ZXID值不一定完全一 致,这和ZooKeeper服务器对于客户端“更 新请求”的处理逻辑有关。
Epoch:每个Leader任期的代号。没有 Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,就是每选举一次epoch就会增加。这个值从0开始递增,每次选举对应一个值,也就是说: 如果在同一次选举中,那么这个值应该是一致的 逻辑时钟值越大,说明这一次选举leader的进程更新
第一次启动集群选举机制
就举例有5台集群的情况,机器1 zid1 机器2 zid2 机器3 zid3 机器4 zid4 机器5 zid5
首先启动第一台机器,机器1给自己投了一票,目前集群存活集群只有一台,未超过半数,未选出Leader,保持LOOKING状态
启动第二台机器,两台机器各位自己投一票,但机器1发现自己的zid小于机器2,于是机器1改给机器2投票,机器2两票,依然没有超过半数,所以保持LOOKING状态
启动第三台机器,两台机器都会投给zid比自己大的机器3,机器3得票3超过半数,成功当选leader机器1和机器2更改状态为FOLLOWING,机器3状态为LEADING
启动第四台机器,因为机器1和机器2已经是FOLLOWING状态不会更改选票继续投给3,所以机器4选票会继续投给3,机器4更改状态为FOLLOWING
第五台同四
所以在第一次选举的情况下,leader会给集群集群zid超过半数的第一台,也就是一旦选出leader就不会更改。
非第一次启动集群选举机制
什么时候会发生非第一选举
在集群运行期间某一台集群发生下列情况的时候就会触法非第一选举
• 服务器初始化启动。
• 服务器运行期间Leader挂了。
选举规则如下
①EPOCH大的直接胜出
②EPOCH相同,事务id大的胜出
③事务id相同,服务器id大的胜出
举例就略了整体没有难度,就按照上述标准来判断即可。
整个选举机制非常复杂,其中zxid的在某一时刻会不同,注意只是在某一时刻,会同步的哦,因为事务zxid是递增的,zxid大那么就说明当时这台机的数据最新,那么选举它同步不会丢失数据。
以上就是zookeeper的一些运行细节,止于表层总结,如果有误还请评论指出