ZooKeeper(概念篇):ZooKeeper简介

用了好久zk了,只会用,也没系统总结一下

Apache ZooKeeper致力于开发和维护开源服务器,实现高度可靠的分布式协调。

前段时间总结过CAP,感兴趣的大家可以过去看看:https://blog.csdn.net/Soinice/article/details/96784994

什么是ZooKeeper?

ZooKeeper 简称zk,中文名:动物园管理者

ZooKeeper是一种集中式服务,用于维护配置信息命名提供分布式同步提供组服务。所有这些类型的服务都以分布式应用程序的某种形式使用。每次实施它们都需要做很多工作来修复不可避免的错误和竞争条件。由于难以实现这些类型的服务,应用程序最初通常会吝啬它们,这使得它们在变化的情况下变得脆弱并且难以管理。即使正确完成,这些服务的不同实现也会在部署应用程序时导致管理复杂性。所以,这时候就产生了ZK。

它是一个分布式服务框架,是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务,集群管理,分布式应用配置项的管理等

ZooKeeper:分布式应用程序的分布式协调服务

ZooKeeper是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以构建这些原语,以实现更高级别的服务,以实现同步,配置维护以及组和命名。它被设计为易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。它在Java中运行,并且具有Java和C的绑定。

众所周知,协调服务很难做到。他们特别容易出现比赛条件和死锁等错误。ZooKeeper背后的动机是减轻分布式应用程序从头开始实施协调服务的责任。

设计目标

简单的

ZooKeeper允许分布式进程通过共享的分层命名空间相互协调,该命名空间的组织方式与标准文件系统类似。名称空间由数据寄存器组成 - 在ZooKeeper用语中称为znodes - 这些与文件和目录类似。与专为存储而设计的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟数量。

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

可复制

与它协调的分布式进程一样,ZooKeeper本身也可以在称为集合的一组主机上进行复制。

组成ZooKeeper服务的服务器必须彼此了解。它们维护内存中的状态图像,以及持久性存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务就可用。

客户端连接到单个ZooKeeper服务器。客户端维护TCP连接,通过该连接发送请求,获取响应,获取监视事件以及发送心跳。如果与服务器的TCP连接中断,则客户端将连接到其他服务器。

有序的

ZooKeeper使用反映所有ZooKeeper事务顺序的数字标记每个更新。后续操作可以使用该顺序来实现更高级别的抽象,例如同步原语。

快速的

它在“读取主导”工作负载中特别快。

ZooKeeper应用程序在数千台计算机上运行,​​并且在读取比写入更常见的情况下表现最佳,比率大约为10:1。

总之,ZK是数据库

ZooKeeper 是一个数据库

启动服务端

ZKServer.sh start

启动客户端

zkCli.sh

默认连接任意一台服务器 localhost:2181

创建节点

create /soinice 666

查询节点值

get /soinice
666

简单的API

ZooKeeper的设计目标之一是提供一个非常简单的编程接口。因此,它仅支持以下操作:

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

  • delete:删除节点

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

  • get data:从节点读取数据

  • set data:将数据写入节点

  • get children:检索节点的子节点列表

  • sync:等待传播数据

ZooKeeper是一个拥有文件系统特点的数据库

数据模型和分层命名空间

ZooKeeper提供的名称空间非常类似于标准文件系统。名称是由斜杠(/)分隔的路径元素序列。ZooKeeper名称空间中的每个节点都由路径标识。

ZooKeeper的分层命名空间

创建节点必须 / 开始,和文件目录很相像。

节点和临时节点

与标准文件系统不同,ZooKeeper命名空间中的每个节点都可以包含与之关联的数据以及子项。这就像拥有一个允许文件也是目录的文件系统。(ZooKeeper旨在存储协调数据:状态信息,配置,位置信息等,因此存储在每个节点的数据通常很小,在字节到千字节范围内。)我们使用术语znode来说明我们正在谈论ZooKeeper数据节点。

Znodes维护一个stat结构,其中包括数据更改,ACL(访问数据列表)更改和时间戳的版本号,以允许缓存验证和协调更新。每次znode的数据更改时,版本号都会增加。例如,每当客户端检索数据时,它也接收数据的版本。

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

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

ZooKeeper是一个解决了一致性问题的分布式数据库

数据同步,数据一致性。

ZooKeeper是一个具有发布和订阅功能的分布式数据库(watch)

有条件的更新和手表

ZooKeeper支持手表的概念。

客户端可以在znode上设置监视。当znode更改时,将触发并删除手表。触发监视时,客户端会收到一个数据包,指出znode已更改。如果客户端与其中一个ZooKeeper服务器之间的连接中断,则客户端将收到本地通知。这些可以用于[tbd]

总之,zk是数据库,是一个具有发布和订阅功能的,解决了数据一致性问题的,拥有文件系统特点的分布式数据库。

ZooKeeper特点

ZooKeeper非常快速而且非常简单。但是,由于其目标是构建更复杂的服务(如同步)的基础,因此它提供了一系列保证。这些是:

  • 顺序一致性 - 客户端的更新将按发送顺序应用。
  • 原子性 - 更新成功或失败。没有部分结果。
  • 单系统映像 - 无论服务器连接到哪个服务器,客户端都将看到相同的服务视图。
  • 可靠性 - 一旦应用了更新,它将从那时起持续到客户端覆盖更新。
  • 及时性 - 系统的客户视图保证在特定时间范围内是最新的。

文章大多数翻译自:http://zookeeper.apache.org/doc/current/zookeeperOver.html

发布了178 篇原创文章 · 获赞 132 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/Soinice/article/details/97613922