zookeeper集群
Contents
zookeeper集群特性
- Zookeeper:一个leader,多个follower组成的集群
- 全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的
- 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行,由FIFO信道维护有序性
- 数据更新原子性,一次数据更新要么成功,要么失败
- 实时性,在一定时间范围内,client能读到最新数据
扩容和压缩
因为修改集群的数量需要修改每个zookeeper的zoo.cfg,所以要么全部重启,要么逐个重启,慢慢更新直到成功加入。
默认选举方式 FastLeaderElection
https://www.cnblogs.com/leesf456/p/6107600.html
核心:每个Node有编号:ServerID。数据都有ZXID:(SID,ZXID)作为2个参数进行投票
- 节点1的 SID为1,节点2的SID为2,如果大家都刚启动,则ZXID都为0,此时SID谁大谁做老大,当然还需要半数机器同意才行。
- 如果新NODE加入,老集群已经有leader了,则不需要选举,同步自己的状态为Following即可
- 如果非Leader节点挂了,不影响Leader,如果Leader挂了,重新选举
集群中读写
集群中所有的zk节点都对外提供暴露,提供读写服务
- 集群中所有的ZK服务器都保存一份完整的数据,可以单独的相应所有的读操作
- 当请求是写操作时,会把该请求转发给Master节点,然后Master节点通知所有的节点一起完成写操作,所有节点都写成功才成功,否则都写失败,再转给接入的节点,最后反馈给用户
- 写的操作类似于2PC,Master向所有的Follower发起投票,F完成修改持久化后会ACK到M,M发现已经超过半数F完成了持久化,就认定该操作是成功的,就通知所有的F,都Commit,并且返回用户操作成功
一致性原则
- 顺序一致性(Sequential Consistency):从一个客户端来的更新请求会被顺序执行。
- 原子性(Atomicity):更新要么成功要么失败,没有部分成功的情况。
- 唯一的系统镜像(Single System Image):无论客户端连接到哪个Server,看到系统镜像是一致的。
- 可靠性(Reliability):更新一旦有效,持续有效,直到被覆盖。
- 时间线(Timeliness):保证在一定的时间内各个客户端看到的系统信息是一致的。
主从分工
Leader工作流程
- 恢复数据;
- 维持与follower的心跳,接收follower请求并判断follower的请求消息类型;
- follower的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。
- PING消息是指follower的心跳信息;REQUEST消息是follower发送的提议信息,包括写请求及同步请求;
- ACK消息是follower的对提议的回复,超过半数的follower通过,则commit该提议;
- REVALIDATE消息是用来延长SESSION有效时间。
Follower工作流程
- 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
- 接收Leader消息并进行处理;
- 接收Client的请求,如果为写请求,发送给Leader进行投票;
- 返回Client结果。