概述
定义
kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域
消息队列的好处
- 解耦 ,异步通信,可控制消费时机
- 可恢复性,消费失败可以进行补偿
- 缓冲,削峰,解决生产速度和消费速度不一致,生产大于消费的情况
消息队列的两种模式
- 点对点模式 : 一对一,消费者消费后会清除消息
- 发布/订阅模式 : 一对多,消费者消费数据后不会清除消息
- 消费者主动拉取数据模式,消费者控制消费速度,消费者需要不断轮询是否有消息可供消费
- 队列主动推送消息到消费者,消费者无法控制消费速度
kafka 架构
- 生产者生成消息(Producer)
- kafka 集群管理消息 (Broker)
- 主题(Topic): 将消息进行分类,逻辑上的概念
- 分区 (Partition):物理上的概念 提高消息的负载均衡,和并发能力,分区的偏移量是独立的
- Leader : 针对主题的Leader ,而不是针对Broker集群的Leader,生成者和消费者只会连接Leader,对Leader 的消息进行处理。
- Follower : 针对于Topic ,用于数据冗余备份,follower数量包括leader 的数据
- 消费者消费消息(Consumer) : 某一个Topic的partition 的一条消息只能被消费者组(group_id)中的一个消费者消费。
- 注册中心(Zookeeper):0.9版本前保存消息信息,和消费信息(offset),0.9版本后保存在kafka中。
kafka 的文件存储
- 概述 : topic 是逻辑概念,partition 才是物理概念,数据存放在 partition 中,数据存放位置在对应的 topic 的文件下,包括 .log 数据文件,.index 文件
.log文件 : 存放消息数据,可配置最长存放时间,默认7天,可配置一个.log文件的最大大小,默认1G,当超过配置的大小时,再新建一个.log文件.index文件 : 存放偏移量
kafka 的安装,启动,关闭
- 安装:下载-解压-修改配置(brokerId,logDir等)
- 启动:集群启动如果不写shell脚本就需要每个broker 单独启动,所以最好写个shell 脚本
- 关闭:同启动
kafka 相关命令
- 概述 : 一般kafka会有相关的管理后台,不需要直接操作命令,但是了解kafka 相关命令可以更有利于我们了解认识kafka
- 查看kafka 命令集 : 都在 bin 目录里面
- topic 相关命令 :
kafka-topics.sh跟相应的参数对topic做相应的增删改查操作 - 生成者相关命令 :
kafka-console-consumer.sh控制台消费命令 多用于测试 - 消费者相关命令 :
kafka-console-produer.sh控制台生产命令 多用于测试
高级
kafka 工作流程
- producer 根据某种策略 往broker的对应的topic 的 leader partion 发送消息
- follower 同步 leader 的数据
- consumer 根据某种策略 从 对应的topic 中的 leader partion 拉取消息进行消费
kafka 的文件存储
- 概述 : topic 是逻辑概念,partition 才是物理概念,数据存放在 partition 中,数据存放位置在 对于的 topic 的文件下,包括 .log 数据文件,.index 文件 ,使用分片和索引的机制
.log文件 : 存放消息数据,可配置最长存放时间,默认7天,可配置一个.log文件的最大大小,默认1G,当超过配置的大小时,再新建一个.log文件 ,.log文件的命名为当前.index文件的最大偏移量.index文件 : 存放偏移量(offset-对应消息的偏移量-对应消息的大小),每条数据大小是相同大小的,方便索引的查找,也方便查找消息
kafak 生产者
1. 分区策略
- 在指定partition 的情况下,按指定情况进行分区
- 在没有指定 partition,但是指定了key的情况下,对key进行hash ,并对hash值和该topic 的partition 数进行取余得到分区数
- 在既没有指定partition 也没有指定key 的情况下,通过轮询的方式进行分区 (0,1,2;0,1,2;。。。)
2. 数据可靠性的保证 ack
-
主从同步机制
- 半数以上follower 完成同步才算完成,延迟低,容错性差
- 全部follower 完成同步才算完成,延迟高,容错性高,kafak 选择了这种机制,并且使用ISR 机制作为补充完善。
-
ISR(in-sync-replica) : 和 leader 保持同步的follower集合 (leader 的马仔,将来leader 挂了可能上位成为新leader,但是如果办事不利,比如没有及时同步leader 的数据--replica.lag.time.max.ms参数,和leader 的数据差别太大【后来数据差别的大小这个参数被移除了,不再需要考虑同步的数据量,因为producer批量发生数据,leader 和 follower 的数据量很容易产生很大的差别,可能会导致频繁的操作ISR-- 移除和添加 ISR 集合中的follower】,就可能被踢出这个集合,连马仔都不是了,只能做个扫地的)
-
acks应答机制 : 对消息的可靠性和及时性之间进行权衡取舍
- acks = 0 : at most once ,producer 不等待broker的应答,不管是否消息有没有发送成功,可靠性很差,及时性很高
- acks = 1 : leader 写入数据成功后进行应答,在follower完成同步前,leader 挂了的情况下会导致数据丢失
- acks = -1 : at least once, leader 和 follower(ISR中的follower) 全部写入数据成功后进行应答,可靠性比较强,但是及时性会比较差,但是当follower 同步完leader数据后leader挂了,leader无法进行应答,消费者重新发送到新的leader,会导致消息重复
-
故障处理细节
- LEO: log end offset , 每个副本的最后的一个offset
- HW : hight watermark , 所有副本中最小的offset , HW 之前的数据才对consumer可见,保障leader 挂掉后,新的leader有数据可供consumer 消费,并且为保证数据的一致性,所有副本和leader 的数据保持一致(多退少补)
- Exactly once = at least once + 幂等性(broker 对消息进行去重),enable.idompotence 参数设置为true 时,开启幂等性
kafka 消费者
消费方式
kafka 消费者主动从partition中拉取数据
分区分配策略
- 概述 : 一个消费者组可能存在多个消费者,一个topic 存在多个partition分区,分区策略解决消费者和分区的对应关系,当消费者增多或者减少时都会触发分配策略reblance,可通过
partition.assignment.strategy属性进行配置 - 轮询策略 :以topic+ partition (或者说消费组)为单位,消费比较均衡,但是消费者组消费的主题不一样时会产生消费到未订阅的主题分区
- 范围策略 :默认的分区策略,以topic 为单位,组内范围分配,可能存在消费不均衡的情况,某个消费者消费多,某些消费少
消费者offset的存储
1. 消费者组(groupID)+主题(Topic)+分区(partition)唯一确定一个offset
2. 存储在zookeeper : consumer/consumer-group/offset/topic/partition
3. 存储在kafka 本地 : `kafka-console-consumer.sh --topic _consumer_offset`
kafka 高效读取数据
- 原因 :
- 分区,可并发读写
- 顺序写磁盘
- 零复制技术 : 由操作系统直接管理数据的传输
zookeeper 在kafka中的作用 不太清楚
- 负责broker 的状态管理
- 负责topic 信息管理
- 负责选取controller,controller 即一个 master broker,负责往zookeeper中写入数据,选举规则就是先到先得
kafka API
producer API
- 消息发送流程 : 异步发送,涉及两个线程(main , Sender)和一个线程共享变量(RecoderAccumlator)
- main 线程将待发送数据发送到 RecoderAcumlator, 可批量发送(batch.size),当累积到一定数量后再发送,如果数据量迟迟未达到batch.size,也可在指定时间(linger.time)后发送
- Sender 线程从RecoderAccumlator中 获取数据 ,发送到topic 对应的分区
- 主要API : [juejin.cn/post/684490…](简单的kafka producer demo)
- 自定义分区 :实现Partitioner接口,实现相关方法,参考默认分区DefaultPartitioner 类,并通过配置(partition.class)指定使用自定义的分区
consumer API
-
主要的API : [juejin.cn/post/684490…](简单的kafka consumer demo)
-
手动提交 :将本次拉取的数据的最高偏移量提交,需要先关闭自动提交
- 同步提交 :阻塞当前线程,直到提交成功,并且会自动失败重试,但是效率低
- 异步提交 :没有失败重试机制,效率比同步提交高
-
自定义存储offset ,可将offset 存储在 kafka 之外的存储系统中,如MySQL, 需要考虑消费者的rebalance(分区改变触发rebalance),比较麻烦,可借助ConsumerRebalanceListener监听Rebalance的情况
自定义拦截器
- 概述 : 针对生产者的拦截,需要实现ProducerInterceptor接口中的相关方法
kafka 监控
图形化界面化的kafka 监控管理工具
- kafka manager
- Kafka Eagle
- 安装
- 配置
- 使用