一、动物园管理员介绍

Zookeeper是一个开源的分布式协调服务,目前由Apache维护。Zookeeper可以用来实现分布式系统中的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、主机选举、分布式锁和分布式队列等常见功能。它具有以下特征:

顺序一致性 :从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到Zookeeper中;原子性 :所有事务请求的处理结果在整个集群中所有机器上都是一致的;不存在部分机器应用了该事务,而另一部分没有应用的情况;单一视图 :所有客户端看到的服务端数据模型都是一致的;可靠性 :一旦服务端成功应用了一个事务,则其引起的改变会一直保留,直到被另外一个事务所更改;实时性 :一旦一个事务被成功应用后,Zookeeper可以保证客户端立即可以读取到这个事务变更后的最新状态的数据。

第二,动物园管理员的设计目标

Zookeeper致力于为那些具有高吞吐量的大型分布式系统提供高性能、高可用性和严格顺序访问控制能力的分布式协调服务。它有以下四个目标:

2.1目标1:简单的数据模型

Zookeeper通过树形结构存储数据,树形结构由一系列称为ZNode的数据节点组成,类似于常见的文件系统。但是,与普通文件系统不同,Zookeeper将全部数据存储在内存中,以实现高吞吐量,减少访问延迟。

2.2目标2:建立集群

动物园管理员集群可以由一组动物园管理员服务组成。集群中的每台机器都会在内存中维护自己的状态,每台机器保持通信。只要集群中有一半的机器可以正常工作,整个集群就可以正常提供服务。

2.3目标3:连续访问

对于来自客户端的每个更新请求,Zookeeper将分配一个全局唯一的增量标识,它反映了所有事务请求的顺序。

2.4目标4:高性能和高可用性

ZooKeeper将全部数据存储在内存中以保持高性能,并通过服务集群实现高可用性。因为Zookeeper的所有更新和删除都是基于事务的,所以在读多写少的应用场景下性能很高。

三、核心概念

3.1集群角色

动物园管理员集群中的机器分为以下三个角色:

Leader :为客户端提供读写服务,并维护集群状态,它是由集群选举所产生的;Follower :为客户端提供读写服务,并定期向Leader汇报自己的节点状态。同时也参与写操作“过半写成功”的策略和Leader的选举;Observer :为客户端提供读写服务,并定期向Leader汇报自己的节点状态,但不参与写操作“过半写成功”的策略和Leader的选举,因此Observer可以在不影响写性能的情况下提升集群的读性能。

3.2会议

Zookeeper客户端通过TCP长连接连接到服务集群,从第一次连接开始就建立了session,然后通过心跳检测机制维护有效的Session状态。通过这种连接,客户端可以发送请求和接收响应,还可以接收监视事件的通知。

会话中的另一个核心概念是会话超时。当连接因网络故障或客户端主动断开而断开时,只要在会话超时内重新建立连接,先前创建的会话仍然有效。

3.3数据节点

Zookeeper数据模型是由一系列基本数据单元Znode组成的节点树,其中根节点为/。每个节点将保存自己的数据和节点信息。动物园管理员中的节点可以分为两类:

持久节点 :节点一旦创建,除非被主动删除,否则一直存在;临时节点 :一旦创建该节点的客户端会话失效,则所有该客户端创建的临时节点都会被删除。

临时节点和持久节点都可以添加一个特殊属性:SEQUIRED,它指示节点是否有增量属性。如果指定了此属性,则创建节点时,Zookeeper会自动在节点名称后附加一个由父节点维护的增量号。

3.4节点信息

在存储数据时,每个ZNode节点都维护一个名为Stat的数据结构,该结构存储关于该节点的所有状态信息。如下:

3.5观察者

Zookeeper中一个常见的功能是Watcher,它允许用户在指定的节点上注册和监听感兴趣的事件。当事件发生时,侦听器将被触发,并将事件信息推送到客户端。该机制是动物园管理员实现分布式协调服务的重要特征。

3.6前交叉韧带

Zookeeper使用ACL策略来控制权限,类似于UNIX文件系统。它定义了以下五种权限:

CREATE :允许创建子节点;READ :允许从节点获取数据并列出其子节点;WRITE :允许为节点设置数据;DELETE :允许删除子节点;ADMIN :允许为节点设置权限。

四.ZAB协议

4.1 ZAB协议和数据一致性

ZAB协议是一个原子广播协议,由动物园管理员专门设计来支持崩溃恢复。通过该协议,Zookeepe基于主从模式的系统架构,维护集群中所有副本之间的数据一致性。具体如下:

