zookeeper实现原理

《从paxos到zookeeper分布式一致性原理与实践》笔记

1 数据模型

  • znode节点,类似于文件目录结构
  • 64位事务id,高32位leader id,低32位事务id。 创建/删除节点,更改节点数据
  • 节点数据+节点状态


    节点状态.png
  • 版本
    节点更改次数,比如version表示当前节点创建后数据变更次数
    支持客户端请求修改数据时使用基于version的乐观锁
  • watcher,数据变更通知


    监听事件类型.png
  • NodeDataChanged事件包括数据内容变更和数据版本变更
  • 事件触发后,通知给zk客户端。zk客户端调用process接口处理事件
public interface Watcher {
    void process(WatchedEvent var1);
}
  • WatchedEvent属性包含通知状态,事件类型,节点路径
public class WatchedEvent {
    private final KeeperState keeperState;
    private final EventType eventType;
    private String path;
}
  • WatcherEvent类是WatchedEvent的一个序列化的包装类,用于客户端和服务端之间通信
  • 处理流程:客户端注册watcher -> 服务端存储watcher,事件操作->服务端触发对应事件watcher处理 -> 发送watcherevent给客户端 -> 客户端回调watcher。
  • watcher一次性,回调后需要重新注册。
    串行回调执行,避免回调函数中处理事件过长
    仅通知有变更,实际数据需要重新获取
  • 节点权限管理,创建,删除,读,写,管理

2 序列化

3 客户端

image.png
  • Zookeeper 入口对象
    ZKWatchManager watcher管理器
    HostProvider地址列表管理器
    ClientCnxn 客户端核心线程,包含两个线程
    sendThread,i/o线程,负责客户端和服务端通信
    EventThread,事件线程,处理服务端事件
  • 初始化流程


    初始化流程.png

    1 初始化zookeepr对象,创建watcher管理器ClientWatchManager
    2 设置会话默认Watcher
    3 构造服务器地址列表HostProvider
    4 构建并初始化客户端网络连接器ClientCnxn
    outgoingQueue 客户端请求队列,pendinQueue服务响应队列
    客户端io处理器ClientCnxnSocket
    5 初始化sendThread和eventThread,
    6 启动sendThread和eventThread线程
    7 sendThread根据服务器地址建立tcp连接
    8 构造ConnectRequest请求,封装成Packet对象,放入outgoingQueue队列中
    9 tcp socket从队列获取packet对象,发送
    10 接收请求响应,readConnectResult函数处理
    11 解析ConnectResponse,获取zookeeper的会话id,sessionId
    12 生成事件SyncedConnect,发送给EventThread
    13 EventThread查询事件watcher,放入waitingEvents队列中
    14 EventThread从队列中获取watcher,调用processor()接口函数

  • 请求发送和响应处理图


    image.png

4 会话

  • 状态流转


    image.png
  • 会话结构
public static class SessionImpl implements Session {
        final long sessionId;//全局唯一会话id
        final int timeout;//超时时间,服务端根据客户端超时时间协商
        long tickTime;//下次超时时间
        boolean isClosing;//会话是否被关闭
}

4.1 SessionTracker服务端会话管理器

  • SessionTracker分桶策略管理会话,根据会话下次超时时间分桶
  • 在服务端接收到客户端心跳或操作请求报文,进行会话激活,计算下次超时时间,迁移会话到匹配的桶中
  • 中超时检测线程,检查最近一个桶里的会话,可能是超时会话
  • 会话清理
    超时后先标记isClosing
    获取会话的临时节点,考虑执行中的节点删除和节点创建
    创建节点删除事务请求
    删除临时节点
    删除会话
    关闭会话对应的server socket
  • 连接断开,会话超时,会话迁移

5 服务器启动

image.png
  • 初始化FileTxnSnapLog,上层服务器和底层数据存储之间的接口,包括对事物日志文件和快照数据文件的访问。

  • 初始化ServerCnxnFactory,netty服务端,接收数据

  • 基于事务日志文件和快照数据文件恢复数据

  • 初始化会话管理器,sessionTracker

  • 初始化请求处理链PreRequestProcessor->SyncRequestProcessor->FinalRqeustProcessor ...


    image.png
  • 注册jmx服务

5.1 集群方式额外多leader选举过程

  • 基于服务器id+zxid+当前服务器epoch 生成选票
    zxid最大的当选leader, zxid相同则服务器id最大的当选leader
  • 选举完成后,确认leader角色,和following角色
    following和leader建立连接,同步数据,启动服务。

6 leader选举

6.1 启动阶段选举

  • 服务器投票给自己,构建选票(myid+zxid)
  • 接收其他服务器选票
  • 处理选票,zxid最大的当选,zxid相同的myid最大的当选
    有变更的重新向其他服务器发送选票
  • 统计投票,过半数的选为leader。
  • 更新各服务器角色,然后following和leader建立连接,同步数据

6.2 服务运行期间选举

  • leader网络断开,奔溃重启

  • 所有服务器状态变为looking,开始选举,发送选票

  • 统计选票,选出leader,更改状态,同步数据

  • 选票格式


    image.png

6.3 QuorumCnxManager

  • 网络I/O处理器
  • 消息接收队列,接收其他服务器消息
  • 消息发送队列,每个服务器一个发送队列

7 服务器角色

leader,follower,observer

8 请求处理

  • 会话创建请求


    image.png
  • setData,


    image.png
  • getData,


    image.png
  • 事务请求转发
    保证事务顺序执行,都由leader处理。事务请求转发给leader

9 数据存储

内存数据,

  • 事务日志,
    64m统一
    名称后缀为第一个事务日志id
  • 数据快照,格式和事务日志类似
  • 数据同步
    差异化同步
    全量同步
    先回滚后同步
    仅回滚
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354