Zookeeper基础知识

108 阅读6分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

什么是Zookeeper

Zookeeper 是 Google 的 Chubby一个开源的实现 ,是 Hadoop 的分布式协调服务

它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等

使用缘由

①大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等)。

②目前、大部分应用需要开发私有的协调程序,缺乏一个通用的机制

③协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器

④Zookeeper:提供通用的分布式锁服务,用以协调分布式应用

工作原理

①每个Server在内存中存储了一份数据

②Zookeeper启动时,将从实例中选举一个leader(Paxos 协议)

③Leader负责处理数据更新等操作,其他Follower节点负责接收客户端的读写操作请求。

④只有大多数Server在内存中成功修改数据成功,才表示一个更新操作成功。

优点:

最终一致性: 为客户端展示同一个视图,这是zookeeper里面一个非常重要的功能。

可靠性: 如果消息被一台服务器接受,那么它将被所有的服务器接受。

实时性: Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

独立性: 各个Client之间互不干预

原子性: 更新只能成功或者失败,没有中间状态

顺序性: 所有Server,同一消息发布顺序一致。

Zookeeper角色

领导者(leader),负责进行投票的发起和决议,更新系统状态

学习者(learner),包括跟随者(follower)和观察者(observer)

follower:用于接受客户端请求并向客户端返回结果,参与选主过程

observer:可以接受客户端连接,将写请求转发给 leader,不参与选主过程observer的目的是为了扩展系统,提高读取 速度。

Zab协议

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。 实现这个机制的协议叫做Zab协议,它是Paxos算法的改进版,Paxos算法是目前非常出名的一个分布式一致性算法。

Zab协议的两种模式,它们分别是: ①恢复模式(选主): 当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后 ,恢复模式就结束了。 ②广播模式(同步): 状态同步保证了leader和Server具有相同的系统状态。

Zookeeper事物的一致性

为了保证事物的顺序一致性,zookeeper采用了递增的事物id号(zxid)来标识事物。所有的提议( proposal)都在被提出的时候加上了zxid。所有事物在各个Server上以队列的形式逐一执行。

实现中zxid是一个64位的数字,它高32位是epoch用来标识 leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的 统治时期。低32位用于递增计数。

Zookeeper Server的三种状态

每个Server在工作过程中有三种状态:

LOOKING:当前Server不知道leader是谁,正在搜寻

LEADING:当前Server即为选举出来的leader

FOLLOWING:leader已经选举出来,当前Server与之同步

Zookeeper的读写机制

Zookeeper是一个由多个server组成的集群 一个leader,多个follower 每个server保存一份数据副本 全局数据一致 分布式读写 更新请求转发,由leader实施

Zookeeper的保证

更新请求顺序进行,来自同一个client的更新请求按其 发送顺序依次执行 数据更新原子性,一次数据更新要么成功,要么失败 全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的 实时性,在一定事件范围内,client能读到最新数

Zookeeper的选举

半数通过 (大于总数的0.5)

​ 3台机器 挂一台 2 > 3/2 ​ 4台机器 挂两台 2 !> 4/2

无论是3台还是4台,最多只能挂一台,不然集群就不可用,所有zookeeper集群往往都是奇数台

数据一致性与paxos算法

①Paxos算法通过投票来对写操作进行全局编号,同一时刻,只有一个写操作被批准

②同时并发的写操作要去争取选票, 只有获得过半数选票的写操作才会被批准(所以永远只会有一个写操作得到批准)

③其他的写操作竞争失败只好再发起一轮投票,就这样,在日复一日年复一年的投票中,所有写操作都被严格编号排序。

④编号严格递增,当一个节点接受了一个编号为100的写操作,之后又接受到编号为99的写操作(因为网络延迟等很多不可预见原因),它马上能意识到自己 数据不一致了,自动停止对外服务并重启同步过程。

⑤任何一个节点挂掉都不会影响整个集群的数据一致性(总2n+1台,除非挂掉大于n台)。

Zookeeper的数据模型

①层次化的目录结构,命名符合常规文件系统规范

②每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识

③节点Znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有子节点

④Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本

⑤客户端应用可以在节点上设置监视器

⑥节点不支持部分读写,而是一次性完整读写

Zookeeper的节点

①Znode有两种类型,短暂的(ephemeral)和持久的(persistent)

②Znode的类型在创建时确定并且之后不能再修改

③短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点

④持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode 时才会被删除

⑤Znode有四种形式的目录节点:

PERSISTENT EPHEMERAL PERSISTENT_SEQUENTIAL EPHEMERAL_SEQUENTIAL

Zookeeper的会话

客户端的Session

​ 客户端与Server建立TCP连接后得到一个Session ​ 如果连接的Server挂掉后,没有超过timeout时间之内,可以连接其他节点 ​ 同一时期内Session的特性保持不变

Session是由谁来创建? ​ Leader产生一个唯一的session,放到消息队列内,让所有的server可以知道

综上:

Zookeeper 作为 Hadoop 项目中的一个子项目,是 Hadoop 集群管理的一个必不可少的模块,它主要用 来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 Hbase 中 Master Election、 Server 之间状态同步等。

Zoopkeeper 提供了一套很好的分布式集群管理的机制,就是它这种基于层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数据管理模型