介绍
Apache ZooKeeper致力于开发和维护可实现高度可靠的分布式协调的开源服务器
简单讲就是,它能解决分布式应用中很多复杂工作,比如同步、竞争等。它在配置管理、名字服务、分布式锁、集群管理中都能提供很好的服务。
由于Zookeeper使用内存文件系统来管理数据,对于大量数据的管理不适用,所以一般用作管理关键数据(元数据)
Zookeeper的设计目标
简单: zookeeper通过进程共享一个命名空间来相互协调,这个命名空间称为znode,是一种和文件夹、文件非常相似的一种结构。但不同点是znode是为内存设计的,也就意味着它可以实现高吞吐量和低时延
可复制: 也就是说它自己本身也是高可用,分布式部署的,它们一起维护znode的状态。
严格有序:ZooKeeper为每个更新加一个编号,该编号反映了所有ZooKeeper事务的顺序。后续操作可以使用该顺序实现更高级别的抽象,比如同步原语。
很快:它在“以读为主”的工作负载中速度特别快。因为读基本不需要同步
Zookeeper原理简单介绍
Zookeeper最重要的概念就是znode,其实现原理也都是基于znode的增删改查等,我们从znode开始。
znode
上文中我们也说了,znode非常像一个文件系统,根目录/
、各个文件夹、又有子文件夹如图:
[站外图片上传中…(image-4cc377-1606224409982)]
注意不像标准的文件系统,Zookeeper中的znode有自己的数据,也就是说每个(层)文件或者文件夹都可以绑定数据。这些数据包括状态、配置、路径、版本等信息(这些信息都极小),文件的每次更改都会记录版本号和对应的时间戳。
另外每个znode还有一个访问控制列表(ACL)来限制谁可以做什么。
znode有临时节点的概念,也就是客户端的一次连接中有效,会话结束时自动删除。
监听器watches
watche也是Zookeeper的一个非常重要的概念,想想如果我们想观察一个znode,不可能一直去查看这个znode,首先影响带宽(如果每个客户端都使用网络去查看),效率也很低。有了watch之后,我们可以对我们感兴趣的节点注册一个监听器,在该znode节点发生改变时,zookeeper会通知到我们。
3.6.0 之前watch只有一次的有效期,3.6.0之后可以设置永久的、递归的watch,触发后不会被删除。
Zookeeper的共享存储模型
[站外图片上传中…(image-9e79b6-1606224409982)]
复制的数据库是包含整个数据树的内存中的数据库。更新被记录到磁盘以提高可恢复性,写操作在应用到内存中的数据库之前被序列化到磁盘。
每个ZooKeeper服务器服务客户端。客户端连接到一个服务器来提交请求。读取请求来自每个服务器数据库的本地副本。更改服务状态的请求(写请求)由一致性协议处理,作为协议协议的一部分,所有来自客户端的写请求都被转发到一个称为leader的服务器上。zookeeper其余的服务器称为follow,接收来自leader的信息建议,并同意信息的传递。消息传递层负责在出现故障时替换leader,并将follow与leader同步。
zookeeper能力
zookeeper已实现如下功能:
顺序一致性:来自客户端的更新将按照发送的顺序应用。
原子性:更新成功或失败。没有部分成功。
最终一致性: client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
可靠性:一旦应用了更新,它将从那时起一直存在,直到客户端覆盖该更新。
时效性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
使用方法
ZooKeeper的设计目标之一是提供一个非常简单的编程界面。因此,它仅支持下面这些操作:
- create :在树中的某个位置创建一个节点
- delete: 删除一个节点
- exists: 判断某个节点是否存在
- get data: 获取某个节点绑定的数据
- set data: 设置某个节点的数据
- get children: 获取节点的子节点列表
- sync :等待数据被传播,也就时同步服务端信息。