zookeeper
2021-11-13 17:36:00 32 举报
AI智能生成
Zookeeper是一个开源的分布式协调服务,由雅虎公司创立并贡献给Apache基金会。它是一个为分布式应用提供一致性服务的软件,提供了一项基础服务——分布式同步。它的作用是帮助节点管理它们的数据、配置信息和状态。当一个节点加入集群时,它会向Zookeeper注册自己的身份信息;当节点离开集群时,它会注销自己的身份信息。这样,其他节点就可以知道集群中有哪些节点以及它们的运行状态。Zookeeper还支持一些高级功能,如选举、分布式锁和队列等。总之,Zookeeper是一个非常有用的工具,可以帮助我们更好地管理和协调分布式系统中的各种资源和服务。
作者其他创作
大纲/内容
提供
文件系统
类似文件目录的树形结构,但每个目录都为一个znode,可以<font color="#f15a23"><b>存储1M</b></font>的数据
znode
四种类型
永久节点
永久顺序节点
临时节点
临时顺序节点<br>
内部结构
data
znode存储的数据信息
ACL
记录访问权限,即哪些人或哪些IP可以访问<br>
stat<br>
包含Znode的各种元数据,比如<b><font color="#f68b1f">事务Id</font></b>,<font color="#f68b1f"><b>版本号</b></font>,<b><font color="#f68b1f">时间戳</font></b>,<b><font color="#f68b1f">大小</font></b>等
child
当前节点的子节点引用
通知系统
客户端可以向服务端的某个 Znode 注册一个 <b><font color="#4caf50">Watcher 监听</font></b>,<br>当服务端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通<br>知来实现分布式的通知功能,然后客户端根据 Watcher 通知状态和事件类型做出业务上的改变。<br>
工作机制
<ol><li>客户端注册watch</li><li>服务端处理watch</li><li>客户端回调watch</li></ol>
特性<br>
一次性<br>
<font color="#f15a23"><b>一个watch一旦触发,就会被移除不再执行</b></font><br>
每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。
很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可
客户端串行执行<br>
<font color="#f15a23"><b>客户端watch回调过程,是一个串行同步的过程</b></font><br>
轻量<br>
通知简单,<font color="#f15a23">只通知发生了事件,不告诉具体事件</font><br>
仅仅传递注册事件的布尔值
<font color="#f15a23">无法保证强一致性,只能保证最终一致性</font>
事件-触发
getData
setData<br>
exist
delete
getChildren<br>
create
实现<br>
客户端注册watch
(1)调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象<br>(2)标记请求 request,封装 Watcher 到 WatchRegistration<br>(3)封装成 Packet 对象,发服务端发送 request<br>(4)收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理<br>(5)请求返回,完成注册。
服务端处理watch
服务端接收 Watcher 并存储
接收到客户端请求,处理请求判断是否需要注册 Watcher,<br>需要的话将数据节点的节点路径和 ServerCnxn(ServerCnxn 代表一个客户端和服务端的连接,<br>实现了Watcher 的 process 接口,此时可以看成一个 Watcher 对象)存储在WatcherManager 的 WatchTable 和 watch2Paths 中去。<br>
Watcher 触发
以服务端接收到 setData() 事务请求触发 NodeDataChanged 事件为例:<br>2.1 封装 WatchedEvent<br>将通知状态(SyncConnected)、事件类型(NodeDataChanged)以及节点路径封装成一个 WatchedEvent 对象<br>2.2 查询 Watcher<br>从 WatchTable 中根据节点路径查找 Watcher
调用 process 方法来触发 Watcher;通过 ServerCnxn 对应的 TCP 连接发送 Watcher 事件通知。
客户端回调watch<br>
客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调 Watcher。<br>客户端的 Watcher 机制同样是一次性的,<b>一旦被触发后,该 Watcher 就失效了</b>。
权限控制
UGO(<font color="#f15a23">User,Group,Ohters)</font><br>
在 Linux/Unix 文件系统中使用,也是使用最广泛的权限控制方式。是一种粗粒度的文件系统权限控制模式。
ACL(Access Control List)访问控制列表
三方面
权限模式(Scheme)
(1)IP:从<font color="#f68b1f"> IP 地址</font>粒度进行权限控制<br>(2)Digest:最常用,用类似于 <font color="#f68b1f">username:password</font> 的权限标识来进行权限配置,便于区分不同应用来进行权限控制<br>(3)World:最开放的权限控制方式,是<font color="#f68b1f">一种特殊的 digest 模式,只有一个权限标识“world:anyone”</font><br>(4)Super:<font color="#f68b1f">超级用户</font>
授权对象
权限 Permission
(1)<b>CREATE</b>:数据节点创建权限,允许授权对象在该 Znode 下创建子节点<br>(2)<b>DELETE</b>:子节点删除权限,允许授权对象删除该数据节点的子节点<br>(3)<b>READ</b>:数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等<br>(4)<b>WRITE</b>:数据节点更新权限,允许授权对象对该数据节点进行更新操作<br>(5)<b>ADMIN</b>:数据节点管理权限,允许授权对象对该数据节点进行 ACL 相关设置操作
集群数据同步<br>
分类<br>
直接差异化同步(DIFF 同步)
先回滚再差异化同步(TRUNC+DIFF 同步)
仅回滚同步(TRUNC 同步)
全量同步(SNAP 同步)
概述<br>
开源分布式协调服务<br>
运用场景<br>
数据发布/订阅
及配置中心:发布者发布数据,订阅者订阅数据<br>
实现方式<br>
数据存储:将数据(配置信息)存储到 Zookeeper 上的一个数据节点(<font color="#f15a23"><b>最大1M数据</b></font>)
数据获取:应用在启动初始化节点从 Zookeeper 数据节点读取数据,并在该节点上注册一个数据变更 Watcher
数据变更:当变更数据时,更新 Zookeeper 对应节点数据,Zookeeper会将数据变更通知发到各客户端,客户端接到通知后重新读取变更后的数据即可
负载均衡
zk 的命名服务(文件系统)<br>
通过指定的名字来获取资源或者服务的地址
利用 zk 创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。
分布式协调通知
通过控制台改变某个节点的状态,然后 zk 将这些变化发送给注册了这个节点的 watcher 的所有客户端。
Master选举<br>
Zookeeper 分布式锁(文件系统、通知机制)
Zookeeper 集群管理(文件系统、通知机制)
zk 的配置管理(文件系统、通知机制)
分布式特征<br>
顺序一致性<br>
来自client的更新请求顺序执行
每个更新请求都有一个全局唯一的时间戳(zxid)<br>
原子性
集群中所有节点要么全部执行,要么全都不执行
单一视图
无论client连接的哪个接口,获取的数据都是一致的
可靠性<br>
一旦更新生效,将一直保留,直到再次更改<br>
实时性(最终一致性)<br>
在特定的一段时间内,任何系统的改变都能被客户端看到,或者被监听到
某一时刻可能出现不一致(ZAB协议)
节点增多<br>
读的吞吐会增高,写的吞吐会降低
ZAB协议(原子广播协议)<br>
两种模式
恢复模式
当Leader被选出,且过半节点完成leader同步,就进去广播模式<br>
导致的原因
集群启动
新增节点
leader崩溃<br>
由于网络原因导致 Leader 服务器失去了与过半 Follower 的联系
恢复步骤
1.Leader选举
leader需要满足的要求
1)新选举出来的 Leader 不能包含未提交的 Proposal 。
2)新选举的 Leader 节点中含有最大的 zxid 。
Java版本快速选举算法
1)选 epoch 最大的<br>2)若 epoch 相等,选 zxid 最大的<br>3)若 epoch 和 zxid 相等,选择 server_id 最大的(zoo.cfg中的myid)
2.数据恢复
确保半数follow节点以上,与leader节点数据一致。<br>follow节点约leader比较,丢掉或提交 未提交的proposal
广播模式<br>
Leader已经和过半fellow同步过后就进入广播模式<br>
新增一个节点时,先进入恢复模式,等与leader同步之后该节点也进入广播模式<br>
一直持续该模式,直到leader崩溃或者失去过半fellow,进入恢复模式。<br>
其他<br>
Chroot特性<br>
3.2.0 版本后,添加了 <b>Chroot</b> 特性,<br>该特性允许每个客户端为自己设置一个命名空间。<br><font color="#f15a23"><b><u>如果一个客户端设置了 Chroot,那么该客户端对服务器的任何操作,都将会被限制在其自己的命名空间下。</u></b></font><br>
能够将一个客户端应用于 Zookeeper 服务端的一颗子树相对应
会话管理
角色
Leader
(1)事务请求的<font color="#b71c1c">唯一调度和处理者</font>,保证集群事务处理的顺序性<br>(2)集群内部各服务的调度者
Follow
(1)处理客户端的非事务请求,转发事务请求给 Leader 服务器<br>(2)参与事务请求 Proposal 的投票<br>(3)参与 Leader 选举投票
Observer<br>
(1)3.0 版本以后引入的一个服务器角色,在不影响集群事务处理能力的基础上提升集群的非事务处理能力<br>(2)处理客户端的非事务请求,转发事务请求给 Leader 服务器<br>(3)不参与任何形式的投票
状态
Looking
寻 找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
Following<br>
Leading<br>
Observering<br>
全局事务<br>
当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 server 发出事务执行请求,<br>如果超过半数的机器都能执行并且能够成功,那么就会开始执行。<br>
zxid来标识
zxid 实际上是一个 64 位的数字,<br>高 32 位是 epoch( 时期; 纪元; 世; 新时代)用来标识 leader 周期,如果有新的 leader 产生出来,epoch会自增,<br>低 32 位用来递增计数。
Leader主节点存在的意义,减少重复计算,提升性能<br>
扩容<br>
全部重启
逐个重启<br>
3.5 版本开始支持动态扩容。
java客户端<br>
zookeeper自带,<b>zkClient</b><br>
Apache提供<b>Curator</b><br>
常用命令
ls
get
delete<br>
create
set
Paxos<br>
ZAB 用来构建高可用的分布式数据主备系统(Zookeeper),<br>Paxos 是用来构建分布式一致性状态机系统。<br>
<b style=""><font color="#000000">参考:</font></b><br><font color="#31a8e0">https://thinkwon.blog.csdn.net/article/details/104397719</font><br><font color="#31a8e0">https://www.jianshu.com/p/2bceacd60b8a</font><br><font color="#31a8e0">https://blog.csdn.net/tomato__/article/details/78673365</font><br>
0 条评论
下一页