深入理解Apache ZooKeeper与Kafka的协同工作原理

04-13 1182阅读

目录

引言

一、ZooKeeper基础概念

(一)ZooKeeper简介

(二)ZooKeeper数据结构

(三)ZooKeeper特点

(四)应用场景

二、ZooKeeper工作模式

(一)工作机制

(二)选举机制

1.第一次启动选举机制

2.非第一次启动选举机制

三、搭建zookeeper

(一)准备环境

(二)安装zookeeper

(三)创建启动服务脚本

四、kafka概述

(一)消息队列

1.消息队列的工作原理

2.消息队列的优势

3.消息队列的两种模式

(二)kafka特性

(三)Kafka架构

1.基本组件信息

2.架构细节

(一)安装服务

(二)修改配置文件

(三)创建启动脚本

(四)执行操作

1.创建主题

2.列出所有的主题

3.查看主题详情

4.发布与消费消息

5.修改分区数

6.删除主题

总结


引言

在当今的大数据和微服务领域,消息队列已经成为构建高性能、高可用分布式系统的基石。Apache Kafka作为一个广受欢迎的分布式流处理平台,以其出色的吞吐量、低延迟和持久化特性受到业界青睐。与此同时,Apache ZooKeeper作为分布式协调服务,在Kafka中承担了关键的角色。本文将深度探讨ZooKeeper与Kafka之间的协同工作原理以及他们在构建高效稳定的分布式系统中所发挥的重要作用

一、ZooKeeper基础概念

(一)ZooKeeper简介

ZooKeeper是一种开源的分布式协调服务,由雅虎开发并捐赠给Apache软件基金会。它采用了一种简单易懂的数据模型,即类似于文件系统的树形结构,称为ZNode。每个ZNode可以存储少量的数据,并且支持监听机制(Watch)。此外,ZooKeeper特别强调强一致性,保证了在整个集群中的所有更新操作具有全局有序性。

(二)ZooKeeper数据结构

在ZooKeeper的世界里,数据以ZNode的形式存在,每个ZNode有唯一的路径标识符(Path),并且可以设置为持久化或临时两种类型。持久化节点在创建后不会因为客户端会话结束而消失,而临时节点则会在创建它的会话关闭时自动删除。同时,ZNode还支持版本控制,每次更新都会增加版本号,便于实现条件更新和乐观锁

(三)ZooKeeper特点

ZooKeeper具有以下显著特点:

数据一致性: ZooKeeper提供了一致性保证,保证客户端在任何时刻都能看到相同的数据视图。它通过ZAB协议(ZooKeeper Atomic Broadcast)确保了更新操作的原子性和顺序一致性。

单一系统映像: 所有ZooKeeper集群中的节点都维护了一份相同的数据副本,客户端不论连接到集群中的哪个服务器,都能得到一致的数据视图。

高可用性: ZooKeeper通过Leader-Follower模型实现高可用,当Leader节点失效时,剩余的Follower节点可以通过选举产生新的Leader,确保服务连续性。

有序性: ZooKeeper保证来自同一个客户端的更新请求将严格按照客户端发送的顺序进行处理,这包括全局有序和偏序。

原子性: ZooKeeper的更新操作要么全部成功,要么全部失败,不存在部分成功的中间状态。

简单API: ZooKeeper提供了简单易用的API,允许开发者执行基本操作,如创建、读取、更新和删除节点,以及设置Watcher监听器。

分布式协调服务: ZooKeeper被设计为分布式协调服务,可以实现分布式锁服务、领导者选举、组成员管理、分布式队列和命名服务等功能。

快速响应: ZooKeeper系统设计的目标之一是提供快速响应,尤其适用于那些需要近乎实时响应的分布式应用。

容错性: ZooKeeper具有良好的容错能力,通过仲裁机制(quorum)确保在大多数节点存活的情况下依然能够对外提供服务。

(四)应用场景

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

统一命名服务

在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。

统一配置管理

分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上。

配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦 Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。

集群管理