Zookeeper使用单个主进程接收和处理来自客户端的所有事务请求,并使用原子广播协议以事务提案的形式向所有副本进程广播数据状态更改。如下图:

具体流程如下:

所有事务请求必须由唯一的Leader服务处理,该服务将事务请求转换为事务建议,并将建议分发给群集中的所有跟随者服务。如果有一半的跟随者服务给出了正确的反馈,领导者将再次向所有跟随者发送提交消息,要求他们提交之前的提案。

4.2协议的内容

ZAB协议包括两种基本模式,即崩溃恢复和消息广播:

1.故障修复

当整个服务框架处于启动过程中,或者Leader服务器出现异常时,ZAB协议将进入恢复模式,通过半选机制生成新的Leader。之后,其他机器将从新的Leader同步状态。当超过一半的机器完成状态同步时,它们将退出恢复模式并进入消息广播模式。

2.信息广播

ZAB协议的消息广播过程使用原子广播协议。在消息的整个广播过程中,Leader服务器将为每个事务请求生成相应的提案,并为其分配一个全局唯一的增量事务标识,然后广播它。具体流程如下:

领导者服务将为每个跟随者服务器分配一个单独的队列,然后依次将事务提案放入队列,并根据先进先出策略发送消息。收到建议后,跟随者服务会以事务日志的形式将其写入本地磁盘,并在成功写入后向领导者反馈确认响应。当领导者收到一半以上的追随者确认响应时,它会向所有追随者广播一条提交消息,通知他们提交事务,然后领导者自己完成事务的提交。每个跟随者在收到提交消息后完成事务的提交。

V.动物园管理员的典型应用场景

5.1数据的发布/订阅

数据发布/订阅系统通常用作配置中心。在分布式系统中,您可能有数千个服务节点。如果要改变所有服务的某个配置,因为数据节点太多,不要一一修改,设计上采用统一的配置中心。之后发布者只需要将新的配置发送到配置中心,所有服务节点就可以自动下载更新,实现配置的集中管理和动态更新。

Zookeeper可以通过Watcher机制发布和订阅数据。分布式系统的所有服务节点都可以注册监听一个ZNode,然后只需要将新的配置写入ZNode,所有服务节点都会收到该事件。

5.2命名服务

在分布式系统中,通常需要一个全局唯一的名称,如生成一个全局唯一的订单号等。Zookeeper可以通过顺序节点的特性生成一个全局唯一的ID,从而为分布式系统提供命名服务。

5.3总选举

分布式系统的一种重要模式是主从模式。动物园管理员可以在这种模式下用于Matser选举。所有服务节点都可以竞争性地创建相同的ZNode。由于Zookeeper不能有相同路径的ZNode,因此只能成功创建一个服务节点,这样服务节点就可以成为主节点。

5.4分布式锁

分布式锁可以通过Zookeeper的临时节点和Watcher机制来实现。这里,以排他锁为例来说明:

分布式系统的所有服务节点可以竞争地创建相同的临时节点。因为Zookeeper不能有相同路径的ZNode,所以只能成功创建一个服务节点。此时可以认为这个节点已经获得了锁。其他没有获得锁的服务节点注册并监听ZNode,然后在锁被释放时竞争获得锁。锁可以通过以下两种方式释放:

当正常执行完业务逻辑后,客户端主动将临时ZNode删除,此时锁被释放;当获得锁的客户端发生宕机时,临时ZNode会被自动删除,此时认为锁已经释放。

当锁被释放时,其他服务节点再次竞争创建,但每次只能有一个服务节点获得锁,这就是独占锁。

5.5集群管理

Zookeeper还可以解决大多数分布式系统中的问题:

如可以通过创建临时节点来建立心跳检测机制。如果分布式系统的某个服务节点宕机了,则其持有的会话会超时,此时该临时节点会被删除,相应的监听事件就会被触发。分布式系统的每个服务节点还可以将自己的节点状态写入临时节点,从而完成状态报告或节点工作进度汇报。通过数据的订阅和发布功能,Zookeeper还能对分布式系统进行模块的解耦和任务的调度。通过监听机制,还能对分布式系统的服务节点进行动态上下线,从而实现服务的动态扩容。

1.《zookeeper 大神分享,十分钟深入了解ZooKeeper核心概念》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《zookeeper 大神分享,十分钟深入了解ZooKeeper核心概念》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/caijing/1773754.html