前言
一直想找时间 好好写一篇关于Zookeeper的博客,雨后的湖大 消除热夏的酷暑,空气变得清新,安静下来可以听到窗外的蛙声。于是乎 整理自己的一些笔记,写下一篇关于Zookeeper的博文。话不多说,干货送上~
Zookeeper概览
Zookeeper,中文名是动物园管理员。它是一个开源的分布式协调服务,ZooKeeper 框架最初是在“Yahoo!"上构建的,用于以简单而稳健的方式访问他们的应用程序。
后来,Apache ZooKeeper 成为 Hadoop,HBase 和其他分布式框架使用的有组织服务的标准。例如,Apache HBase 使用 ZooKeeper 跟踪分布式数据的状态。
ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
原语: 操作系统或计算机网络用语范畴。它是由若干条指令组成的,用于完成一定功能的一个过程。具有不可分割性,即原语的执行必须是连续的,在执行过程中不允许被中断。
ZooKeeper 是一个典型的分布式数据一致性解决方案,他实现的功能有:
1.命名服务 2.配置管理 3.集群管理 4.分布式锁 5.队列管理
(后续会对这几个方面做详细展开~)
Zookeeper基本概念
1. Zookeeper的角色
首先讲解一下Zookeeper集群中每个server所承担的角色,它们是以下三种中的一种:
(1)leader
一个Zookeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护与各Follwer及Observer间的心跳。
(2)follower
- 一个Zookeeper集群可能同时存在多个Follower,它会响应Leader的心跳,
- Follower可直接处理并返回客户端的读请求,同时会将写请求转发给Leader处理,
- 并且负责在Leader处理写请求时对请求进行投票。
(3)observer
角色与Follower类似,但是无投票权。为了支持更多的客户端,需要增加更多Server;Server增多,投票阶段延迟增大,影响性能;引入Observer,Observer不参与投票; Observers接受客户端的连接,并将写请求转发给leader节点; 加入更多Observer节点,提高伸缩性,同时不影响吞吐率。
工作流程如下图所示:
总结概括三者的关系,如下图所示:
2. 会话(Session)
Session 指的是 ZooKeeper 服务器与客户端会话。在 ZooKeeper 中,一个客户端连接是指客户端和服务器之间的一个 TCP 长连接。
客户端启动的时候,首先会与服务器建立一个 TCP 连接,从第一次连接建立开始,客户端会话的生命周期也开始了。
通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向 Zookeeper 服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的 Watch 事件通知。
Session 的 sessionTimeout 值用来设置一个客户端会话的超时时间。
当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在 sessionTimeout 规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
在为客户端创建会话之前,服务端首先会为每个客户端都分配一个 sessionID。
由于 sessionID 是 Zookeeper 会话的一个重要标识,许多与会话相关的运行机制都是基于这个 sessionID 的。
因此,无论是哪台服务器为客户端分配的 sessionID,都务必保证全局唯一。
3. Znode
在谈到分布式的时候,我们通常说的“节点"是指组成集群的每一台机器。
然而,在 ZooKeeper 中,“节点"分为两类:
- 第一类同样是指构成集群的机器,我们称之为机器节点。
- 第二类则是指数据模型中的数据单元,我们称之为数据节点一ZNode。
ZooKeeper 将