您的位置首页百科问答

能否用通俗的讲法解释一下什么是Zookeeper?

能否用通俗的讲法解释一下什么是Zookeeper?

的有关信息介绍如下:

能否用通俗的讲法解释一下什么是Zookeeper?

本篇内容主要是对自己最近研究和学习zookeepr的一个总结,包含对zookeeper基本原理、集群运维以及使用过程中一些经验的总结。

(来自阿里淘系后端工程师少千的心得分享,点击头像关注我们,解锁更多阿里工程师一线干货)

——————————————————————————————————————————

Zookeeper是一个高性能、分布式且高效可靠的协调服务框架,基于它可以实现分布式系统中常见的各种服务和应用场景,比如统一配置管理、服务发现、数据同步、名空间、集群管理、分布式锁等等。

Zookeeper是以集群方式对外进行服务提供,一个zookeeper集群中的节点主要可分为三种角色,分别为:Leader、Follower、Observer,其中:

集群Leader的选举,只有leader和follower节点参加,observer既不参加与选举投票也不做投票的响应。一个可运行的zookeeper集群节点数必须要保持为奇数(2n+1台),否则在选举过程中将会产生脑裂(split-brain)问题,无法选出正确Leader。另外,当集群节点中有故障时,也必须保持在n+1台可用,否则在数据变更过程中无法实现过半支持,这样ZK集群将会自动退出,整个服务不可用。

zookeeper系统架构大致为:

下面分别对zookeeper几个核心概念进行简单介绍:

Zookeeper实现数据一致性的主要核心算法,是为Zookeeper专门设计的一种支持崩溃恢复的原子广播协议,主要为高吞吐量、低延迟、健壮、简单的分布式场景设计,不同于通用的分布式一致性算法Paxos(ZAB vs Paxos),协议全称为:Zookeeper原子消息广播协议(ZooKeeper Atmoic Broadcast)。

如图所示,zookeeper数据在内存中是以树形结构方式进行存储,与我们Linux系统的文件系统类似,但所有节点却没有目录和文件的概念,每个节点都统称为ZNode,是zookeeper中的最小数据存储单元,每个znode即可保存数据,也可以挂载子节点,且每个节点都有一个唯一路径名,比如:/app1/p_2。

Zookeeper的数据节点主要分为三类,分别为:持久节点、顺序节点、临时节点;在使用过程中,又可延伸出:顺序持久节点和顺序临时节点。其中,持久节点非常好理解,顾名思义他是一种一旦创建后就可以一直持久存储,除非被主动删除;临时节点,他的生命周期则是与客户端会话息息相关,客户端会话失效,节点也会被同步清除,同时也只能做叶子节点,主要使用场景用于服务发现,机器注册等。

每个节点在创建时,除了存储节点数据内容之外,zookeeper还会每个节点维护一份状态信息,用于描述当前节点的数据大小、子节点数、创建修改时间、事务ID、版本以及子节点版本等等,详见官方文档。同时,对于每个节点数据状态的变化,客户端可以在每个节点(ZNode)上增加监听(watcher)来感知具体的数据变化情况。

Zookeeper Leader选举共有四种算法:UDP协议的LeaderElection、UDP协议FastLeaderElection(包括:授权和非授权两种模式)以及TCP协议FastLeaderElection,在3.4.0版本之后,已废弃了前面三种算法,默认只使用TCP协议版的FastLeaderElection。

选举过程中,zookeeper集群服务器节点中主要有4种状态:

Leader选举主要会发生在两个阶段,分别为:服务器启动时期以及服务器运行期间。在运行期间Leader选举成功后,所有服务器角色一般都不会发生更改,无论是有非Leader机器挂了还是新机器加入,都不会影响到Leader。除非Leader机器挂了,才会触发新一轮的Leader选举,以保证整个集群可继续对外提供服务。

Leader选举涉及术语解释

Leader选举过程,主要包括以下几步骤:

根据规则,在Server1中接收到Server2的投票为(2,0),那么他将会把自己的投票更改为(2,0)然后再重新发出去,那么对于Server2来说无需再更新自己的投票,只需要将上次的投票继续向集群中广播。​

在zookeeper中,所有数据的变更操作都需要转发给Leader进行处理,leader处理完成后再向其他节点进行同步。一次数据的写操作,主要会涉及到以下几个流程:

具体流程如图所示:

读数据的话,直接从所连接的服务器内存进行读取,如图:

Zookeeper服务端的节点数据变化,客户端可以通过注册监听(wathcer)来实现感知,zookeeper会将数据状态的变化以watch事件形式一一通知给注册的客户端。

wathcer可以在每个节点上进行注册,注册方式主要有三种数据操作接口,分别为:获取数据(getData)、获取子节点(getChildren)、判断数据是否存在(exists)。

一个watcher通知事件,主要包含两部分信息:连接状态和事件类型。其中:

同一个事件类型在不同的连接状态中所代表的含义也有所不同,数据相关的事件(NodeCreated、NodeDeleted、NtodeChanged)只有在SyncConnected状态下才会出现。

Watch机制实现,主要有三个过程:客户端注册watcher———>服务端处理watcher——>客户端Callback watcher。主要流程为:

watch事件通知流程大致为:

另外,在使用watch时,需要注意:

参考文献Zookeeper从Paxos到ZookeeperZooKeeper In The Wild

————————————————————————————————————————

阿里巴巴集团淘系技术部官方账号。淘系技术部是阿里巴巴新零售技术的王牌军,支撑淘宝、天猫核心电商以及淘宝直播、闲鱼、躺平、阿里汽车、阿里房产等创新业务,服务9亿用户,赋能各行业1000万商家。我们打造了全球领先的线上新零售技术平台,并作为核心技术团队保障了11次双十一购物狂欢节的成功。详情可查看我们官网:阿里巴巴淘系技术部官方网站

点击下方主页关注我们,你将收获更多来自阿里一线工程师的技术实战技巧&成长经历心得。另,不定期更新最新岗位招聘信息和简历内推通道,欢迎各位以最短路径加入我们。