zookeeper 概述
*******************************************************
基本特性:
所有的操作都是基于内存操作,具有较高的读写性能;
保证分布式数据一致性,同一客户端的事务请求可按顺序应用到zookeper中;
所有的事务请求由leader zookeeper处理,非事务请求可由任意的zookeeper处理;
*******************************************************
zookeeper 集群
3 ~ 5个zookeeper服务器就可以组成zookeeper集群,每个zookeeper之间保持通信,超过一半的leader+follower可以正常工作,整个集群就能正常对外服务;客户端与任意一个zookeeper建立tcp连接,当连接断开后,可与任意zookeeper重新连接
集群角色:
Leader:处理客户端的事务、非事务请求,并负责主从同步
Follower:接受客户端请求,将事务请求转发给leader处理,同时参与过半写与选主
Observer:接受客户端的请求,将事务请求转发给leader,不参与过半写与选主
*******************************************************
zookeeper 数据模型
zookeeper内存中的数据以树形结构存在,可在每个节点中存储内容,并且可在节点下面挂载子节点
节点类型
持久节点:可作做目录节点与叶子结点
临时节点:只能做叶子结点,不可用做目录节点
同时,可以对持久节点、临时节点添加顺序属性
*******************************************************
会话 session
基本概念:客户端与zookeeper建立tcp连接则会话创建,在会话有效期内,只要客户端发送请求,会话就可**,或者客户端在一定时间内未发送请求,与客户端相连的zookeeper会主动发送ping请求,进行会话**
会话失效:客户端与zookeeper断开连接,且在会话有效期内没有重新连接上,则会话失效,此时会话管理器会将与此会话相关的临时节点删除
会话转移:客户端与zookeeper断开连接,但是在会话有效期内与其它的zookeeper建立连接,则发生会话转移,此时,原先与客户端建立连接的zookeeper不会处理该客户端发送的请求(zookeeper处理客户端请求时,会先检查zookeeper是否是session的拥有者)
*******************************************************
ZAB 协议 :zookeeper使用ZAB协议保证一致性
ZAB协议:所有的事务请求都由leader处理,当leader处理请求时,先在本地写入,生成事务propasal发送给follower,follower返回写入状态,当超过一半的follower写入成功后,leader确认提交,再将commit请求发送给follower,follower提交事务
基本特性:
确保已经在leader上提交的事务不丢失;
丢弃只在leader上写入的事务
实现方法:leader故障重新选主时,选取事务id最大的follower作为leader
基本模式:崩溃恢复(重新选主、数据同步)、消息广播
重新选主:leader故障后follower进行投票,多轮投票后,优先投票给事务id最大的follower,如果有多个follower事务id一样大,则投票给server id最大的follower,选出leader后,leader的epoch加1
数据同步:选主后,follower要跟leader做数据同步,leader生成提议缓存队列,若follower事务最大值小于队列最小值,做全量同步;最大值在队列最大最小之间,做差异化同步;若follower的事务id大于leader的队列最大值,则直接回滚到leader队列最大值;若follower同一leader epoch下的事务id大于leader的事务id,且follower的epoch小于leader的epoch,则先回滚再差异化同步
消息广播:当同步完成后,zookeeper就正常对外服务,接受并处理客户端的请求
*******************************************************
数据持久化:为防止数据丢失,zookeeper会使用事务日志和快照文件对内存中的数据做持久化操作
事务日志:zookeeper采取空间与分配策略,当剩余的日志空间不足4kb时,会预先分配64m的日志文件,用0填充,
事务写入过程:将事务操作序列化,生成checksum,让后将事务请求头、请求体、checcksum写入缓存流,然后刷新到磁盘空间保存
快照文件:当事务日志执行snapcount/2 ~snapcount 次操作之后,zookeeper开启异步线程将内存中的数据保存到快照文件中,同时事务日志使用新的事务日志文件写入事务操作
Zookeeper重启数据恢复:先根据快照文件恢复数据,再加载比快照事务最大id大的事务日志做增量恢复