加粗样式
ZooKeeper入门
一、What is ZooKeeper
ZooKeeper官网
ZooKeeper 是一种面向分布式应用程序的分布式开源协调服务,目前属于 Apache 维护。现分布式数据一致性解决方案中可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
ZooKeeper特点:
- 无单点: 一个(Leader),多个(Follower)的集群,只要有
半数以上
节点就能存活整个集群,集群安装适合奇数
台服务器。 - 顺序一致性: 从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。
- 原子性: 所有事务请求的处理结果即为全部应用成功,否则全部应用失败,无部分结果。
- 单个系统镜像 : 无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的(无状态)。
- 实时性: 最新事务被成功应用,ZooKeeper 可以保证客户端立即读取到这个事务变更后最新状态的数据。
- 可靠性: 一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
数据模型和分层命名空间:
ZooKeeper 提供的命名空间与 Unix 文件系统的命名空间非常相似。名称是由斜杠( / )分隔的路径元素序列。每个节点称做一个 ZNode ,ZooKeeper 命名空间中的每个节点(ZNode)都由一个唯一路径标识。
1、ZooKeeper设计目标
ZooKeeper 简单数据模型:
- ZooKeeper 通过树形结构进行存储数据,它由在 ZooKeeper 的说法中称为 ZNodes 数据节点组成,类似于标准文件系统与文件。
- 与专为存储而设计的典型文件系统不同,ZooKeeper 数据保存在内存中,这意味着 ZooKeeper 可以实现高吞吐量和低延迟数字。
可配置 Cluster
- 为保证高可用,ZooKeeper都会以奇数出现在集群中保证高可用进行复制。
顺序访问
- ZooKeeper 会在每次更新中标记一个数字,该数字反映了所有 ZooKeeper 事务的顺序。后续操作可以使用该顺序来实现。
高性能更快速
- ZooKeeper 将数据全量存储在内存中以保持高性能,并通过服务集群来实现高可用。
- 由于 ZooKeeper 的所有更新和删除都是基于事务的,所以其在读多写少的应用场景中有着很高的性能表现。
2、ZooKeeper核心概念
Session 会话
Session 指的是 ZooKeeper 服务器与客户端会话。当客户端(Client) 通过 TCP 长连接 连接到 ZooKeeper 服务器时,Session 开始建立连接并通过心跳检测(tickTime)
与服务器保持有效会话。通过此连接,客户端(Client) 也可以向 ZooKeeper 服务端发送请求并接受响应,同时也可以接收到 Watch 事件的通知。
当由于服务器压力太大、网络故障或是客户端(Client) 主动断开连接等各种原因导致客户端连接断开时,只要在会话超时(SessionTimeout)
规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
ZNode 数据节点
在 Zookeeper 中,数据模型由数据节点(ZNode) 组成树形结构,ZNode 是一个跟 Unix 文件系统相似的节点,可以往这个节点存储或获取数据。每一个 ZNode 默认能够存储 1MB 的数据。
ZNode节点类型:
- 持久节点:客户端与 ZooKeeper 断开连接后,该节点依旧存在。
- 持久循序编号节点:客户端与 ZooKeeper 断开连接后,该节点依旧存在,只是 ZooKeeper 给该节点名称进行顺序编号。
- 临时节点:客户端与 ZooKeeper 断开连接后,该节点被删除。
- 临时循序编号节点:客户端与 ZooKeeper 断开连接后,该节点被删除,只是 ZooKeeper 给该节点名称进行顺序编号。