Zookeeper总结

一、zookeeper介绍

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby一个开源的实现。它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务
比如分布式同步,配置管理,集群管理,命名管理,队列管理。它被设计为易于编程,使用文 件系统目录树作为数据模型。
服务端跑在 java上,提供 java 和 C 的客户端 API,
众所周知,协调服务非常容易出错,但是却很难恢复正常,例如,协调服务很容易处于 竞态以至于出现死锁。
我们设计 ZooKeeper 的目的是为了减轻分布式应用程序所承担的协 调任务ZooKeeper是集群的管理者,监视着集群中各节点的状态,根据节点提交的反馈进行下 一步合理的操作。
最终,将简单易用的接口和功能稳定,性能高效的系统提供给用户。

二、zookeeper特点

ZooKeeper 作为一个集群提供数据一致的协调服务,自然,最好的方式就是在整个集群中的各服务节 点进行数据的复制和同步 数据复制的好处:
1、容错:一个节点出错,不至于让整个集群无法提供服务。
2、扩展性:通过增加服务器节点能提高 ZooKeeper系统的负载能力,把负载分布到多个节点上。
3、高性能:客户端可访问本地 ZooKeeper 节点或者访问就近的节点,依次提高用户的访问速度。
特点:
1、 最终一致性:client 不论连接到哪个 Server,展示给它都是同一个视图,这是 ZooKeeper 最重要 的性能。
2、 可靠性:具有简单、健壮、良好的性能,如果消息 m 被到一台服务器接受,那么它将被所有的服务 器接受。
3、 实时性:ZooKeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者 服务器失 效的信息。但由于网络延时等原因,ZooKeeper不能保证两个客户端能同时得到刚更新的数据,如果 需要最新数据,应该在读数据之前调用 sync()接口。
4、等待无关(wait-free):慢的或者失效的 client 不得干预快速的 client 的请求,使得每个 client 都 能有效的等待
5、 原子性:更新只能成功或者失败,没有中间状态。
6、 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息 a 在消息 b前发布,则 在所有 Server 上消息 a 都将在消息 b 前被发布;偏序是指如果一个消息 b 在 消息 a 后被同一个发送者 发布,a必将排在 b 前面

三、文件系统

ZooKeeper 的命名空间就是 ZooKeeper 应用的文件系统,它和 linux 的文件系统很像,也是树状,这样就可以确定每个路径都是唯一的,对于命名空间的操作必须都是绝对路径操作。
与 linux文件系统不同的是,linux文件系统有目录和文件的区别,而ZooKeeper统一叫做znode, 一个 znode 节点 可以包含子znode,同时也可以包含数据。
所以总结说来,znode 即是文件夹又是文件的概念,所以在 ZooKeeper 这里面就不叫文件也不叫文件夹,叫znode,每个znode有唯一的路径标识,既能存储数据,也能创建子znode。 但是 znode 只适合存储非常小量的数据,不能超过 1M,最好小于 1K。
下面是关于 Znode 的介绍(非常重要):
1、Znode 有两种类型:
短暂(ephemeral)
持久(persistent)
2、Znode 有四种形式的目录节点(默认是 persistent )
PERSISTENT 、PERSISTENT_SEQUENTIAL 、EPHEMERAL 、EPHEMERAL_SEQUENTIAL
3、创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
4、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过 顺序号推断事件的顺序。
5、EPHEMERAL 类型的节点不能有子节点。
6、客户端可以在 znode 上设置监听器。

四、监听机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加 删除)时,ZooKeeper会通知客户端。监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快 速的响应到监听了该节点的应用程序监听器的工作机制,其实是在客户端会专门创建一个监听线程,在本机的一个端口上等待 Zookeeper集群发送过来事件。
在这里插入图片描述
监听工作原理
ZooKeeper 的 Watcher 机制主要包括客户端线程、客户端 WatcherManager、Zookeeper 服务 器三部分。
客户端在向 ZooKeeper 服务器注册的同时,会将 Watcher 对象存储在客户端WatcherManager 当中。当ZooKeeper 服务器触发 Watcher 事件后,会向客户端发送通知,客户端线 程从 WatcherManager 中取出对应的Watcher 对象来执行回调逻辑

