1.|1. zooKeeper 概述
ZooKeeper 概述
ZooKeeper 是一个用于分布式应用的分布式、开源的协调服务。它开放了一套简单的函数,分布式应用可以在此之上为上层服务实现分布式同步、配置维护、组服务、命名等功能。它使用了一个类似于目录树结构的文件系统作为数据模型,易于编程。它运行在java上,而且已经有了Java和C的客户端。
众所周知,协调服务是很难正确实现的。它们很容易出现条件竞争和死锁等错误。ZooKeeper 出现的目的就是解除为分布式应用实现协调服务的痛点。
Zookeeper 现由Apache 开源管理,是 Apache Hadoop 的一个子项目,后面被提升为Apache的顶级项目
文章图片
ZooKeeper service 特性
- Sequential Consistency(顺序一致性):按照客户端的发送顺序进行更新。
- Atomicity(原子性):更新或成功或失败,不会有中间态的结果。
- Single System Image(单一系统镜像):无论客户端或服务器,连接到服务端后都能看到同样的视图。
- Reliability(可靠性):一旦应用一个更新,它将留存到客户端覆盖本次更新为止。
- Timeliness(时效性):在一段时间内保证系统的客户端视图是最新的。
ZooKeeper 支持watches 的概念. 客户端可以在Znodes上设一个watch 。znode 改变时会触发或删除watch。当watch 被触发时,客户端会收到一个“znode已被改变”的包。并且,如果客户端和一个ZooKeeper服务器之间的连接中断时,客户端也会收到一个本地通知。三角色
- 【1.|1. zooKeeper 概述】Leader(领导者) : 负责更新系统状态,进行投票(选举leader)的发起和决议。
- Follower(跟随者) : 用于接收客户端请求并向客户端返回处理请求的结果,在选举过程中参与投票
- Observer(观察者) : 可以接收客户端的连接,将写请求转发给Leader系诶的那,但Observer不参加投票过程,只同步Leader的状态。Observer的目的是为了扩展系统,提高读取速度。
ZooKeeper 提供的命名空间非常像标准的文件系统。名字是路径元素通过斜杠(/)分割的序列。 ZooKeeper 命名空间中的每个节点都是一个唯一的路径节点以及临时节点
文章图片
ZooKeeper 层级命名空间
与标准的文件系统不同,ZooKeeper 命名空间中的每个节点都存有与子节点相关的数据。它就像一个文件系统允许文件变成一个目录。(ZooKeeper 为存储协调数据而设计:状态信息、配置信息、路径信息等,因此每个节点存储的数据通常都很小,量级在B到KB之间。)我们用术语znode 来指ZooKeeper 数据节点。
Znodes 的数据结构中包括:数据变更的版本号、ACL 变更以及时间戳,以便缓存验证和协调更新。每次znode数据改变,版本号递增。例如,每当客户端收到数据,它将同时收到数据的版本。
命名空间中znode存储的数据是被原子性读写的。读操作可以获得Znode相关的全部数据,写操作将覆盖全部数据。每个及诶单有一个权限控制列表( Access Control List ,ACL)来限制什么人可以干什么事。
ZooKeeper 也有临时节点的概念. 这些节点存在时间与会话一致,会话创建时znode生效。当会话结束时Znode被删除。节点类型
ZooKeeper 有四种节点类型
节点类型 | 说明 |
---|---|
PERSISTENT | 持久化节点 |
PERSISTENT_SEQUENTIAL | 持久化自增序列节点,这种节点会根据当前已存在的节点数自增 1(从 0000000000 开始) |
EPHEMERAL | 临时节点, 客户端session超时或断开连接时这类节点就会被自动删除(稍有延时) |
EPHEMERAL_SEQUENTIAL | 临时自增序列节点 |
查看节点属性stat path
比如:stat /node_1
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x700000015
cversion = 10
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 4
节点属性 | 说明 |
---|---|
cZxid | 数据节点创建时的事务ID |
ctime | 数据节点创建时的时间 |
mZxid | 数据节点最后一次更新时的事务ID |
mtime | 数据节点最后一次更新时的时间 |
pZxid | 数据节点的子节点列表最后一次被修改(是子节点列表变更,而不是子节点内容变更)时的事务ID |
cversion | 子节点的版本号 |
dataVersion | 数据节点的版本号 |
aclVersion | 数据节点的ACL版本号 |
ephemeralOwner | 如果节点是临时节点,则表示创建该节点的会话的SessionID;如果节点是持久节点,则该属性值为0 |
dataLength | 数据内容的长度 |
numChildren | 数据节点当前的子节点个数 |
推荐阅读
- 深入理解Go之generate
- Flutter自定义view|Flutter自定义view —— 闯关进度条
- 2018年|2018年 Bible study 01/02/2018
- #读书笔记#流量池Day|#读书笔记#流量池Day 1 文沫
- 关于分布式锁|关于分布式锁 Redis 与 Zookeeper 的原理,它们如何实现分布式锁()
- linux下zookeeper安装
- Spring|Spring Cloud Feign组件
- Apache|Apache Zookeeper总结
- 水泵使用情况概述
- Zookeeper的sync操作是什么()