• Zookeeper整理


    什么是Zookeeper?

    官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

    Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。也就是说 Zookeeper =文件系统+通知机制。

     

    文件系统

    zookeeper维护了一个类似Linux文件系统的文件系统的数据结构

    每个子目录(如:NameService)都被成为znode(目录节点)

    和文件系统一样,每个znode都可以自由的增删,唯一不同的是,znode可以存储数据。

     节点类型:

    • PERSISTENT-持久化目录节点

      客户端与zookeeper断开连接后,该节点依旧存在

    • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

      客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

    • EPHEMERAL-临时目录节点

      客户端与zookeeper断开连接后,该节点被删除

    • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

      客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

    监听通知机制

    客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

    可监听到的变化:

    1、None:连接建立事件
    2、NodeCreated:节点创建
    3、NodeDeleted:节点删除
    4、NodeDataChanged:节点数据变化
    5、NodeChildrenChanged:子节点列表变化
    6、DataWatchRemoved:节点监听被移除
    7、ChildWatchRemoved:子节点监听被移除
     

    Zookeeper的特点

    Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
    Zookeepe集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以zookeeper适合安装奇数台服务器。
    全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个Server,数据都是一致的。
    更新请求顺序执行,来自同一个client的更新请求按其发送顺序依次执行,即先进先出。
    数据更新原子性,一次数据更新要么成功,要么失败。
    实时性,在一定时间范围内,client能读到最新数据。

     Zookeeper的应用场景

    提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

    统一命名服务
    在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。

    统一配置管理
    (1)分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上。
    (2)配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。

    统一集群管理
    (1)分布式环境中,实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。
    (2)ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个2Node。监听这个DMode可获取它的实时状态变化。

    服务器动态上下线
    客户端能实时洞察到服务器上下线的变化。

    软负教均衡
    在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
     

    Zookeeper的选举机制

    zookeeper是按照Paxos算法进行选举的,这个算法也称之为半数选举机制。
    所有节点都有投票权,当一个几点票数过半,这个节点就是leader。
    zookeeper机制规定,当有新的节点加入时,没有选举出leader时之前票数作废,重新投票。
    leader产生后,其他节点投票给leader。

    1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。

    2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。
     

    举例(两种情况):

     1.第一次启动,不含历史数据

    则投票根据两点决定:

    启动顺序

    Myid(Myid是提供应用的唯一标识在 Zookeeper 集群中,每个节点需要一个唯一标识。这个唯一标识要求是自然数。且唯一标识保存位置是:$dataDir/myid。)

    我们假设按顺序启动服务器

        (1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;

        (2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING

        (3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;

        (4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LooKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLOWING;

        (5) 服务器5启动,同4一样当小弟。
    我们假设按乱序启动服务器

    (1)服务器3先启动,此时只有它一台服务器启动了,先给自己投一票,因为没超过半数,所以一直处于等待状态(LOOKING)

    (2)然后服务器2启动,先给自己投一票,然后它与最开始启动的服务器3进行通信,互相交换自己的选举结果,因为各自得票都是1票,所以开始比较myid的值,于是server3胜出,Server2将自己的一票投给Server3,但即便如此Server3的票数还是没有达到超过半数以上,所以服务器2、3还是继续保持LOOKING状态,恢复到各自得票数为1

    (3)再然后服务器5启动,根据前面的理论分析,服务器5先给自己投一票,然后它与最开始启动的服务器2,服务器3进行通信,互相交换自己的选举结果,因为各自得票都是1票,所以开始比较myid的值,于是server5胜出,Server2和Server3将自己的一票都投给Server5,此时Server5得票数超过半数,所以它成为了这次选举的Leader。
     

    2.非第一次启动

    (1)当ZooKeeper集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:

        服务器初始化启动。
        服务器运行期间无法和Leader保持连接。

    (2)而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态:

        集群中本来就己经存在一个Leader。
        对于已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可。
        集群中确实不存在Leader。
        假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、,并且此时sID为3的服务器是。一时刻,3和5服务器出现故障,因此开始进行Leader选举。
     

    选举Leader规则:

    1.     EPOCH大的直接胜出
    2.     EPOCH相同,事务id大的胜出
    3.     事务id相同,服务器id大的胜出

        SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
        ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的zxID值不一定完全一致,这和ZooKeeper服务器对于客户端"更新请求"的处理逻辑速度有关。
        Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加



    Zookeeper控制权限

    zookeeper有ACL( Access Control List )权限控制,可以控制节点的读写操作,保证数据的安全性。

    ACL权限设置有 权限模式、授权对象、权限信息 组成

    权限模式: 就是zookeeper服务器进行权限验证的方式,所以权限模式大体分为两种类型:

    • 范围验证: 范围就是zookeeper可以针对一个ip或者一段ip地址授予权限。
    • 口令验证: 可以理解为用户名密码的方式。

    授权对象: 授权对象就是把权限授予给谁,如果是范围验证方式,那么授权对象就是ip地址,如果是口令验证,授权对象就是用户名。

    授权信息: 授权信息就是指我们具体的权力是什么

    zookeeper中定义好的权限有5种:

    • 数据节点(c:create)创建权限,授予权限的对象可以在数据节点下创建子节点。
    • 数据节点(w:wirte)更新权限,授予权限的对象可以更新该数据节点。
    • 数据节点(r:read)读取权限,授予权限的对象可以读取该节点的内容以及子节点的列表信息。
    • 数据节点(d:delete)删除权限,授予权限的对象可以删除该数据节点的子节点。
    • 数据节点(a:admin)管理者权限,授予权限的对象可以对该数据节点体进行ACL权限设置。
       

    Zookeeper的持久化

    zookeeper和redis类似,数据都是在内存中的,持久化有两种方式:

    • 记录事务日志
    • 快照方式

    记录事务日志磁盘会进行IO操作,事务日志的不断增多会触发磁盘为文件开辟新的磁盘块,所以为了提升磁盘的效率,可以在创建文件的时候就向操作系统申请一块大一点的磁盘块,通过参数zookeeper.preAllocSize配置。

    事务日志的存放地址通过zoo.cfg配置文件中的dataDir来指定。

    本文参考:zookeeper集群_林家小哥196的博客-CSDN博客_zookeeper集群

                      Zookeeper入门看这篇就够了_java_66666的博客-CSDN博客_zookeeper                   通俗易懂的zookeeper选举机制_高世之智的博客-CSDN博客      

                       https://blog.csdn.net/liupantao/article/details/111029052

                       https://blog.csdn.net/weixin_44096133/article/details/123695087

  • 相关阅读:
    <学习笔记>从零开始自学Python-之-基础语法篇(十)库、包和模块
    水稻叶病害数据集(目标检测,yolo使用)
    6个使用的Python脚本
    如何使用 JS 判断用户是否处于活跃状态
    “鸿蒙之父”王成录离职华为,下一站是这里
    智能机器人无法智能对话_关于智能语音机器人使用中可能出现的问题
    LeetCode 101. 对称二叉树
    【Note】CNN与现代卷积神经网络part1(附PyTorch代码)
    c++_learning-c++标准库STL和boost库
    Linux指导的常用命令
  • 原文地址:https://blog.csdn.net/weixin_45799228/article/details/126901582