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

  • 相关阅读:
    Live2d Test Env
    Live2d Test Env
    Live2d Test Env
    Live2d Test Env
    Live2d Test Env
    偷东西的学问-背包问题
    HMM-前向后向算法理解与实现(python)
    详解数组分段和最大值最小问题(最小m段和问题)
    打家劫舍系列
    面试题56
  • 原文地址:https://www.cnblogs.com/yandufeng/p/6365079.html
Copyright © 2011-2022 走看看