[Hadoop云计算实战]ZooKeeper 概述

三 1st, 2013

Hadoop云计算实战读书笔记:第1章,p53~p58


1. ZooKeeper概述

         hadoop的一个子项目,是对Google分布式同步系统 chubby 的开源实现。
     针对大型分布式系统的可靠协调系统。包括 配置维护,名字服务,分布式同步,组服务 等在内的功能。
     目标: 封装复杂,易出错的关键服务,将简单的易用的接口和性能高效,稳定的协同工作系统提供给用户。

2. ZK的设计目标

  • 最终一致性
  • 可靠性
  • 实时性
  • 等待无关
  • 原子性  : 更新只能是成功或失败
  • 顺序性

3. ZK数据模型

    ZK实际上是一个小型的分布式文件系统,其维护一个层次化的树结构。树节点znode,用于存储数据(小数据文件,不能超过1M)。
    ZK对数据的访问是原子性的,客户端每次读取都获取znode的全部数据,同样,ZK只提供覆盖和删除操作,不支持部分更新。
    客户端通过文件路径访问znode(路径名师unicode字符串)。

    属性:

  •     3.1   层次化目录结构 
  •     3.2   Ephemeral (短暂的)
  •     3.3    Sequence  (序列)
  •     3.4    Watch       (监控器)

4. ZK工作原理

    从编程的角度,ZK设计类似于windows下的注册表,有名称,树结构,键值对的关系,看做一个树形结构的数据库,分布不同的机器做名称管理。

    ZK分为客户端和服务端。客户端值连接到整个ZK服务的某个服务器上。客户端使用并维护一个TCP连接,通过这个连接发送请求,接受响应,获取观察的时间以及发送心跳。

230731344

                          图:Zookeeper 系统模型图

      工作模式: 启动集群后,多个zk server在工作前会选出一个Leader,在接下去的工作中,这个leader死了,剩下的服务器会知道这个leader死掉了,活着的ZK server会继续选出一个Leader,选举出Leader的目的是为了保证数据的一致性。

      Watch  : 客户端在每个znode节点上设置一个watch。如果znode节点有变更,watch就会被触发,watch所属的客户端就会接收通知。如果客户端和所连接的ZK服务器断开连接时,其他客户端也会收到一个通知,也就是说一个ZK服务端可以对应多个客户端。

5. ZK实现机制

  • 5.1 单机模式           一台zk服务器,适合测试用,不保证高可靠和靠性能
  • 5.2 复制模式           ZK只需确保znode树的每次修改都被复制到机器的大部分机器上,这样就可以在部分机器故障时快速恢复ZK服务。

  a. 选举Leader:  一个Leader,其余都是Follower

  b. 原子性广播:

      所有的写请求都先被转发到Leader上,Leader将更新操作广播到Follower。当大多数成员持久化存储这个更新后,Leader提交更新,并回复客户端写操作成功。 Leader失效,会选一个新leader。以前的leader恢复,将变成一个Follower。这个选举过程非常快,不会影响性能。集群所有的机器正在更新内存数据到znode树前,都会在本地硬盘保存一个备份。读请求可被任何一个机器响应,读过程实际上对内存的查找过程是非常方便,快速的。

6. ZK的特性

  • 6.1  Paxos算法 ,ZK的灵魂
  • 6.2  会话               
  •                  客户端连接到ZK服务器时,建立一个会话(Session). 会话有一个有效时间,在这个时间范围内没有收到任何请求,会话则过期。过期的会话无法重新打开,所创建的短暂性的节点也被删除。真实的系统环境,可以靠ping请求保持会话的有效性。

  • 6.3  版本号:乐观加锁的机制,使客户端能够检测出对节点的修改冲突。
  • 6.4 监控 :节点发送变化,watch机制可以让客户端得到通知。
  • 要实现watch机制必须实现 org.apache.zookeeper.Watcher的接口。如下:

    public void process(WatchedEvent event)
    {
        try
        {
            Stat stat = zooKeeper.exists(nodePath,false);
            if(stat != null)
            {
                zooKeeper.delete(nodePath,-1);
            }
        }
        catch(KeeperException e)
        {
            e.printStackTrace();
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
    }
    process()方法是 org.apache.zookeeper.Watcher 定义的方法,当监控条件满足时,此方法被自动调用。上面的exists方法获取节点是否存在,存在则删除它。

~~~EOF~~~~





除非注明,本站文章均为原创。本文基于 BY-NC-SA 协议进行授权,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 metaboy(包含链接).

本文链接地址: http://blog.wangyuxiong.com/archives/51895

订阅本站:http://www.wangyuxiong.com/feed

分类: 技术尝新 架构设计 读书笔记         标签: ,
目前还没有任何评论.

无觅相关文章插件,快速提升流量