五、zookeeper应用场景

命名服务

命名服务是分布式系统中较为常见的一类场景,分布式系统中,被命名的实体通常可以是集 群中的机器、提供的服务地址或远程对象等,通过命名服务,客户端可以根据指定名字来获取资源的实体、 服务地址和提供者的信息。
Zookeeper也可帮助应用系统通过资源引用的方式来实现对资源的定位和使用,广义上的命名服务的资源定位都不是真正意义上的实体资源,在分布式环境中,上层应用仅仅需要 一个全局唯一的名字。Zookeeper可以实现一套分布式全局唯一 ID 的分配机制。
**

配置管理

程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。现在把这些 配置全部放到 ZooKeeper 上去,保存在ZooKeeper 的某个目录节点中,然后所有相关应用程序对这个 目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到
ZooKeeper 的通知,然后从 ZooKeeper 获取新的配置信息应用到系统中就好

六、分布式锁

有了 ZooKeeper 的一致性文件系统,锁的问题变得容易。 锁服务可以分为以下三类
一个是写锁,对写加锁,保持独占,或者叫做排它锁,独占锁 一个是读锁,对读加锁,可共享访问,释放锁之后才可进行事务操作,也叫共享锁
一个是控制时序,叫时序锁

队列管理

两种类型的队列: 1、同步队列:当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
2、先进先出队列:队列按照 FIFO方式进行入队和出队操作。

七、ZooKeeper的API操作

create(path, data, flags): 创建一个 znode, path 是其路径,data 是存储在该 ZNode上的数据, flags 常用的有: PERSISTEN, PERSISTENT_SEQUENTAIL, EPHEMERAL,
EPHEMERAL_SEQUENTAIL
delete(path, version): 删除一个 ZNode,可以通过 version删除指定的版本, 如果 version 是-1 的话,表示删除所有的版 本。

exists(path, watch): 判断指定 ZNode是否存在,并设置是否 Watch 这个 ZNode。这里如果要 设置 Watcher 的话, Watcher 是在创建 ZooKeeper 实例时 指定的,如果要设置特定的 Watcher 的话,可以调用另一个重 载版本的 exists(path, watcher)。 以下几个带watch 参数的 API 也都类似 。
getData(path, watch): 读取指定 ZNode 上的数据,并设置是否 watch
这个 ZNode 。
setData(path, watch): 更新指定 ZNode 的数据,并设置是否 Watch 这个 ZNode。
getChildren(path, watch): 获取指定 ZNode 的所有子 ZNode 的名字,并设置是否 Watch 这个 ZNode。
sync(path): 把所有在 sync 之前的更新操作都进行同步,达到每个请求都在半数以上的 ZooKeeper Server 上生 效。
path 参数目前没有用 setAcl(path, acl): 设置指定 ZNode 的 Acl 信息
getAcl(path): 获取指定 ZNode 的 Acl 信息。

八、ZooKeeper原理

集群角色描述
在这里插入图片描述

九、集群选主

