美文网首页
zookeeper浅析

zookeeper浅析

作者: sizuoyi00 | 来源:发表于2022-05-03 14:31 被阅读0次

    什么是zookeeper

    zookeeper,它是一个分布式协调框架,是Apache Hadoop 的一个子项 目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同 步服务、集群管理、分布式应用配置项的管理等。
    理解:Zookeeper 是一个用于存储少量数据的基于内存 的数据库,主要有如下两个核心的概念:文件系统数据结构+监听通知机制。

    文件系统数据结构

    Zookeeper维护一个类似文件系统的数据结构


    每个子目录项都被称作为 znode(目录节点),和文件系统类似,我们能够自由的增加、删除 znode,在一个znode下增加、删除子znode。
    有四种类型的znode:
    1、PERSISTENT­持久化目录节点 客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除该节点,他将永远存在
    2、 PERSISTENT_SEQUENTIAL­持久化顺序编号目录节点 客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
    3、EPHEMERAL­临时目录节点 客户端与zookeeper断开连接后,该节点被删除
    4、EPHEMERAL_SEQUENTIAL­临时顺序编号目录节点 客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

    应用场景

    1. 分布式配置中心
    2. 分布式注册中心
    3. 分布式锁
    4. 分布式队列
    5. 集群选举
    6. 分布式屏障
    7. 发布/订阅

    事务日志

    针对每一次客户端的事务操作,Zookeeper都会将他们记录到事务日志中,当然,Zookeeper也会将数据变更应用到内存数据库中。我们可以在zookeeper的主配置文件zoo.cfg 中配置内存中的数据持久化目录,也就是事务日志的存储路径 dataLogDir. 如果没有配置dataLogDir(非必 填), 事务日志将存储到dataDir (必填项)目录。

    事务日志记录信息包含:操作时间,客户端会话ID,CXID,ZXID,操作类型,节点路径,节点数据(用 #+ascii 码表示),节点版本等信息。

    Zookeeper进行事务日志文件操作的时候会频繁进行磁盘IO操作,事务日志的不断追加写操作会 触发底层磁盘IO为文件开辟新的磁盘块,即磁盘Seek。因此,为了提升磁盘IO的效率, Zookeeper在创建事务日志文件的时候就进行文件空间的预分配- 即在创建文件的时候,就向操 作系统申请一块大一点的磁盘块。这个预分配的磁盘大小可以通过系统参数 zookeeper.preAllocSize 进行配置。
    事务日志文件名为: log.<当时最大事务ID>,应为日志文件时顺序写入的,所以这个最大事务 ID也将是整个事务日志文件中,最小的事务ID,日志满了即进行下一次事务日志文件的创建

    Zookeeper 集群模式

    1leader多follow
    leader领导者-主节点:写入数据,选举产生,宕机会产生新的主节点,主节点不存在时,集群不可用,需选举新的主节点才可对外使用
    follow追随者-子节点:数据读取,主节点得备选节点,拥有投票权
    observer观察者-次级子节点:数据读取,没有投票权,不能选为主节点,计算集群不会计算在内。提升读性能

    zk触发选举
    1.服务节点初始化启动。
    2.半数以上节点无法和leader建立连接

    选举机制
    1.第一次投票:所有机器向其他机器发送消息进行投票,第一次投给自己;投票信息(SID服务器唯一标识,ZXID事务ID)
    2.变更投票:每台机器发出投票后,也会收到其他机器投票,进行变更投票处理;
    首先会比较ZXID,发现其他服务器的ZXID比自己的ZXID大,就认可收到的投票,则变更投票为该投票;
    如果发现其他服务器的ZXID比自己服务器的ZXID小,不变更投票;
    如果发现其他服务器的ZXID和自己服务器的ZXID相同,则比较SID,选择SID大的投票;
    3.确定leader:第二轮投票后,集群中每台机器收到其他机器的投票,如果一台机器收到了超过半数的相同投票,那么这个投票对应的SID机器即为Leader。

    结论:ZXID事务id,每次子节点变化都会更新事务id,即ZXID越大,数据越新,所以优先选择;ZXID一致选择SID大的机器,即优先选择后启动的机器。

    分布式锁

    https://blog.csdn.net/crazymakercircle/article/details/85956246
    持久节点:默认创建的就是持久节点;场景:记录路径
    临时节点:会话断开后自动删除,不可拥有子节点;场景:心跳检测
    序号节点:有序,不可拥有字节点;场景:秒杀,序号最小最先抢到

    1.基于key创建临时序号节点
    /lock/key.R0000000001 /lock/key.R0000000002 /lock/key.R000000000n
    2.获取/lock下所有子节点,判断其最小的节点是否为自己,如果是则加锁成功
    写锁节点 /lock/key.R0000000001 Write
    3.最小节点不是自己,则阻塞等待;添加/lock/子节点变更监听(监听lock是否被删除);
    4.当节点变更监听触发,执行第2步

    释放锁
    删除lock节点

    羊群效应
    羊群效应:所有等待节点都在监听lock节点,一旦lock节点变更所有等待节点都会被触发,然后同时反查lock子节点,这样zk压力过大
    解决:监听链表;等待节点只监听上一个节点,这样前一个节点释放锁的时候才会被触发,形成监听链表。

    注册中心

    Zookeeper的基本特性来实现一个注册中心。什么是注册中心,顾名思义,就是让众多的服务,都在Zookeeper中进行注册。啥是注册,注册就是把自己的一些服务信息,比如IP,端口,还有一些更加具体的服务信息,都写到 Zookeeper节点上, 这样有需要的服务就可以直接从zookeeper上面去拿,怎么拿呢? 这时我们可以定义统一的名称,比如,User-Service, 那所有的用户服务在启动的时候,都在User-Service 这个节点下面创建一个子节 点(临时节点),这个子节点保持唯一就好,代表了每个服务实例的唯一标识,有依赖用户服务 的比如Order-Service 就可以通过User-Service 这个父节点,就能获取所有的User-Service 子 节点,并且获取所有的子节点信息(IP,端口等信息),拿到子节点的数据后Order-Service可 以对其进行缓存,然后实现一个客户端的负载均衡,同时还可以对这个User-Service 目录进行 监听, 这样有新的节点加入,或者退出,Order-Service都能收到通知,这样Order-Service重 新获取所有子节点,且进行数据更新。这个用户服务的子节点的类型为临时节点。 Zookeeper中临时节点生命周期是和SESSION绑定的,如果SESSION超时了,对应的节点会被删除,被删除时,Zookeeper会通知对该节点父节点进行监听的客户端, 这样对应的客户端又可以刷新本地缓存了。当有新服务加入时,同样也会通知对应的客户端,刷新本地缓存,要达到这个目标需要客户端重复的注册对父节点的监听。这样就实现了服务的自动注册和自动退出。

    什么是 Curator

    Curator 是一套由netflix 公司开源的,Java 语言编程的 ZooKeeper 客户端框架,Curator项目 是现在ZooKeeper 客户端中使用最多,对ZooKeeper 版本支持最好的第三方客户端,并推荐使 用,Curator 把我们平时常用的很多 ZooKeeper 服务开发功能做了封装,例如 Leader 选举、 分布式计数器、分布式锁。这就减少了技术人员在使用 ZooKeeper 时的大部分底层细节开发工 作。在会话重新连接、Watch 反复注册、多种异常处理等使用场景中,用原生的 ZooKeeper 处理比较复杂。而在使用 Curator 时,由于其对这些功能都做了高度的封装,使用起来更加简 单,不但减少了开发时间,而且增强了程序的可靠性。

    相关文章

      网友评论

          本文标题:zookeeper浅析

          本文链接:https://www.haomeiwen.com/subject/rvobyrtx.html