zoukankan      html  css  js  c++  java
  • Zookeeper简介

    ZooKeeper:是对分布式应用来说的一种分布协同服务

    ZooKeeper是一个对分布式应用来说的分布式的,开源的协同服务。ZooKeeper暴漏一些简单的函数,分布式应用可以基于这些简单的函数来构建更高级的服务,例如:同步,配置维护,组,命名等等。ZooKeeper运行在Java环境中。

    协同服务很难实现,很容易产生错误,例如:race condition和deadlock。ZooKeeper的动力是为了减少分布式应用实现协同服务的责任。

    设计目标

    • ZooKeeper是简单。Zookeeper通过一个共享的层级命名空间使分布式应用协同工作,这个共享的层级命名空间类似于一个标准的文件系统。命名空间由znodes组成,znodes类似于文件和目录。但是不像标准的文件系统,标准的文件系统主要用于存储,而ZooKeeper数据保存在内存中,所以ZooKeeper具有高吞吐量和低延迟。

      ZooKeeper在3个方面做了优化:高性能,高可用性,严格的顺序访问。ZooKeeper的高性能是可以使用在大的分布式系统上,ZooKeeper的高可用性是可以单节点故障,ZooKeeper的严格顺序是复杂的同步函数可以在客户端实现。
    • Zookeeper是可复制的。像它协同的分布式应用一样,ZooKeeper在一些hosts上是可复制的,叫做ensemble。

      组成ZooKeeper服务的servers必须相互知道,他们维护一个内存的状态镜像和一个持久化的transaction logs和snapshots。只要大部分servers可用,ZooKeeper就可以使用。

      客户端连接到一个ZooKeeper server。客户端维护一个TCP连接,通过这个TCP连接sends request, get responses, gets watch events, send heart beats。如果连接server的TCP连接断开,客户端将会连接到不同的server。
    • ZooKeeper是有序的。ZooKeeper用数字来记录每一次的改变,来映射ZooKeeper transactions的顺序。接下来的操作将会使用这个顺序来实现更高级的接口。例如,同步函数。
    • ZooKeeper是非常快的。ZooKeeper尤其对读来说是相当快的。ZooKeeper应用可以运行在成千上万台机器上。当读比写更频繁时,性能会更好。读写比例大概是10:1

    数据模型和层级命名空间

     ZooKeeper的命名空间类似于一个标准的文件系统。在ZooKeeper命名空间中的每个node由路径来标识。

    Nodes和ephemeral nodes

    不像标准的文件系统,在ZooKeeper命名空间中的每个node会有data和children关联它。(ZooKeeper主要用来存储协同数据:状态信息,配置信息,位置信息等等,所以存在每个node的数据是相当小的,从byte到kilobyte的范围)

    Znodes管理一个结构,包含数据改变的版本号,ACL改变的版本号和一个时间戳。是为了使缓存有效和协同的修改。当znode的数据改变时,版本号会增加。例如,当客户端获取数据时,也将会获取数据的版本号。

    在命名空间中的每个znode的数据读写都是原子性的。读将会得到那个znode的所有数据,写将会替换所有的数据。每个node有ACL(Access Control List),这样用来限制权限。

    ZooKeeper也会有一个ephemeral nodes的概念。当创建znode的session是active的时候,这些znodes是存在的。当session结束时,这些znode将会删除。当你想要实现[tbd]的时候,Ephemeral nodes是非常有用的。

    Conditional updates and watches

    ZooKeeper支持watches的概念,客户端会在znode上设置一个watch,当znode修改的时候,一个watch将会触发和删除。当一个watch触发的时候,客户端将会一个packet,说znode已经修改了。如果客户端和Zookeeper servers的一个server已经断开,那么客户端将会收到一个本地的通知。

    Guarantees

    ZooKeeper是非常快和简单的。它的作用是为了构建更加复杂的服务而作为基石,例如,同步。它也提供一些保证

    • 顺序的一致性。来自客户端的修改会是发送的顺序
    • 原子性。修改要么成功,要么失败,并不会产生部分结果
    • 单个的系统镜像。客户端将会看到相同的服务视图。不管怎样连接到那个server。
    • 可靠性。只要修改发生,将会持久化到那一刻。直到客户端再次修改它
    • 时效性。在一定的时间范围内,保证客户端与服务器是最新的状态

    Simple API

    ZooKeeper设计的目的是为了提供简单的编程接口。因此,它仅仅提供这些操作:

    create:在一个location中创建一个node

    delete:删除一个node

    exists:检测一个node是否存在在一个location

    get data:从一个node中读取数据

    set data:写数据到一个node上

    get children:获取一个node的所有children

    sync:等待数据传播

    Implementation

    ZooKeeper Components显示高级的ZooKeeper服务组件。除了request processor之外。组成ZooKeeper服务的每个servers都会有每个组件的copy。

    replicated database是一个内存数据库,包含完整的数据结构。修改将会记录到磁盘上,为了可恢复。当进行写操作的时候,在应用到内存数据库之前,也会序列化到磁盘上的。

    客户端只会连接到一个server用来提交请求。读请求来自于每个服务数据库的本次复制,而修改服务状态的请求,写请求由一个agreement protocol来处理。

    由于agreement protocol,来自客户端的所有写请求将会跳转到单的server,这个server叫做leader。剩下的其他ZooKeeper servers叫做followers。

    ZooKeeper使用一个原子性的消息协议。因为消息层是原子性的。ZooKeeper保证本地的复制并不会偏移。当leader收到一个写请求时,它会计算系统的状态是什么。

    Uses

    ZooKeeper的编程接口相当简单。使用这些接口,你可以实现更高级的操作,例如:synchronizations primitives,group membership, ownership等等。

     

    下节探索:ZooKeeper Performance and Reliability参考url:https://zookeeper.apache.org/doc/trunk/zookeeperOver.html

  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/yandufeng/p/6365079.html
Copyright © 2011-2022 走看看