初识zookeeper

1、zookeeper是什么?

ZooKeeper是一个开源的、分布式的协调服务,它是为分布式应用提供服务的。ZooKeeper暴露了一组简单的基本方法,分布式应用可以基于这些基本方法来实现更高级别的synchronization(同步), configuration maintenance(配置维护), and groups(分组) and naming(命名)服务。ZooKeeper被设计的易于编程,并使用和文件系统类似的目录树结构数据模型。它运行在java中,并且对java和c都有绑定。

一般协调服务都比较复杂。它们特别容易出现诸如竞争和死锁等错误。ZooKeeper的目的是为了简化分布式应用搭建协调服务的工作量。

2、zookeeper的设计目标

ZooKeeper是简单的。zookeeper允许分布式进程通过共享的分级nameSpace相互协调,这个nameSpace的结构和标准文件系统结构类似采用zookeeper的说法,nameSpacedata registers(数据寄存器)组成 - 称为znode, - 这些znode类似于文件和目录。与文件系统不同的是,文件系统是为为存储设计的,而zookeeper数据保存在内存中,这意味着zookeeper可以实现高吞吐和低延迟。

ZooKeeper的实现对高性能,高可用性,严格有序的访问非常重视。zookeeper的高性能意味着它可以用于大型分布式系统。可靠性方面使它不会成为单点。严格的排序意味着可以在客户端实现复杂的同步操作。

zookeeper是集群化的。就像它所协调的分布式进程一样,zookeeper本身也被推荐部署在不同的机器上组成一个集群。


构成zookeeper service的服务器必须全都了解彼此。他们共同维护一个内存中的stat image,以及持久存储中的事务日志和快照。只要集群中的大部分服务器可用,zookeeper service就可以对外提供服务。

客户端连接到单个zookeeper服务器。客户端维护一个和服务器的tcp连接,通过它发送请求,获取响应,获取watch事件并发送心跳。如果客户端和服务器的tcp连接中断,客户端将连接到集群中的另外一个服务器。

zookeeper是顺序性的。zookeeper为每个更新都会打标上一个号码,这个号码反映了所有zookeeper操作的顺序。后续的操作可以使用该顺序来实现更高级别的抽象,例如同步primitives(基本操作)

zookeeper是很快的它在“读操作主导”的工作负载中尤其快速。zookeeper应用程序可以在数千台机器上运行,并且在读写比率大约为10:1的时候,它的性能表现最佳。

3、zookeeper的数据模型和分层命名空间

zookeeper提供的name space(命名空间)非常类似于标准文件系统。一个name是由斜杠(/)分隔的一系列路径元素表示的。zookeeper name space中的每个node都是由路径定义的。


4、zookeeper的节点和临时节点

与标准文件系统不同,zookeeper名称空间中的每个node(节点)都可以有与其相关的数据以及子节点。每个节点就像一个文件系统,但是这个文件系统允许一个文件也是一个目录。(zookeeper被设计为存储协调数据:状态信息,配置,位置信息等,因此存储在每个节点的数据通常很小,范围从字节到千字节)。我们使用术语znode来说明我们正在谈论zookeeper的数据节点。

znodes维护一个状态结构,其中包含数据更改的版本号,ACL更改和时间戳,这些信息可以用于缓存验证和协调更新。每次znode的数据改变时,版本号都会增加。例如,每当客户端检索数据时,它也会获得数据的版本号。

存储在名称空间中每个节点上的数据都是以原子方式读取和写入的。读取的时候回获得与znode关联的所有数据字节,写入将替换所有数据。每个节点都有一个访问控制列表(ACL),它限制谁可以做什么。

zookeeper也有临时节点的概念。只要创建znode的会话处于活动状态,这些znode就会存在。当会话结束时,znode被删除。当你想实现[tbd]时,临时节点很有用。

5、有条件的update和watch

zookeeper支持watches的概念。客户端可以在znodes上设置watch。当znode改变时,watch将被触发并移除。当watch被触发时,客户端收到一个数据包,说明znode已经改变。如果客户端和其中一个zookeeper集群服务器之间的连接中断,客户端将收到本地通知。

6、zookeeper的保证

zookeeper非常快速,非常简单。因为它的目标是构建更复杂的服务(如同步)的基础,它提供了一系列的保证。这些是:

顺序一致性 - 客户端发送的更新将按照被发送的顺序执行。

原子性 - 更新只有成功或失败。

单系统镜像 - 客户端无论连接到哪个服务器,都会看到相同的服务视图。

可靠性 - 一旦应用了更新,它将一直持续到客户端覆盖更新为止。

及时性 - 客户端获取的系统状态保证在一定的时间范围内保持最新。

7、简单的API

zookeeper的一个设计目标是提供一个非常简单的编程接口。因此,它只支持这些操作:

创建:在树中的某个位置创建一个节点

删除:删除一个节点

存在:测试节点是否存在于某个位置

获取数据:从节点读取数据

设置数据:将数据写入节点

获取子节点:检索节点的子节点列表

同步:等待数据被同步

8、zookeeper的实现

下图显示了zookeeper服务的高级组件。除request processor外,构成zookeeper服务的每个服务器都会复制其各个组件的副本。


replicated database是包含整个数据树的内存数据库。更新和写入操作应用到replicated database之前, 更新记录会打日志到磁盘以实现可恢复性,写入操作也会被序列化到磁盘

每个zookeeper服务器都为客户端提供服务。客户端连接至一台服务器以提交request。读请求的结果是从每个服务器数据库的本地副本获取的。另外,会改变zookeeper服务状态的请求以及写入请求会通过约定的协议处理。

作为协议协议的一部分,所有来自客户端的写入请求都被转发到一台leader的服务器。其他的zookeeper集群服务器,被称为follower,接收来自leader的消息并同意消息传递。消息传递层负责替换失败的leader,并向leader同步follower。

zookeeper使用自定义的原子消息传递协议。由于消息传递层是原子的,因此zookeeper可以保证本地副本不会和leader的副本不一致。当leader接收到一个写请求时,它会计算这个写请求被处理后,系统的状态是什么样的,并将这个状态其转换为事务。





猜你喜欢

转载自blog.csdn.net/qq_34680763/article/details/79989114