zookeeper简介

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper简介相关的知识,希望对你有一定的参考价值。

概览

zookeeper是一个分布式应用的分布式的、开放源码的协作服务。它提供一些源语,分布式应用基于此,可以为同步、配置维护、分组和命名建立更高级别的服务。它被设计成易编程和使用类似文件系统目录树架构的数据模型。它能运行在Java环境和同时有Java和C的环境中。

协同服务是出了名的难以正确实现。特别容易出错,比如竞争条件和死锁。zookeeper背后的原因是解决分布式应用从头开始实现协同服务的责任

1、设计目标

简单

zookeeper允许分布式进程之间通过一个组织类似于标准文件系统的共享分层命名空间进行协调。命名空间包括数据寄存器,用zookeeper术语称znode,类似于文件和目录。不像设计用于存储的典型的文件系统,zookeeper数据存在内存中,意味着zookeeper能够实现高吞吐量和低延迟。

zookeeper的实现,为高性能、高可用和严格有序访问提供了附加性能。在性能方面,zookeeper可以用于大型的、分布式系统。可靠方面可以避免单点故障。严格有序意味着在客户端可以实现复杂的同步源语。

复制

       像分布式进程一样协调,zookeeper本身就是一组相互复制的主机的整体。

技术分享

组成zookeeper服务的服务器必须知道彼此。它们维护一个内存中的状态的镜像,这个镜像具有事务日志和持久存储快照。只要大部分服务器可用,那么zookeeper服务就可用。

客户端只能连接到一个zookeeper服务器。客户端维护一个TCP连接,客户端通过这个TCP连接可以发送请求、获取应答、获取watch事件和发送心跳。如果TCP连接断开,客户端会连接到不同的服务器。

有序

zookeeper会使用一个反映所有zookeeper事务顺序的数字标识每次更新。随后的操作可以使用顺序实现更高等级的抽象,比如同步源语。

快速

       在以读为主的工作负载下,zookeeper非常快。zookeeper运行在上千台主机上,在读比写常见的情况下,表现的更高,比率大约为10:1。

2、数据模型和分层命名空间

zookeeper提供的命名空间特别想标准的文件系统。名字是由’/’分割的路径元素的序列。在zookeeper命名空间的每个节点是由一个路径标识的。

技术分享

3、节点和短暂节点

不想标准的文件系统,zookeeper命名空间中的每个节点都有数据,同时也可以有子。就像有一个允许一个文件成为一个目录的文件系统。zookeeper设计用来存储协调数据的,比如状态信息、配置、位置信息等。因此存储在每个节点上的数据通常非常小,在字节到千字节范围内的,也就是不会超过1M。是用术语znode来清晰的表达我们讨论的zookeeper数据节点。

znode维护这包含数据改变的版本号、ACL改变、时间戳、允许cache确认和协调更新的stat结果。每次一个znode数据的改变,版本号就会增加。例如,每当客户端检索数据的时候,也会接收该数据的版号。

存储在命名空间的每个znode的数据的读和写是原子性的。读操作会得到与znode相关的所有数据的字节,写操作会代替所有的数据。每个节点有严格控制可以做什么的访问控制列表(ACL)。

zookeeper也有短暂节点的概念。只要创建该会话的znode存活,这些znode就存在。当会话结束,该znode就会被删除。当想部署的时候短暂节点非常有用[待决定]。

协作updates和watches

    zookeeper支持watch的概念。客户端可以在一个znode上设置一个watch。当该znode改变时,watch将被触发和删除。当watch被触发,客户端会接收到通知该znode已经改变的包。如果客户端和其中一个zookeeper服务器之间的连接端开,该客户端会收到一个本地通知。

4、保证

zookeeper是非常快速和简单的。因为zookeeper的目的是成为更复杂的服务架构的基础,比如同步,所以提供了一系列的保证。

  • 顺序一致性

 来自客户端的更新会按照被发送的顺序来进行应用。

  • 原子性

             更新要么成功要么失败,不会是一部分结果

  • 单个系统镜像

             不管客户端连接到哪个服务器,看到的是同样的服务的情景。

  • 可靠性

             一旦更新被应用,会一直保持直到客户端重写这个更新

  • 及时

             在一定的时间内,客户端看到系统的数据保证是最新的。

5、简单的API

     zookeeper设计的目的之一就是提供非常简单可编程的接口。但是只提供了如下操作:

     create

           在本地以树的方式创建node

     delete

            删除一个node

     exists

           在本地测试一个node是否存在

     get data

           从一个node读取数据

     set data

           写数据到node

     get children

           检索一个node的子

     sync

           等数据进行传播

6、实现

       下图展示了zookeeper服务的组件。除了请求处理器外,每个组成zookeeper服务的服务器复制自己每个组件的副本。

技术分享

       复制数据库是包含整个数据数的内存数据库。更新会记录到磁盘用于恢复,在被应用到内存数据库之前,写操作会序列化到磁盘。

每个zookeeper服务器都为客户端提供服务。客户端会精确连接到一个服务器提交irequest。读请求是由每个服务器数据库的本地服务提供服务。改变服务状态的请求、写请求是通过约定好的协议处理的。

作为约定好的协议的一部分,所有来自客户端的写请求被转发到一个单独的服务器,被称为leader。剩下的zookeeper服务器被称为follower,接收来自leader的信息建议和商定信息发布。信息层负责替换故障的leader和同步follwer和leader。

zookeeper使用自定义的原子消息协议。由于消息层是原子性的,所以zookeeper能保证本地副本不会偏离。当leader接收到一个读请求,它计算系统是什么状态,当写操作被应用并且转化成为捕捉新状态的事务。

本文出自 “长街听风人” 博客,请务必保留此出处http://kevinhao.blog.51cto.com/5204735/1787746

以上是关于zookeeper简介的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper简介

分布式专题——Zookeeper简介

一zookeeper简介

zookeeper系列之:zookeeper简介浅谈

ZooKeeper简介

Zookeeper简介