Fork me on GitHub
Suzf  Blog

ZooKeeper 概述

License: Attribution-NonCommercial-ShareAlike 4.0 International

本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。

转载请注明:http://suzf.net/post/565

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连接,通过这个连接发送请求,接受响应,获取观察的时间以及发送心跳。

zk

图: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~~~~

来源: 互联网

 

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

Suzf Blog

(๑>ڡ<)☆ 谢谢 ~

使用微信扫描二维码完成支付