ZooKeeper可以维护集群成员信息,比如在Hadoop、Kafka等系统中,节点可以将自己的在线状态、角色等信息写入ZooKeeper,其他节点可以实时监控这些信息,从而实现集群的动态管理和扩容缩容。

服务器动态上下线

客户端能实时洞察到服务器上下线的变化。

软负载均衡

在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。

服务注册与发现

微服务架构中,服务提供者可以将自己的服务信息注册到ZooKeeper,服务消费者通过查询ZooKeeper发现可用的服务实例,从而实现服务的动态注册和发现。

二、ZooKeeper工作模式

(一)工作机制

ZooKeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储与管理数据信息,通过Watch机制,客户端可以在读取数据或查询子节点时设置Watch,当所关注的数据发生变化时,ZooKeeper会立即通知客户端,使得客户端能够做出相应的反应。

(二)选举机制

只要服务器的票数超过半数以上,该服务器就当选为leader。所以一般服务器数量为大于等于3的奇数量,如3、5、7

1.第一次启动选举机制

深入理解Apache ZooKeeper与Kafka的协同工作原理

1.1 服务器1启动,发起一次选举

服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;

1.2 服务器2启动,再发起一次选举

服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING

1.3 服务器3启动,发起一次选举

此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;

1.4 服务器4启动,发起一次选举

此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;

1.5 服务器5启动,同服务器4一样

2.非第一次启动选举机制

当ZooKeeper 集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:

服务器初始化启动。

服务器运行期间无法和Leader保持连接。

2.2 而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态:

① 集群中本来就已经存在一个Leader

对于已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和 Leader机器建立连接,并进行状态同步即可。

② 集群中确实不存在Leader

假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且此时SID为3的服务器是Leader。某一时刻,3和5服务器出现故障,因此开始进行Leader选举。

选举Leader规则:

1.EPOCH大的直接胜出
2.EPOCH相同,事务id大的胜出
3.事务id相同,服务器id大的胜出
SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每
台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑速度有关。
Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。
       每投完一次票这个数据就会增加

三、搭建zookeeper

环境准备

IP地址主机名安装服务
192.168.83.70zkfkf-1apache-zookeeper-3.5.7
192.168.83.80zkfkf-2apache-zookeeper-3.5.7
192.168.83.90zkfkf-3apache-zookeeper-3.5.7

(一)准备环境

关闭防火墙及核心防护

systemctl stop firewalld  &&  setenforce 0

安装JDK环境

深入理解Apache ZooKeeper与Kafka的协同工作原理

#!/bin/bash
#指定该脚本使用的shell解释器为bash。
JAVA=`find / -name *jdk*tar* -exec dirname {} \;`
#使用find命令搜索整个根目录下(/)所有包含“jdk”和“tar”字样的文件,并获取它们所在的目录路径
@这里通过dirname获取每个匹配文件的父目录。
JDK=`find / -name *jdk*tar* 2>>/dev/null | awk -F/ '{print $NF}'` 
#查找并筛选出包含“jdk”和“tar”的完整文件名,将标准错误重定向到/dev/null忽略错误信息,
#并使用awk分割目录路径,打印出文件名的最后一部分(即完整的JDK压缩包文件名)。
cd ${JAVA}
#改变当前工作目录到找到的包含JDK压缩包的目录。
tar xf ${JDK} -C /usr/local/
#使用tar命令解压找到的JDK压缩包至/usr/local/目录下。
JDKAPP=$(find /usr/local/ -maxdepth 1 -type d | grep jdk | awk -F/ '{print $NF}'): 
#在/usr/local/目录下查找一级子目录(最大深度为1)中包含“jdk”的目录名,
#然后同样使用awk取出最后一个字段作为JDK的实际安装目录名。
ln -s /usr/local/${JDKAPP} /usr/local/jdk
#创建一个符号链接(软链接),将实际的JDK安装目录指向/usr/local/jdk,这样可以方便引用。
cat > /etc/profile.d/jdk.sh 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]