Kafka
2023-06-09 14:30:45 1 举报
AI智能生成
Kafka 知识点总结
作者其他创作
大纲/内容
核心概念
模式(Schema)
服务协调
集群(Cluster)
组件架构
生产者(Producer)
中间人(Broker)
点对点(P2P)
发布 - 订阅(Pub - Sub)
消费者(Consumer)
消息架构
主题(Topic)
分区(Partition)
批次(Batch)
副本(Replica)
高吞吐量
顺序写
定期删除
分区分段和索引
批量写
批量压缩
Page Cache
Zero Copy
DMA
应用场景及原理
数据管道
构建标准
及时性
可靠性
吞吐量
数据格式
数据转换
安全性
容错性
灵活性
临时数据管道
元数据丢失
末端处理
连接器与客户端 API
数据存储
分区分配
文件管理
定期清理
分段存放
FD 调优
文件格式
格式一致
消息压缩
消息层次
重新压缩
压缩算法
GZIP
Snappy
LZ4
Zstandard
位移索引
清理数据
工作原理
墓碑消息
清理条件
流式处理
设计模式
单事件处理
本地状态
多阶段处理和重分区
外部查找
流的连接
乱序事件
重新处理
延迟队列
Kafka Streams
基本概念
事件流模型
编程范式
请求 - 响应
批处理
流处理
时间
时间事件
日志追加时间
处理时间
状态
内部状态
外部状态
流和表的二元性
时间窗口
窗口大小
移动频率
可更新时间
Kafka Streams DSL
WordCount 实例
时间窗口
无状态算子
过滤
转换
调试
有状态算子
聚合
流平台搭建
Kafka Connect
启动 Connect 组件
添加 File Conenctor
Kafka Streams
流处理应用开发
启动应用程序
生产部署
资源评估
操作系统
磁盘
机械硬盘
RAID
容量规划
带宽
常用配置
生产者
消息确认:acks
内存缓冲:buffer.memory
压缩类型:compression.type
重试上限:retries
批次大小:batch.size
消息大小:max.request.size
消息来源:client.id
分区策略:partitioner.class
消费者
获取记录最小字节数:fetch.min.bytes
获取记录最大等待时间:fetch.max.wait.ms
每个分区返回最大字节数:max.partition.fetch.bytes
死亡超时时间:session.timeout.ms
自动重置位移策略:auto.offset.reset
自动提交位移:enable.auto.commit
分区指派策略:partition.assignment.strategy
消息来源:client.id
单次调用返回记录数量:max.poll.records
群组 id:group.id
心跳发送间隔:heartbeat.interval.ms
Broker
唯一标识:broker.id
监听器:listeners
发布监听器:advertised.listeners
端口:port
消息并保存路径:log.dirs、log.dir
恢复时并行度:num.recovery.threads.per.data.dir
复制系数:default.replication.factor
是否允许 Unclean Leader 选举:unclean.leader.election.enable
最少同步副本:min.insync.replicas
是否允许定期进行 Leader 选举:auto.leader.rebalance.enable
消息留存时间:log.retention.{hours|minutes|ms}
日志保留字节数:log.retention.bytes
单个消息大小:message.max.bytes
是否允许自动创建 Topic:auto.create.topics.enable
副本拉取数据最大字节数:replica.fetch.max.bytes
Topic
默认分区数:num.partitions
日志片段关闭字节数:log.segment.bytes
日志片段关闭时间:log.segment.ms
复制系数:replication.factor
最少同步副本:min.insync.replicas
消息保留时长:retention.ms
消息保留字节数:retention.bytes
最大消息字节数:max.message.bytes
ZooKeeper
ZooKeeper 节点及端口:zookeeper.connect
JVM
堆大小:KAFKA_HEAP_OPTS
GC 参数:KAFKA_JVM_PERFORMANCE_OPTS
操作系统
文件描述符
文件系统类型
Swappiness
提交时间
认证授权
认证机制
SSL
SASL
授权机制
运维管理
常用工具脚本
主题管理
创建主题
查询主题
修改主题分区
修改主题级别参数
修改主题副本
修改主题限速
主题分区迁移
删除主题
特殊主题管理
查看消费者组提交的位移
查看消费者组状态
__consumer_offsets 占用太多的磁盘
动态配置变更
调整 Broker 端线程池大小
调整 Broker 端连接信息或安全配置信息
更新 SSL.Keystore 有效期
调整 Broker 端 Compact 操作性能
实时变更 JMx 指标收集器
调整日志留存时间
消费者位移重置
基于时间
基于位移
AdminClient
工作原理
前端主线程
后端 I/O 线程
应用实例
创建主题
查询消费者组位移
获取 Broker 磁盘占用
集群备份
MirrorMaker
服务监控
监控指标
主机监控
机器负载
CPU 使用率
内存使用率
磁盘 I/O 使用率
网络 I/O 使用率
TCP 连接数
打开文件数
Inode 使用情况
......
JVM 监控
Full GC 发生频率和时长
活跃对象大小
应用线程总数
集群监控
Broker 进程启动状况
Broker 端关键日志
Broker 端关键线程运行状态
Log Compaction 线程
副本拉取消息线程
Broker 端的关键 JMX 指标
BytesIn/ BytesOut
NetworkProcessorAvgIdlePercent
RequestHandlerAvgIdlePercent
UnderReplicatedPartitions
ISRShrink/ ISRExpand
ActiveControllerCount
......
Kafka 客户端
往返时延
消息发送、心跳线程
重要的 JMX 指标
解决方案
JMXTool
Kafka Manager
Burrow
JMXTrans + InfluxDB + Grafana
Confluent Control Center
性能调优
优化目标
调优吞吐量
调优延时
案例分析
操作系统调优
禁用 atime 更新
选择文件系统
Swap 空间设置
内核参数设置
页缓存设置
JVM 调优
设置堆大小
选择垃圾收集器
客户端优化
避免频繁创建客户端对象
用完及时关闭
合理利用多线程改善性能
ZooKeeper
ZAB 协议
基本流程
选举 Leader election
发现(Discovery)
同步(Synchronization)
广播(Broadcast)
崩溃恢复
消息广播
通知机制
实现分布式锁
实现步骤
会话超时
基本概念
基本特点
可靠性
一致性
原子性
数据模型
构建集群
顺序访问
高性能
会话(Session)
节点(Znode)
永久节点:不会因会话结束而消失
临时节点:与会话绑定,随会话失效移除
有序节点:节点名带上数字后缀,由父节点维护顺序
版本(Version)
version:ZNode 版本
cversion:子节点版本
cversion:ACL 版本
监听器(Watcher)
权限管理(ACL)
CREATE
READ
WRITE
DELETE
ADMN:设置节点 ACL 权限
集群角色
领导者(Leader)
学习者(Learner)
跟随者(Follower)
观察者(Observer)
客户端(Client)
Broker
控制器(Controller)
基本功能
Leader 副本选举
主题管理:创建、删除、增加分区(kafka-topics 脚本)
分区重分配:对已有主题分区进行细粒度的分配功能(kafka-reassign-partitions 脚本)
Preferred 领导者选举:避免部分 Broker 负载过重时切换 Leader
数据服务:接收其他 Broker 发来的元数据更新请求,更新其缓存信息
与 ZooKeeper 的交互
集群成员管理
唯一性临时节点
Watch 机制
Broker 元数据管理
主题信息:包括具体的分区信息,比如领导者副本,ISR 集合等
Broker 信息:包括当前运行中的 Broker,正在关闭中的 Broker 等
涉及运维任务的分区:包括当前正在进行 Preferred 领导者选举以及分区重分配的分区列表
故障转移(Failover)
设计原理
0.11-
0.11+
2.2+
处理请求
请求处理组件
SocketServer
Purgatory
数据请求
元数据请求
生产请求
验证权限及配置
消息写入磁盘
检查 acks 参数
获取请求
客户端
发送请求到分区领导者
查询元数据确保路由正确
Broker
检查请求参数(offset)是否有效
读取数据返回给客户端
控制请求
复制副本
领导者 - 跟随者
同步副本(ISR)
同步条件
与 ZooKeeper 保持活跃的会话
保持从领导者获取消息
非同步副本
日志管理
LEO 与 HW
领导者更新机制
HW
LEO
跟随者更新机制
HW
LEO
HW 更新机制
领导者副本所在 Broker
领导者 LEO
远程副本 LEO
领导者 HW
跟随者副本所在 Broker
跟随者 LEO
跟随者 HW
更新流程
副本同步的条件
Follower 副本在 ISR 中
Follower 副本落后但未超时
Leader Epoch 机制
日志段操作
消息写入
判断日志是否为空,实则更新切分日志段的时间戳
确保消息位移值合法
执行真正写入
更新最大时间戳和所属消息位移值
更新索引项和写入的字节数
消息读取
查找索引确定读取文件位置
计算读取总字节数
读取消息
重建索引
清空索引文件
遍历日志段中所有消息
执行消息日志索引文件截断
生产者
TCP 连接
创建连接
创建生产者
Broker 地址列表:bootstrap.servers
键序列化类型:key.serializer
值序列化类型:value.serializer
创建 TCP 连接
更新元数据后
消息发送时
关闭连接
用户主动关闭
Kafka 自动关闭
消息发送
具体流程
消息创建
序列化
选择分区
消息发送
返回响应
发送方式
发送并忘记
同步发送
异步发送
序列化器
自定义序列化器
使用 Avro 序列化
消息分区
键
分区策略
轮询
随机
按消息键
幂等性
消息去重:在 Broker 端多保存一些字段,在下次接收到相同字段的消息后就能知晓这些消息重复,自动去除
只能保证某个主题的单分区上不出现重复消息,且不能实现跨会话的幂等性(重启后失效)
事务
消费者
TCP 连接
创建连接
寻找协调者:消费者首次启动调用 poll 方法时,会向集群中负载最小的 Broker 发送请求,获取协调者信息
连接协调者:获知协调者信息后会创建到 Broker 的连接,开启组协调操作:加入组、等待组分配方案、心跳请求处理、位移获取、位移提交等
消费数据:消费者会为每个消费分区创建与该分区领导者副本的 Broker 的连接
关闭连接
用户主动关闭:调用 close 方法、执行 kill 命令
Kafka 自动关闭:一定时间内没有任何请求则会关闭 Socket 连接
存在问题
消费者行为
创建消费者
Broker 地址清单:bootstrap.servers
键反序列化类型:key.deserializer
值反序列化类型:value.deserializer
消费者群组 id:group.id
订阅主题/ 分配分区
消息轮询
反序列化
提交位移
消息丢失与重复处理
自动提交
手动提交
同步提交
异步提交
同步与异步组合
特定提交
异常处理
错误恢复
恢复处理
服务退出
消费者扩展
消费者组
消费者位移
主题消息
主题创建
消息清理
分区分配
分配策略
分区再均衡
协调者(Coordinator)
定位算法
触发条件
组成员发生变更(增减)
订阅主题数发生变更
订阅主题分区数发生变更(增)
消费者端执行流程
消费者入组、选出领导者
1. 所有消费者发送加入请求、上报订阅信息
2. 协调者选取领导者
3. 领导者定制分区分配方案
等待 Leader 消费者分配
4. 领导者向协调者发送分配方案
5. 协调者向组成员分发分配方案响应
6. 消费者组成员启动消费
协调者端应对场景
新消费者入组
组成员主动离组
组成员崩溃离组
再均衡时处理组成员提交位移
存在问题
影响消费者端 TPS
速度很慢
效率不高
性能优化
未能及时发送心跳
消费时间过长
消费端 GC
再均衡监听器
状态机
独立消费者
多线程消费
多个线程分别维护 KafkaConsumer 实例
单线程获取消息 + 多线程执行处理
可靠性传输
生产者
发送确认(ack)
失败重试
额外处理
批次乱序问题
幂等生产者
事务生产者
Broker
复制系数:replication.factor
不完全的领导者选举:unclean.leader.election
最少同步副本:min.insync.replicas
消费者
消费者群组
位移提交策略
位移自动重置:auto.offset.reset
事件完成后再提交(如自动提交:enable.auto.commit)
权衡性能与消息重复率
注意分区再均衡
消费者重试
状态维护
异步处理
幂等性写入
系统验证
配置验证
领导者选举
控制器选举
依次重启
应用程序验证
客户端从服务器断开连接
领导者选举
依次重启 Broker/ 生产者/ 消费者
0 条评论
下一页