Kafka06-基础-尚硅谷
2-Kafka基础
文章目录
- 2-Kafka基础
- @[toc]
- 2.1 Kafka简介
- 2.1.1 Kafka借鉴了JMS规范的思想,但并未完全遵循JMS规范
- 2.1.2 Kafka的应用场景
- 2.2 Kafka集群部署
- 2.2.1 集群部署概述
- 2.2.2 解压文件
- 2.2.3 安装ZooKeeper
- 2.2.4 安装Kafka
- 2.2.5 封装启动脚本
- 2.3 Kafka核心组件
- 2.3.1 代理:Broker
- 2.3.2 控制器:Controller
- 2.3.3 主题:Topic
- 2.3.4 分区:Partition
- 2.3.5 副本:Replication
- 2.3.6 日志:Log
- 2.4 创建主题
- 2.4.1 创建主题的方式
- 2.4.2 创建第一个主题
- 2.4.3 创建第二个主题
- 2.4.4 创建第三个主题
- 2.4.5 创建主题流程
- 2.5 生产消息
- 2.5.1 生产消息的基本步骤
- 2.5.2 生产消息的基本代码
- 2.5.3 发送消息
- 2.5.4 消息分区
- 2.5.5 消息可靠性
- 2.5.6 消息去重与有序
- 2.6 存储消息
- 2.6.1 存储组件
- 2.6.2 数据存储流程
- 2.6.3 存储文件格式
- 2.6.4 数据刷写
- 2.6.5 副本同步
- 2.6.6 数据一致性
- 2.7 消费消息
- 2.7.1 消费消息的基本步骤
- 2.7.2 消费消息的基本代码
- 2.7.3 消费消息的基本原理
文章目录
- 2-Kafka基础
- @[toc]
- 2.1 Kafka简介
- 2.1.1 Kafka借鉴了JMS规范的思想,但并未完全遵循JMS规范
- 2.1.2 Kafka的应用场景
- 2.2 Kafka集群部署
- 2.2.1 集群部署概述
- 2.2.2 解压文件
- 2.2.3 安装ZooKeeper
- 2.2.4 安装Kafka
- 2.2.5 封装启动脚本
- 2.3 Kafka核心组件
- 2.3.1 代理:Broker
- 2.3.2 控制器:Controller
- 2.3.3 主题:Topic
- 2.3.4 分区:Partition
- 2.3.5 副本:Replication
- 2.3.6 日志:Log
- 2.4 创建主题
- 2.4.1 创建主题的方式
- 2.4.2 创建第一个主题
- 2.4.3 创建第二个主题
- 2.4.4 创建第三个主题
- 2.4.5 创建主题流程
- 2.5 生产消息
- 2.5.1 生产消息的基本步骤
- 2.5.2 生产消息的基本代码
- 2.5.3 发送消息
- 2.5.4 消息分区
- 2.5.5 消息可靠性
- 2.5.6 消息去重与有序
- 2.6 存储消息
- 2.6.1 存储组件
- 2.6.2 数据存储流程
- 2.6.3 存储文件格式
- 2.6.4 数据刷写
- 2.6.5 副本同步
- 2.6.6 数据一致性
- 2.7 消费消息
- 2.7.1 消费消息的基本步骤
- 2.7.2 消费消息的基本代码
- 2.7.3 消费消息的基本原理
2.1 Kafka简介
2.1.1 Kafka借鉴了JMS规范的思想,但并未完全遵循JMS规范
Kafka借鉴了JMS规范的思想,但并未完全遵循JMS规范,其内部有很多用于数据传输的组件对象,这些组件对象组合在一起实现高效的数据传输。
2.1.2 Kafka的应用场景
Kafka最初的应用场景是日志场景或MQ场景,扮演着日志传输和存储系统的角色。
2.2 Kafka集群部署
2.2.1 集群部署概述
生产环境通常采用Linux系统搭建服务器集群,但为了学习Kafka的基础概念和核心组件,可以搭建一个简单易用的Windows集群。
2.2.2 解压文件
- 在磁盘根目录创建文件夹
cluster
,文件夹名称不要太长。 - 将Kafka安装包
kafka-3.6.1-src.tgz
解压缩到kafka
文件夹。
2.2.3 安装ZooKeeper
- 将解压缩的文件作为ZooKeeper软件使用,修改文件夹名为
kafka-zookeeper
。 - 修改
config/zookeeper.properties
文件,配置数据存储目录、端口号等参数。
2.2.4 安装Kafka
- 将解压缩的文件复制多份,分别改名为
kafka-node-1
、kafka-node-2
、kafka-node-3
等。 - 修改每个节点的
config/server.properties
配置文件,设置不同的broker.id
、端口号、数据存储目录等参数。
2.2.5 封装启动脚本
- 创建批处理文件
zk.cmd
和kfk.cmd
,分别用于启动ZooKeeper和Kafka节点。 - 创建
cluster.cmd
批处理文件,用于启动整个Kafka集群。 - 创建
cluster-clear.cmd
批处理文件,用于清理和重置Kafka数据。
2.3 Kafka核心组件
2.3.1 代理:Broker
- Kafka服务进程称为Kafka Broker或Kafka Server。
- 在Kafka集群中,每个服务节点都是一个Broker,每个Broker都有一个唯一的全局ID,称为
broker.id
。
2.3.2 控制器:Controller
- Kafka采用主从架构,从多个Broker中选举一个作为Controller,负责管理和协调整个Kafka集群。
- Controller的基本功能包括Broker管理、Topic管理、Partition管理、数据服务等。
- 如果Controller节点出现故障,Kafka会依托于ZooKeeper选举其他节点作为新的Controller,实现高可用。
2.3.3 主题:Topic
- Topic是Kafka中消息的逻辑分类,生产者将消息发送到某个Topic,消费者从某个Topic中获取消息。
- Kafka集群中可以存放多个Topic的消息数据。
2.3.4 分区:Partition
- 为了解决单一Topic的负载问题,Kafka将Topic从物理上分成多个Partition,每个Partition是一个有序的队列。
- 每个Partition用一个编号进行标记,从0开始的连续整数。
- Partition是物理上的概念,以数据文件的方式真实存在。
2.3.5 副本:Replication
- 为了防止数据丢失,Kafka为每个Partition设置多个副本,称为Replication。
- 副本分为Leader副本和Follower副本,只有Leader副本才能进行数据的读写,Follower副本只做备份使用。
2.3.6 日志:Log
- Kafka将接收到的消息数据存储在Log日志文件中,底层存储数据的文件扩展名为
.log
。 - Topic创建后,会创建对应的Partition数据Log日志,并打开文件连接通道,随时准备写入数据。
2.4 创建主题
2.4.1 创建主题的方式
- 可以通过命令行、工具、客户端API、自动创建等方式创建主题。
- 重点介绍命令行方式创建主题。
2.4.2 创建第一个主题
- 执行指令创建主题,仅指明主题名称,其他参数采用默认值。
- 创建主题后,会在ZooKeeper中增加相应的节点,记录主题相关配置信息。
- 主题数据存储在副本所在的Broker节点上。
2.4.3 创建第二个主题
- 创建主题时,设定分区参数
--partitions
,参数值为3,表示创建3个分区。 - 每个分区会均匀分配到不同的Broker节点上。
2.4.4 创建第三个主题
- 创建主题时,设定副本参数
--replication-factor
,参数值为3,表示每个分区创建3个副本。 - 副本会均匀分配到不同的Broker节点上,确保数据的可靠性和可用性。
2.4.5 创建主题流程
- 命令行提交创建指令,客户端处理指令并校验参数。
- Controller接收创建主题请求,进行主题创建操作。
- 在ZooKeeper中创建相应的节点,记录主题配置信息。
- Controller节点启动后,会在
/brokers/topics
节点增加监听器,触发相应的功能。
2.5 生产消息
2.5.1 生产消息的基本步骤
- 创建Map类型的配置对象,增加相应的配置属性,如集群地址、序列化类等。
- 创建待发送数据,封装为指定的数据模型。
- 创建生产者对象,发送数据。
- 关闭生产者连接。
2.5.2 生产消息的基本代码
- 提供Java代码示例,演示如何使用Kafka Producer API生产数据。
2.5.3 发送消息
- 拦截器:允许在数据发送前进行统一处理,如校验、整合数据等。
- 回调方法:用于对数据的发送结果进行处理。
- 异步发送:生产者将数据放入缓冲区后,无需等待后续发送过程,直接发送下一条数据。
- 同步发送:生产者将数据放入缓冲区后,需等待数据的后续发送操作的应答状态,才能发送下一条数据。
2.5.4 消息分区
- 指定分区:在构建数据时,可以指定数据存储的分区编号。
- 未指定分区:Kafka会根据集群元数据中的主题分区,通过算法计算分区编号。
- 分区器:可以自定义分区规则,实现
Partitioner
接口,重写partition
方法。
2.5.5 消息可靠性
- ACK = 0:生产者将数据发送到网络输出流后,Kafka就进行响应,数据可能会丢失。
- ACK = 1:Leader副本将数据写入日志文件后,Kafka进行响应,数据相对安全。
- ACK = -1:Leader副本和Follower副本都将数据写入日志文件后,Kafka进行响应,数据非常安全。
2.5.6 消息去重与有序
- 数据重试:可能导致数据重复和乱序。
- 数据幂等性:通过配置
enable.idempotence=true
开启幂等性,确保数据不重复。 - 数据事务:通过事务功能解决跨会话的幂等性问题,确保数据的一致性。
2.6 存储消息
2.6.1 存储组件
- KafkaApis:Kafka应用接口组件,用于判断请求类型并选择相应的方法进行处理。
- ReplicaManager:副本管理器组件,用于提供主题副本的相关功能。
- Partition:分区对象,包含分区状态变换的监控、分区上下线的处理等功能。
- UnifiedLog:统一日志管理组件,用于管理数据日志文件的新增、删除等功能。
- LocalLog:本地日志组件,管理整个分区副本的数据日志文件。
- LogSegment:文件段组件,对应具体的某一个数据日志文件。
- LogConfig:日志配置对象,包含常用的数据存储配置参数。
2.6.2 数据存储流程
- ACKS校验:根据生产者设置的ACKS级别,进行相应的校验。
- 内部主题校验:确保主题名称不是Kafka的内部主题名称。
- ACKS应答及副本数量关系校验:确保ISR列表中的副本数量满足要求。
- 日志文件滚动判断:根据文件大小、时间间隔等条件,判断是否需要滚动生成新的日志文件。
- 请求数据重复性校验:确保数据不重复。
- 请求数据序列号校验:确保数据有序。
- 数据存储:将数据写入日志文件,并更新数据偏移量。
2.6.3 存储文件格式
- 数据日志文件:以
.log
作为扩展名,文件名长度为20位长度的数字字符串,表示当前日志文件的第一批数据的基础偏移量。 - 数据索引文件:保存逻辑偏移量和数据物理存储位置的对应关系,采用稀疏索引。
- 数据时间索引文件:将时间戳和偏移量对应起来,方便根据时间戳查找数据。
2.6.4 数据刷写
- Kafka提供了参数进行数据的刷写,如
log.flush.interval.messages
、log.flush.interval.ms
等。 - 官方不建议通过强制刷写数据到磁盘来保证数据的可靠性,而应通过副本机制来保证。
2.6.5 副本同步
- 启动数据同步线程:Follower节点启动数据同步线程
ReplicaFetcherThread
,从Leader副本节点同步数据。 - 生成数据同步请求:周期地向Leader节点发送FETCH请求,用于从Leader获取数据。
- 处理数据响应:将Leader返回的分区数据写入数据文件中。
- 更新数据偏移量:根据Leader返回的偏移量信息,更新自身的偏移量。
2.6.6 数据一致性
- 高水位(HW)机制:Kafka在不同的副本之间维护了一个水位线的机制,消费者只能读取到水位线以下的数据。
- HW在副本之间的传递:HW会随着Follower的数据同步操作而不断上涨,确保消费者能访问的数据一致性。
- ISR(In-Sync Replicas)伸缩:ReplicaManager组件管理ISR,周期性地查看ISR中的副本集合是否需要收缩或扩大,并传播ISR的变更。
2.7 消费消息
2.7.1 消费消息的基本步骤
- 创建Map类型的配置对象,增加相应的配置属性,如集群地址、反序列化类、消费者组ID等。
- 创建消费者对象,向Kafka订阅主题消息,并发送请求获取数据。
- 获取数据对象
ConsumerRecord
,包含主题名称、分区号、偏移量、时间戳、key、value等数据。 - 关闭消费者对象,释放资源。
2.7.2 消费消息的基本代码
- 提供Java代码示例,演示如何使用Kafka Consumer API消费数据。
2.7.3 消费消息的基本原理
- 消费者组:多个消费者可以组成一个消费者组,共同消费一个主题中的所有数据,提高消费速率。
- 调度(协调)器Coordinator:负责管理和调度消费者组的成员、状态、分区分配、偏移量等信息。
- 消费者分配策略Assignor:决定消费者组中的消费者如何分配主题分区,常用的分配策略有轮询分配策略、范围分配策略、粘性分区策略等。
- 偏移量offset:消费者消费数据的位置,可以通过配置或指定偏移量来控制消费起始位置。
- 偏移量提交:消费者可以自动或手动提交偏移量,以确保重启后能从正确的位置继续消费。
- 消费者事务:确保数据消费过程和偏移量提交过程的原子性,避免数据重复消费或丢失。
- 偏移量的保存:0.90版本之前,偏移量保存在ZooKeeper中;0.90版本之后,偏移量保存在Kafka内部的
__consumer_offsets
主题中。 - 消费数据:消费者通过拉取数据的方式从Kafka获取数据,服务端采用零拷贝技术提高数据拉取效率。