zookeeper概念
分布式系统是一个硬件或软件组件分布在不同的网络计算机中上,彼此之间仅仅通过消息传递进行通信和协调的系统。
ZooKeeper 官网是这么介绍的:”Apache ZooKeeper 致力于开发和维护一个支持高度可靠的分布式协调的开源服务器“
ZooKeeper工作机制
ZooKeeper 从设计模式角度来理解:
就是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,
一旦这些数据的状态发生变化,ZK 就将负责通知已经在 ZK 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式。

1、服务端启动时需要去注册信息
2、客户端获取当前服务器列表,并注册监听
3、服务器节点下线
4、服务器节点下线会通知
特性

-
ZooKeeper:一个领导者(leader),多个跟随者(follower)组成的集群。
-
Leader 负责进行投票的发起和决议,更新系统状态。
-
Follower 用于接收客户请求并向客户端返回结果,在选举 Leader 过程中参与投票。
-
集群中只要有半数以上节点存活,Zookeeper 集群就能正常服务。
-
全局数据一致(单一视图):每个 Server 保存一份相同的数据副本,Client 无论连接到哪个 Server,数据都是一致的。
-
顺序一致性: 从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。
-
原子性: 所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。
-
实时性,在一定时间范围内,client 能读到最新数据。
-
可靠性: 一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
设计目标
简单的数据结构 :
Zookeeper 使得分布式程序能够通过一个共享的树形结构的名字空间来进行相互协调,即Zookeeper 服务器内存中的数据模型由一系列被称为ZNode的数据节点组成,
Zookeeper 将全量的数据存储在内存中,以此来提高服务器吞吐、减少延迟的目的。
可以构建集群 :
Zookeeper 集群通常由一组机器构成,组成 Zookeeper 集群的每台机器都会在内存中维护当前服务器状态,并且每台机器之间都相互通信。
顺序访问 :
对于来自客户端的每个更新请求,Zookeeper 都会分配一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序。
高性能 :
Zookeeper 和 Redis 一样全量数据存储在内存中,100% 读请求压测 QPS 12-13W
数据结构
Zookeeper 数据模型的结构与 Unix 文件系统的结构相似,整体上可以看做是一棵树,每个节点称作一个 「ZNode」。
每个 ZNode 默认能存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识。

应用场景
ZooKeeper 是一个典型的分布式数据一致性解决方案,
分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能
统一命名服务
在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。
被命名的实体通常可以是集群中的机器,提供的服务地址,进程对象等等——这些我们都可以统称他们为名字(Name)。
其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表。
通过调用 Zookeeper 提供的创建节点的 API,能够很容易创建一个全局唯一的 path,这个 path 就可以作为一个名称。
阿里巴巴开源的分布式服务框架 Dubbo 就使用 ZooKeeper 来作为其命名服务,维护全局的服务地址列表。
数据发布与订阅(配置中心)
发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。
例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。
分布式环境下,配置文件管理和同步是一个常见问题
一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群、集群中的数据库配置信息等全局配置
对配置文件修改后,希望能够快速同步到各个节点上。
配置管理可交由 ZooKeeper 实现
可将配置信息写入 ZooKeeper 上的一个 Znode
各个节点监听这个 Znode
一旦 Znode 中的数据被修改,ZooKeeper 将通知各个节点

统一集群管理
所谓集群管理无在乎两点:是否有机器退出和加入、选举 Master。
管理节点
分布式环境中,实时掌握每个节点的状态是必要的,比如我们要知道集群中各机器状态、收集各个机器的运行时状态数据、服务器动态上下线等。
交由 ZooKeeper 实现的方式
可将节点信息写入 ZooKeeper 上的一个 Znode
监听这个 Znode 可获取它的实时状态变化
典型应用:HBase 中 Master 状态监控和选举。(TODO:图应该是注册和Register and watch)

Master选举
在分布式环境中,相同的业务应用分布在不同的机器上,有些业务逻辑(例如一些耗时的计算,网络I/O处理),
往往只需要让整个集群中的某一台机器进行执行,其余机器可以共享这个结果,这样可以大大减少重复劳动,提高性能,于是这个master选举便是这种场景下的碰到的主要问题。
利用 Zookeeper 的强一致性,能够很好的保证在分布式高并发情况下节点的创建一定是全局唯一的,
即:同时有多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功。
Zookeeper 通过这种节点唯一的特性,可以创建一个 Master 节点,其他客户端 Watcher 监控当前 Master 是否存活,一旦 Master 挂了,其他机器再创建这样的一个 Master 节点,用来重新选举。
软负载均衡
分布式系统中,负载均衡是一种很普遍的技术,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。
可以是硬件的负载均衡,如 F5,也可以是软件的负载,我们熟知的 Nginx,或者这里介绍的 Zookeeper。

分布式协调/通知
Zookeeper 中特有的 「Watcher」 注册与异步通知机制,能够很好的实现分布式环境下不同机器,甚至不同系统之间的协调和通知,从而实现对数据变更的实时处理。
使用方法通常是不同系统都对 ZK 上同一个 znode 进行注册,监听 znode 的变化(包括 znode 本身内容及子节点的),其中一个系统 update 了 znode,那么另一个系统能够收到通知,并作出相应处理。
心跳检测中可以让检测系统和被检测系统之间并不直接关联起来,而是通过 ZK 上某个节点关联,减少系统耦合;
系统调度模式中,假设某系统有控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台作的一些操作,实际上是修改了 ZK 上某些节点的状态,而 ZK 就把这些变化通知给他
们注册 Watcher 的客户端,即推送系统,于是,作出相应的推送任务。

浙公网安备 33010602011771号