ZooKeeper的全新集群选主
以一个简单的例子来说明整个选举的过程:假设有五台服务器组成的 zookeeper 集群,它们 的 serverid 从 1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点 上,都是一样的。假设这些服务器依序启动,来看看会发生什么
1、服务器 1 启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是 LOOKING 状态
2、服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以 id 值较大的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这 个例子中的半数以上是 3),所以服务器1、2 还是继续保持 LOOKING 状态
3、服务器 3 启动,根据前面的理论分析,服务器 3 成为服务器 1,2,3中的老大,而与上面不同的是, 此时有三台服务器(超过半数)选举了它,所以它成为了这次选举的 leader
4、服务器 4启动,根据前面的分析,理论上服务器 4 应该是服务器 1,2,3,4 中最大的,但是 由于前面 已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了
5、服务器 5 启动,同 4 一样,当小弟 总结:zookeeper server 的三种工作状态
LOOKING:当前 Server 不知道 leader 是谁,正在搜寻,正在选举 LEADING:当前 Server 即为选举出来的eader,负责协调事务 FOLLOWING:leader 已经选举出来,当前 Server 与之同步,服从 leader 的命令
ZooKeeper的非全新集群选主
那么,初始化的时候,是按照上述的说明进行选举的,但是当 zookeeper 运行了一段时间之后有机器 down 掉,重新选举时,选举过程就相对复杂了。需要加入数据 version、serverid 和逻辑时钟。
数据 version:数据新的 version 就大,数据每次更新都会更新 version
server id:就是我们配置的 myid 中的值,每个机器一个
逻辑时钟:这个值从 0 开始递增,每次选举对应一个值,也就是说:如果在同一次选举中, 那么这个值应该是一致的;逻辑时钟值越大,说明这一次选举 leader 的进程更新,也就是 每次选举拥有一个zxid,投票结果只取 zxid 最新的
选举的标准就变成:
1、逻辑时钟小的选举结果被忽略,重新投票
2、统一逻辑时钟后,数据 version 大的胜出
3、数据 version 相同的情况下,server id 大的胜出
根据这个规则选出 leader

数据同步

选完 leader 以后,zk 就进入状态同步过程
1、leader 等待 server 连接;
2、follower 连接eader,将最大的 zxid 发送给 leader;
3、leader 根据 follower 的 zxid 确定同步点;
4、完成同步后通知 follower 已经成为 uptodate 状态;
5、follower 收到 uptodate消息后,又可以重新接受 client 的请求进行服务了。 以下是流程图:
在这里插入图片描述

工作流程

Leader工作流程 Leader 主要有三个功能:
1、恢复数据
2、维持与 Learner 的心跳,接收 Learner 请求并判断 Learner 的请求消息类型
Learner 的消息类型主要:
PING 消息:Learner 的心跳信息
REQUEST消息:Follower 发送的提议信息,包括读写请求
ACK消息:Follower对提议的回复,超过半数 Follower通过,则commit 该提议
REVALIDATE 消息:用来延长 SESSION 有效时间
3、根据不同的消息类型,进行不同的处理

Follower工作流程

Follower 主要有四个功能:
1、向 Leader 发送请求(PING 消息、REQUEST 消息、ACK 消息、REVALIDATE 消息)
2、接收 Leader 消息并进行处理
3、接收 Client 的请求,如果为写请求,则转发给 Leader
4、返回 Client 结果 Follower 的消息循环处理如下几种来自 Leader 的消息:
1、PING 消息: 心跳消息
2、PROPOSAL 消息:Leader 发起的提案,要求 Follower 投
3、COMMIT 消息:服务器端最新一次提案的信息
4、UPTODATE消息:表明同步完成
5、REVALIDATE 消息:根据 Leader 的 REVALIDATE 结果,关闭待 revalidate 的session 还是允 许其 接受消息
6、SYNC 消息:返回 SYNC 结果到客户端,这个消息最初由客户端发起,用来强制得到最新 的更新。

Observer工作流程

Observer 流程和 Follower 的唯一不同的地方就是 Observer 不会参加 Leader 发起的投票,也不会被 选举为
Leader,所以不重复描述了

十、底层算法
Paxos算法:Paxos算法一种基于消息传递并且具有高度容错性特性的一致性算法。

在Paxos算法当中有三种角色:
1、决议(value)只有被提议者提出之后才能批准
2、在一次的Paxos算法的执行实例当中,只能批准一个value
3、learner只能获得被批准的value
Paxos算法工作原理:
1、所有的事务请求都必须有一个全局唯一的服务器来进行协调,这个服务器就被称之为leader服务器;剩下的就是follower服务器
2、leader服务器负责将客户端的请求转换成一个事务进行提案,并将改提案分发给所有的集群中的follower服务器。
3、leader服务器需要等待所有的follower服务器的反馈
4、一旦超过半数的follower服务器进行了正确的反馈,那么leader就会再次向所有的follower服务器分发消息,要求将上面的提案进行提交。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值