zoukankan      html  css  js  c++  java
  • Zookeeper

    zookeeper是什么

    • 是一个针对大型分布式系统的可靠协调系统
    • 提供的功能包括:配置维护、名字服务、分布式同步、组服务等;
    • 目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户;

    Zookeeper特点

    • 最终一致性:为客户端展示同一视图,这是zookeeper最重要的功能
    • 可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受
    • 实时性: Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
    • 等待无关( wait-free):慢的或者失效的client不干预快速的client的请求。
    • 原子性:更新只能成功或者失败,没有中间状态。
    • 顺序性:所有Server,同一消息发布顺序一致。

    Zookeeper架构

    • 每个Server在内存中存储了一份数据;
    • Zookeeper启动时,将从实例中选举一个leader( Paxos协议);
    • Leader负责处理数据更新等操作( Zab协议);
    • 一个更新操作成功,当且仅当大多数Server在内存中成功修改数据

    Zookeeper角色

    1. 领导者(Leader):领导者负责投票的发起和决议,更新系统状态
    2. 学习者(learner):
      跟随者(follwer):用于接收客户请求并向客户端返回结果,在选主过程中参与投票
      观察者(observer):可以接收客户端连接,将写请求转发给leader节点,但不参与投票过程,只同步Leader的状态,observer的目的是为了扩展系统,提高读取速度
    3. 客户端(client):请求发起方




    Zookeeper Server数目一般为奇数

    Leader选举算法采用了Paxos协议,Paxos核心思想:当多数Server写成功,则任务数据写成功;如果有3个Server,则两个写成功即可; 如果有4或5个Server, 则三个写成功即可。

    Server数目一般为奇数( 3、 5、 7) 如果有3个Server,则最多允许1个Server挂掉; 如果有4个Server,则同样最多允许1个Server挂掉 既然如此,为啥要用4个Server?

     

     

     Zookeeper 数据模型

    • 层次化的目录结构,命名符合常规文件系统规范;
    • 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识;
    • 节点Znode可以包含数据和子节点( EPHEMERAL类型的节点不能有子节点);
    • Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据需带上版本
    • 客户端应用可以在节点上设置监视器( Watcher);
    • 节点不支持部分读写,而是一次性完整读写。
    • Znode有两种类型,短暂的( ephemeral)和持久的(persistent)
    • Znode的类型在创建时确定并且之后不能再修改;
    • 短暂znode的客户端会话结束时, zookeeper会将该短暂znode删除,短暂znode不可以有子节点;
    • 持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除;
    • Znode有四种形式的目录节点,
      PERSISTENT(持久化目录节点 ):客户端与zookeeper断开连接后,该节点依旧存在 
      EPHEMERAL(临时目录节点):客户端与zookeeper断开连接后,该节点被删除 
      PERSISTENT_SEQUENTIAL(持久化顺序编号目录节点 ):客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 
      EPHEMERAL_SEQUENTIAL(临时顺序编号目录节点 ):客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

    应用场景:

    统一命名服务

    1. 分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务

        类似于域名与ip之间对应关系,域名容易记住;

        通过名称来获取资源或服务的地址,提供者等信息  

    1. 按照层次结构组织服务/应用名称

        可将服务名称以及地址信息写到Zookeeper上,客户端通过Zookeeper获取可用服务列表类

    配置管理

    • 分布式环境下,配置文件管理和同步是一个常见问题

        一个集群中,所有节点的配置信息是一致的,比如Hadoop; 对配置文件修改后,希望能够快速同步到各个节点上

    • 配置管理可交由Zookeeper实现;

        可将配置信息写入Zookeeper的一个znode上;

    • 各个节点监听这个znode

        一旦znode中的数据被修改,Zookeeper将通知各个节点;

    集群管理

    分布式环境下,实时掌握每个节点的状态是必要的,可根据节点实时状态作出一些调整;

    可将节点信息写入Zookeeper的一个znode上,监听这个znode可获取它的实时状态变化

    典型应用:Hbase中Master状态监控与选举

    分布式通知/协调

    分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态;

    NameNode须知道各DataNode的状态

    心跳检测机制可通过Zookeeper实现;

    信息推送可由Zookeeper实现(发布/订阅模式)

    分布式锁

    • Zookeeper是强一致的:多个客户端同时在Zookeeper上创建相同znode,只有一个创建成功。
    • 实现锁的独占性:多个客户端同时在Zookeeper上创建相同znode ,创建成功的那个客户端得到锁,其他客户端等待
    • 控制锁的时序:各个客户端在某个znode下创建临时znode (类型为CreateMode.EPHEMERAL_SEQUENTIAL),这样,该znode可掌握全局访问时序



    分布式队列

    同步队列:当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。
    队列按照 FIFO 方式进行入队和出队操作,例如实现生产者和消费者模型。(可通过分布式锁实现)

    一个job由多个task组成,只有所有任务完成后,job才运行完成。
    可为job创建一个/job目录,然后在该目录下,为每个完成的task创建一个临时znode,一旦临时节点数目达到task总数,则job运行完成。




  • 相关阅读:
    (Java) LeetCode 44. Wildcard Matching —— 通配符匹配
    (Java) LeetCode 30. Substring with Concatenation of All Words —— 与所有单词相关联的字串
    (Java) LeetCode 515. Find Largest Value in Each Tree Row —— 在每个树行中找最大值
    (Java) LeetCode 433. Minimum Genetic Mutation —— 最小基因变化
    (Java) LeetCode 413. Arithmetic Slices —— 等差数列划分
    (Java) LeetCode 289. Game of Life —— 生命游戏
    (Java) LeetCode 337. House Robber III —— 打家劫舍 III
    (Java) LeetCode 213. House Robber II —— 打家劫舍 II
    (Java) LeetCode 198. House Robber —— 打家劫舍
    (Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列
  • 原文地址:https://www.cnblogs.com/yjjyves/p/9446083.html
Copyright © 2011-2022 走看看