Zookeeper部分
文章目录
- Zookeeper部分
- 1.ZooKeeper 是什么?
- 2.ZooKeeper 提供了什么?
- 3.Zookeeper 怎么保证主从节点的状态同步? (Zab)
- 4.Zab 和 Paxos 算法的联系与区别?
- 5.zookeeper 是如何保证事务的顺序一致性的?
- 6.服务器角色
- 7.Zookeeper 下 Server 工作状态
- 8.分布式集群中为什么会有 Master主节点?
- 9.集群最少要几台机器,集群规则是怎样的?集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?
- 10.集群支持动态添加机器吗?
- 11.zk 节点宕机会发生什么?
- 12. Zookeeper 有哪几种几种部署模式?
- 13.ACL 权限控制机制
- 14.Chroot 特性
- 12.会话管理
- 13.数据同步
- 14.说一下 Zookeeper 的通知机制?
- 15.chubby 是什么,和 zookeeper 比你怎么看?
- 16.说几个 zookeeper 常用的命令。
- 17.Zookeeper 的典型应用场景
- 18.Zookeeper 都有哪些功能?
- 19.Zookeeper 的 java 客户端都有哪些?
- 20.Zookeeper 和 Dubbo 的关系?
1.ZooKeeper 是什么?
ZooKeeper是一个开源的分布式应用程序协调服务,是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zookeeper 实现诸如命名服务、配置管理、集群管理、Master 选举、分布式锁和队列管理等功能。设计目的是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
2.ZooKeeper 提供了什么?
2.1 文件系统
1)每个子目录项都被称作为 znode,和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
2)有四种类型的znode
①PERSISTENT-持久节点
除非手动删除,否则节点一直存在于 Zookeeper 上
②EPHEMERAL-临时节点
临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与 zookeeper 连接断开不一定会话失效),那么这个客户端创建的所有临时节点 都会被移除。
③PERSISTENT_SEQUENTIAL-持久顺序节点
基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维 护的自增整型数字。
④EPHEMERAL_SEQUENTIAL-临时顺序节点
基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的 自增整型数字。
2.2 通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(data update、data delete、children add、children delete)时,zookeeper会通知客户端。
1)watcher特性
①一次性
无论是服务端还是客户端,一旦一个 Watcher 被 触 发 ,Zookeeper 都会将其 从相应的存储中移除,这样的设计有效的减轻了服务端的压力。
②串行
客户端watcher回调的过程是一个串行同步的过程,这为我们保证了顺序。
③轻量
Watcher 通知非常简单,只会告诉客户端发生了事件,而不会说明事件的 具体内容。
④最终一致性
watcher event 异步发送 watcher 的通知事件从 server 发送到 client 是异步的,不同的客户端和服务器之间通过 socket 进行通信,由于网络延迟或其他因素导致客户端在不同的时刻监听到事件。
⑤客户端注册watcher
(1)调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象;
(2)标记请求 request,封装 Watcher 到 WatchRegistration;
(3)封装成 Packet 对象,发服务端发送 request;
(4)收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理;
(5)请求返回,完成注册。
⑥服务端处理 Watcher
(1)服务端接收 Watcher 并存储
接收到客户端请求,处理请求判断是否需要注册 Watcher,需要的话将数据节点的节点路径和 ServerCnxn(ServerCnxn 代表一个客户端和服务端的连接, 实现了 Watcher 的 process 接口,此时可以看成一个 Watcher 对象)存储在 WatcherManager 的 WatchTable 和 watch2Paths 中去。
(2)Watcher 触发
以服务端接收到 setData() 事务请求触发 NodeDataChanged 事件为例:
a.封装 WatchedEvent 将通知状态(SyncConnected)、事件类型(NodeDataChanged)以及节点 路径封装成一个 WatchedEvent 对象
b.查询 Watcher 从 WatchTable 中根据节点路径查找 Watcher
- 没找到;说明没有客户端在该数据节点上注册过 Watcher
- 找到;提取并从 WatchTable 和 Watch2Paths 中删除对应 Watcher(从 这里可以看出 Watcher 在服务端是一次性的,触发一次就失效了)
c.调用 process 方法来触发 Watcher 这里 process 主要就是通过 ServerCnxn 对应的 TCP 连接发送 Watcher 事件 通知。
⑦客户端回调watcher
客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调 Watcher。
客户端的 Watcher 机制同样是一次性的,一旦被触发后,该 Watcher 就失效 了。
⑧当一个客户端连接到一个新的服务器上时,watch 将会被以任意会话事件触发。当与一个服务器失去连接的时候,是无法接收到 watch 的。而当 client 重新连接时,如果需要的话,所有先前注册过的 watch,都会被重新注册。通常这是完全透明的。只有在一个特殊情况下,watch 可能会丢失:对于一个未创建的 znode的 exist watch,如果在客户端断开连接期间被创建了,并且随后在客户端连接上之前又删除了,这种情况下,这个 watch 事件可能会被丢失。
3.Zookeeper 怎么保证主从节点的状态同步? (Zab)
zookeeper 的核心是原子广播机制,这个机制保证了各个 server 之间的同步。 实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模 、式和广播模式。
1)恢复模式
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出 来,且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了。状 态同步保证了 leader 和 server 具有相同的系统状态。
2)广播模式
一旦 leader 已经和多数的 follower 进行了状态同步后,它就可以开始广播消息了,即进入广播状态。这时候当一个 server 加入ZooKeeper 服务中,它会在恢复模式下启动,发现 leader,并和 leader 进行状态同步。待到同步结束,它也参与消息广播。ZooKeeper 服务一直维持在广播状态,直到 leader 崩溃了或者 leader 失去了大部分的 followers 支持。
4.Zab 和 Paxos 算法的联系与区别?
1)相同点:
①两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行
② Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提案进行提交
③ ZAB 协议中,每个 Proposal 中都包含一个 epoch 值来代表当前的 Leader周期,Paxos 中名字为 Ballot
2)不同点:
Paxos是二阶段提交(2PC),Zab是三阶段提交(3PC)
①CanCommit事务询问(Paxos、Zab)
②PreCommit同步阶段,新的Leader会确保存在过半的Follower已经提交了之前Leader周期中的所有事务Proposal。(Zab)
③doCommit执行提交(Paxos、Zab)
Zab 用来构建高可用的分布式数据主备系统(Zookeeper),Paxos 是用来构建分布式一致性状态机系统。
5.zookeeper 是如何保证事务的顺序一致性的?
zookeeper 采用了全局递增的事务 Id 来标识,所有的 proposal(提议)都在被提出的时候加上了 zxid,zxid 实际上是一个 64 位的数字,高 32 位是epoch用来标识 leader 周期,如果有新的 leader 产生出来,epoch会自增,低 32 位用来递增计数。当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。
6.服务器角色
1)Leader
- 事务请求的唯一调度和处理者,保证集群事务处理的顺序性
- 集群内部各服务的调度者
2)Follower
- 处理客户端的非事务请求,转发事务请求给 Leader 服务器
- 参与事务请求 Proposal 的投票
- 参与 Leader 选举投票
3)Observer
- 3.0 版本以后引入的一个服务器角色,在不影响集群事务处理能力的基础上提升集群的非事务处理能力
- 处理客户端的非事务请求,转发事务请求给 Leader 服务器
- 不参与任何形式的投票
7.Zookeeper 下 Server 工作状态
服务器具有四种状态,分别是 LOOKING、FOLLOWING、LEADING、 OBSERVING。
1)LOOKING:寻找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
2)FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。
3)LEADING:领导者状态。表明当前服务器角色是 Leader。
4)OBSERVING:观察者状态。表明当前服务器角色是 Observer。
8.分布式集群中为什么会有 Master主节点?
在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,于是就需要进行 leader 选举。
9.集群最少要几台机器,集群规则是怎样的?集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?
集群规则为 2N+1 台,N>0,即 3 台。可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。
10.集群支持动态添加机器吗?
其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式:
全部重启:关闭所有 Zookeeper 服务,修改配置之后启动。不影响之前客户端的会话。
逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。
3.5 版本开始支持动态扩容。
11.zk 节点宕机会发生什么?
Zookeeper 本身也是集群,推荐配置2n+1(n>0)服务器。Zookeeper 自身也要保证当一个节点宕机时,其他节点会继续提供服务。
如果是一个 Follower 宕机,还有 2 台服务器提供访问,因为 Zookeeper 集群有一致性,数据并不会丢失;
如果是一个 Leader 宕机,Zookeeper 会选举出新的 Leader。
ZK 集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在 ZK节点挂得太多,只剩一半或不到一半节点能工作,集群才失效。
12. Zookeeper 有哪几种几种部署模式?
Zookeeper 有三种部署模式:
-
单机部署:一台集群上运行;
-
集群部署:多台集群运行;
-
伪集群部署:一台集群启动多个 Zookeeper 实例运行。
13.ACL 权限控制机制
1)常用schema
①world
id(验证模式)为world:anyone,对所有人有权限
②digest
id为username:BASE64(SHA1(password))
③ip
id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段,也可以设置为某一个具体的ip
2)permission(crwda)
zookeeper目前支持下面一些权限:
CREATE: 创建权限,可以在在当前node下创建child node,即对子节点Create操作
DELETE: 删除权限,可以删除当前的node,即对子节点Delete操作
READ: 读权限,可以获取当前node的数据,可以list当前node所有的child nodes,即对本节点GetChildren和GetData操作
WRITE: 写权限,可以向当前node写数据,即对本节点SetData操作
ADMIN: 管理权限,可以设置当前node的permission,即对本节点setAcl操作
14.Chroot 特性
3.2.0 版本后,添加了 Chroot 特性,该特性允许每个客户端为自己设置一个命名空间。如果一个客户端设置了 Chroot,那么该客户端对服务器的任何操作,都将会被限制在其自己的命名空间下。
通过设置 Chroot,能够将一个客户端应用于 Zookeeper 服务端的一颗子树相对应,在那些多个应用公用一个 Zookeeper 进群的场景下,对实现不同应用间的相互隔离非常有帮助。
12.会话管理
分桶策略:将类似的会话放在同一区块中进行管理,以便于 Zookeeper 对会话进行不同区块的隔离处理以及同一区块的统一处理。分配原则:每个会话的“下次超时时间点”(ExpirationTime)
计算公式:
ExpirationTime_ = currentTime + sessionTimeout
ExpirationTime = (ExpirationTime_ / ExpirationInrerval + 1) *
ExpirationInterval , ExpirationInterval 是指 Zookeeper 会话超时检查时间间隔,默认 tickTime
13.数据同步
不同的场景,会有不同的数据同步方式,具体选择哪种方式,还需要参考以下三个参数,根据这三个参数的大小对比结果,选择对应的数据同步方式。
- peerLastZxid:Learner服务器(Follower或observer)最后处理的zxid。
- minCommittedLog:Leader服务器proposal缓存队列committedLog中的最小的zxid。
- maxCommittedLog:Leader服务器proposal缓存队列committedLog中的最大的zxid。
Zookeeper中数据同步一共有四类,如下。
- DIFF:直接差异化同步
minCommittedLog < peerLastZxid < maxCommittedLog。 - TRUNC+DIFF:先回滚再差异化同步
老leader宕机未写入,重新上线后,新leader会回滚老leader后再同步。 - TRUNC:仅回滚同步
peerLastZxid > maxCommittedLog。 - SNAP:全量同步
1)peerLastZxid < minCommittedLog
2)learner宕机后,再上线时,且leader此时没有提议。
14.说一下 Zookeeper 的通知机制?
client 端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些 client 会收到 zk 的通知,然后 client 可以根据 znode 变化来做出业务上的改变等。
15.chubby 是什么,和 zookeeper 比你怎么看?
chubby 是 google 的,完全实现 paxos 算法,不开源。zookeeper 是 chubby的开源实现,使用 zab 协议,paxos 算法的变种。
16.说几个 zookeeper 常用的命令。
常用命令:ls get set create delete 等。
17.Zookeeper 的典型应用场景
利用 ZooKeeper 可以非常方便构建一系列分布式应用中都会涉及到的核心功能。
数据发布/订阅
负载均衡
命名服务
分布式协调/通知
集群管理
Master 选举
分布式锁
分布式队列
多个开源项目中都应用到了 ZooKeeper,例如 HBase, Spark, Flink, Storm, Kafka, Dubbo 等等。
18.Zookeeper 都有哪些功能?
1)集群管理:监控节点存活状态、运行请求等;
2)主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 Zookeeper 可以协助完成这个过程;
3)分布式锁:Zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。Zookeeper 可以对分布式锁进行控制。
4)命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。
19.Zookeeper 的 java 客户端都有哪些?
java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator。
20.Zookeeper 和 Dubbo 的关系?
Dubbo引入Zookeeper作为存储媒介,也就把ZooKeeper的特性引进来:
负载均衡、资源同步、命名服务。