zoukankan      html  css  js  c++  java
  • zookeeper 基本概念


    定义:

    ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。

    ZooKeeper 的架构通过冗余服务实现高可用性。

    Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,

    并以一系列简单易用的接口提供给用户使用。

    一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、

    分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

     

    zookeeper 数据结构:

    zookkeeper 提供的名称空间非常类似于标准文件系统,key-value 的形式存储。名称 key 由斜线 / 分割的一系列路径元素,

    zookeeper 名称空间中的每个节点都是由一个路径标识。

    (zookeeper-desktop-manager   可视化工具!)

     

    关于 ZooKeeper 的一些重要概念:

    ZooKeeper 本身就是一个分布式程序(只要半数以上节点存活,ZooKeeper 就能正常服务)。

    为了保证高可用,最好是以集群形态来部署 ZooKeeper,这样只要集群中大部分机器是可用的(能够容忍一定的机器故障),

    那么 ZooKeeper 本身仍然是可用的。

    ZooKeeper 将数据保存在内存中,这也就保证了 高吞吐量和低延迟(但是内存限制了能够存储的容量不太大,

    此限制也是保持 Znode 中存储的数据量较小的进一步原因)。

    ZooKeeper 是高性能的。在“读”多于“写”的应用程序中尤其地高性能,因为“写”会导致所有的服务器间同步状态。

    (“读”多于“写”是协调服务的典型场景。)

    ZooKeeper 有临时节点的概念。当创建临时节点的客户端会话一直保持活动,瞬时节点就一直存在。

    而当会话终结时,瞬时节点被删除。持久节点是指一旦这个 ZNode 被创建了,除非主动进行 ZNode 的移除操作,

    否则这个 ZNode 将一直保存在 Zookeeper 上。

    ZooKeeper 底层其实只提供了两个功能:①管理(存储、读取)用户程序提交的数据;②为用户程序提交数据节点监听服务。

     


    会话(Session)

    Session 指的是 ZooKeeper 服务器与客户端会话。在 ZooKeeper 中,一个客户端连接是指客户端和服务器之间的一个 TCP 长连接。

    客户端启动的时候,首先会与服务器建立一个 TCP 连接,从第一次连接建立开始,客户端会话的生命周期也开始了。

    通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向 Zookeeper 服务器发送请求并接受响应,

    同时还能够通过该连接接收来自服务器的 Watch 事件通知。如果Zookeepr在特定时间内收不到心跳,就会认为这个连接断掉, Session 就会结束。

    Session 的 sessionTimeout 值用来设置一个客户端会话的超时时间。

    当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在 sessionTimeout

    规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。

    在为客户端创建会话之前,服务端首先会为每个客户端都分配一个 sessionID。

    由于 sessionID 是 Zookeeper 会话的一个重要标识,许多与会话相关的运行机制都是基于这个 sessionID 的。

    因此,无论是哪台服务器为客户端分配的 sessionID,都务必保证全局唯一。

     


    Znode(节点)

    在谈到分布式的时候,我们通常说的“节点"是指组成集群的每一台机器。

    然而,在 ZooKeeper 中,“节点"分为两类:

    第一类:构成集群的机器,我们称之为机器节点。

    第二类:数据模型中的数据单元,我们称之为数据节点一ZNode。

    ZooKeeper 将所有数据存储在内存中,数据模型是一棵树(Znode Tree),由斜杠(/)的进行分割的路径,就是一个 Znode,Znode 可以存数据 1MB);

    例如/foo/path1。每个上都会保存自己的数据内容,同时还会保存一系列属性信息。

    在 Zookeeper 中,ZNode 可以分为持久节点和临时节点两大类:

    所谓持久节点是指一旦这个 ZNode 被创建了,除非主动进行 ZNode 的移除操作,否则这个 ZNode 将一直保存在 ZooKeeper 上。
    
    而临时节点就不一样了,它的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。

    PERSISTENT 持久化节点

    EPHEMERAL 临时节点, 客户端session超时这类节点就会被自动删除

    另外,ZooKeeper 还允许用户为每个节点添加一个特殊的属性:SEQUENTIAL ,

    一旦节点被标记上这个属性,那么在这个节点被创建的时候,ZooKeeper 会自动在其节点名后面追加上一个整型数字,

    这个整型数字是一个由父节点维护的自增数字。

    顺序节点:
    PERSISTENT_SEQUENTIAL 顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加
    1 EPHEMERAL_SEQUENTIAL 临时自动编号节点(可做分布式锁)

    TTL节点:
    在3.6.0中添加

    创建PERSISTENT或PERSISTENT_SEQUENTIAL znode时,可以选择为znode设置TTL(以毫秒为单位)。如果znode在TTL内未修改且没有子代,

    它将成为服务器将来某个时候要删除的候选者。

    注意:TTL节点必须通过“系统”属性启用,因为默认情况下它们是禁用的。有关详细信息,请参见《管理员指南》。

    如果在没有设置正确的系统属性的情况下创建TTL节点,则服务器将抛出KeeperException.UnimplementedException。


    注意:
    1、同一级节点 key 名称是唯一的

    2、创建节点时,必须要带上全路径

     


    Watcher:

    Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性。

    ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候(znode节点的变化 -删除,修改数据等),

    ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。

     

    ZooKeeper 有哪些特点呢?具体如下:

    顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。

    原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,

    要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。

    单一系统映像:无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。

    可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。

     


    权限控制 ACL:

    zookeeper 的 ACL(Access Control List,访问控制表)权限在生产环境是特别重要的,所以本章节特别介绍一下。

    ACL 权限可以针对节点设置相关读写等权限,保障数据安全性。

    permissions 可以指定不同的权限范围及角色。

    ACL 命令行:

    getAcl 命令:获取某个节点的 acl 权限信息。

    setAcl 命令:设置某个节点的 acl 权限信息。

    addauth 命令:输入认证授权信息,注册时输入明文密码,加密形式保存。


    ACL 构成:

    zookeeper 的 acl 通过 [scheme:id:permissions] 来构成权限列表。

    1、scheme:代表采用的某种权限机制,包括 world、auth、digest、ip、super 几种。

    2、id:代表允许访问的用户。

    3、permissions:权限组合字符串,由 cdrwa 组成,其中每个字母代表支持不同权限, 创建权限 create(c)、删除权限 delete(d)、读权限 read(r)、写权限 write(w)、管理权限admin(a)。

    world 实例:
    
    查看默认节点权限,再更新节点 permissions 权限部分为 crwa,结果删除节点失败。其中 world 代表开放式权限。
    $ getAcl /runoob/child
    $ setAcl /runoob/child world:anyone:crwa
    $ delete /runoob/child


    auth 实例:

    auth 用于授予权限,注意需要先创建用户。

    $ setAcl /runoob/child auth:user1:123456:cdrwa
    $ addauth digest user1:123456
    $ setAcl /runoob/child auth:user1:123456:cdrwa
    $ getAcl /runoob/child


    digest 实例:

    退出当前用户,重新连接终端,digest 可用于账号密码登录和验证。。

    $ ls /runoob
    $ create /runoob/child01 runoob
    $ getAcl /runoob/child01
    $ setAcl /runoob/child01 digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:cdra
    $ getAcl /runoob/child01
    $ addauth digest user1:123456
    $ getAcl /runoob/child01


    IP 实例:

    限制 IP 地址的访问权限,把权限设置给 IP 地址为 192.168.3.7 后,IP 为 192.168.3.38 已经没有访问权限。

    $ create /runoob/ip 0
    $ getAcl /runoob/ip
    $ setAcl /runoob/ip ip:192.168.3.7:cdrwa
    $ get /runoob/ip

     

    ZooKeeper 集群角色介绍:

    最典型集群模式:Master/Slave 模式(主备模式)。在这种模式中,通常 Master 服务器作为主服务器提供写服务,

    其他的 Slave 服务器从服务器通过异步复制的方式获取 Master 服务器最新的数据提供读服务。

    但是,在 ZooKeeper 中没有选择传统的 Master/Slave 概念,而是引入了 Leader、Follower Observer 三种角色。

    ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器。

    Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,Follower 和 Observer 都只能提供读服务。

    Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略,

    因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。


    ZAB 协议 & Paxos 算法:

    Paxos 算法可以说是 ZooKeeper 的灵魂了。但是,ZooKeeper 并没有完全采用 Paxos 算法 ,而是使用 ZAB 协议作为其保证数据一致性的核心算法。

    另外,在 ZooKeeper 的官方文档中也指出,ZAB 协议并不像 Paxos 算法那样,是一种通用的分布式一致性算法,

    它是一种特别为 ZooKeeper 设计的崩溃可恢复的原子消息广播算法。


    ZAB 协议介绍:

    ZAB(ZooKeeper Atomic Broadcast 原子广播)协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议。

    在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。


    ZAB 协议两种基本的模式:

    ZAB 协议包括两种基本的模式,分别是 崩溃恢复消息广播

    当整个服务框架在启动过程中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,

    ZAB 协议就会进入恢复模式并选举产生新的 Leader 服务器。

    当选举产生了新的 Leader 服务器,同时集群中已经有过半的机器与该 Leader 服务器完成了状态同步之后,ZAB 协议就会退出恢复模式。

    其中,所谓的状态同步是指数据同步,用来保证集群中存在过半的机器能够和 Leader 服务器的数据状态保持一致。

    当集群中已经有过半的 Follower 服务器完成了和 Leader 服务器的状态同步,那么整个服务框架就可以进人消息广播模式了。

    当一台同样遵守 ZAB 协议的服务器启动后加入到集群中时,如果此时集群中已经存在一个 Leader 服务器在负责进行消息广播。

    那么新加入的服务器就会自觉地进人数据恢复模式:找到 Leader 所在的服务器,并与其进行数据同步,然后一起参与到消息广播流程中去。

    正如上文介绍中所说的,ZooKeeper 设计成只允许唯一的一个 Leader 服务器来进行事务请求的处理。

    Leader 服务器在接收到客户端的事务请求后,会生成对应的事务提案并发起一轮广播协议。

    而如果集群中的其他机器接收到客户端的事务请求,那么这些非 Leader 服务器会首先将这个事务请求转发给 Leader 服务器。

    相关 CAP 理论:

    CAP 理论指出对于一个分布式计算系统来说,不可能同时满足以下三点:

    一致性:在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性,等同于所有节点访问同一份最新的数据副本。

    在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。

    可用性:每次请求都能获取到正确的响应,但是不保证获取的数据为最新数据。

    分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。


    一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

    在这三个基本需求中,最多只能同时满足其中的两项,P 是必须的,因此只能在 CP 和 AP 中选择,zookeeper 保证的是 CP,

    对比 spring cloud 系统中的注册中心 eruka 实现的是 AP。

     

    BASE 理论:

    BASE 是 Basically Available(基本可用)、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。

    基本可用:在分布式系统出现故障,允许损失部分可用性(服务降级、页面降级)。

    软状态:允许分布式系统出现中间状态。而且中间状态不影响系统的可用性。这里的中间状态是指不同的 data replication(数据备份节点)

    之间的数据更新可以出现延时的最终一致性。

    最终一致性:data replications 经过一段时间达到一致性。

    BASE 理论是对 CAP 中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,

    采用适当的方式来使系统达到最终一致性。

  • 相关阅读:
    很简单的字节转换函数
    PHP获取用户操作系统信息
    PHP调用COM获得服务器硬件信息
    杂碎记录
    Math类使用记录
    hbase命令使用记录
    shell脚本学习
    多个job存依赖关系如何使用
    hbase的API并且使用多个rowkey分段直接读取数据
    shell学习记录
  • 原文地址:https://www.cnblogs.com/lifan12589/p/14605454.html
Copyright © 2011-2022 走看看