Zookeeper底层技术实现细节

本文深入探讨Zookeeper的底层技术,包括ZNode数据模型、节点类型、版本与Watcher机制,详细阐述了ACL权限控制、会话管理和数据存储策略,如事务日志、数据快照以及启动时的数据加载流程。
摘要由CSDN通过智能技术生成

系统模型

数据模型

zk引入了ZNode,类似于Unix文件系统的树结构。ZNode是ZooKeeper中数据的最小但愿,每个ZNode上都可以保存数据,同时还可以挂载子节点。

节点类型

根据是否具备持久和顺序的特性,zk节点分为四种节点类型,持久代表一经在zk服务器创建,则不会自动删除,顺序表示每次创建节点都会在节点名后面加一个递增数字后缀来标志顺序,同时顺序节点下不允许有子节点

在Zookeeper中的定义如下:

public enum CreateMode {
   
    
    /**
     * 数据节点一旦被创建,会一直存在于zk服务器,直到有删除操作来主动清除
     */
    PERSISTENT (0, false, false),
    /**
    * 具备持久节点的特性,同时zk会在顺序节点的父节点中维护一份顺序表,在顺序节点创建是,自动为节点添加一个单调递增顺序后缀,用来标志创建顺序
    */
    PERSISTENT_SEQUENTIAL (2, false, true),
    /**
     * 当创建节点的机器断开与zk的连接时,节点会被移除
     */
    EPHEMERAL (1, true, false),
    /**
     * 具备临时节点的特性,同时zk会在顺序节点的父节点中维护一份顺序表,在顺序节点创建是,自动为节点添加一个单调递增顺序后缀,用来标志创建顺序
     */
    EPHEMERAL_SEQUENTIAL (3, true, true);

    private boolean ephemeral;
    private boolean sequential;
    private int flag;

    CreateMode(int flag, boolean ephemeral, boolean sequential) {
   
        this.flag = flag;
        this.ephemeral = ephemeral;
        this.sequential = sequential;
    }
}

节点状态信息

对于zk的每个数据节点,除了数据内容外,还有一些额外的状态信息,可参照zk的Stat类:

ublic class Stat implements Record {
   
    // created zxid,表示该数据节点被创建时的事务ID
    private long czxid;
    // modified zxid,表示该节点最后一次被更新时的事务ID
    private long mzxid;
    // created time,表示节点被创建的时间
    private long ctime;
    // modified time,表示该节点最后一次被更新的时间
    private long mtime;
    // 数据节点的版本号,每次变更数据节点信息都会生成一个新的版本号,用来标志这次改动
    private int version;
    // 子节点的版本号,标志当前节点作为父节点变更子节点的次数
    private int cversion;
    // 节点的ACL版本号
    private int aversion;
    // 创建该临时节点的会话的sessionID,如果该节点是持久节点,属性值为0
    private long ephemeralOwner;
    // 数据内容的长度
    private int dataLength;
    // 子节点个数
    private int numChildren;
    // 表示该节点的子节点列表最后一次被修改的事务ID,只有子节点列表变更才会变更pzxid,子节点内容变更不会。
    private long pzxid;
}

节点版本

zk引入数据节点版本的概念,来保证分布式数据的原子操作,版本号可以表示对应版本操作的变更次数,实际内容值可能不会发生变化。可以基于版本号而非数据内容来实现乐观锁&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值