1.Kafka介绍
1.1概念
kafka是一个开源的分布式应用,是基于发布/订阅模式的消息队列,主要用于大数据领域的实时处理.通俗的理解就是一个特大号的Channel(用于存储,管理数据的),它可以把接收的数据按主题分类好摆放在货架上,并且提供 管理服务,需要用到数据的一方主动从货架上取数据.
消息队列:相当于一个容器,并且能按照一定的规则将需要处理的消息进行排序(比如按照访问时间,事情的重要性程度等).
Kafka未来的发展方向:分布式事件流平台,高性能的数据管道,流分析,数据集成和关键任务应用.
1.2Kafka提供的服务是什么
1. 提供海量数据的存储服务,并且高可靠性
2.能以高效的方式处理海量消息
3.保证数据的有序性
1.3Kafka基本架构
由生产者,broker,消费者三部分组成.
生产者:生产数据的一方
broker:负责存储,管理数据的,一个大号的channel
消费者:用数据的一方,比如flink,spark等;
其中:老版本用到组件zookeeper,存储关键信息,比如集群有哪些服务器,各服务器的角色分工等,本篇是基于kafka-zookeeper模式的介绍
由于存在网络传输,且不同框架之间配合的版本问题,之后的kafka不再依赖zookeeper,将上述的工作放在自身的框架之内完成(Kafka-Kraft模式),后续章节介绍.
![](https://i-blog.csdnimg.cn/blog_migrate/77aeff631b298a243f0e2fd651fac1fc.png)
1.4官网
1.5学习本节内容需要掌握的单词
单词 | 释义 | 单词 | 释义 |
broker | 经纪人 | daemon | 后台程序 |
segment | 片段 | compact | 紧凑的 |
sticky | 粘性 | millisecond | 毫秒 |
coordinator | 协调人 | offset | 偏移量 |
retention | 保留 | policy | 策略 |
permission | 许可证 | deny | 否认,拒绝 |
replica | 副本 |
2.Kafka原理
2.1生产者消息发送流程
2.1.1发送原理
![](https://i-blog.csdnimg.cn/blog_migrate/71e4eddbd7b08a02a145428d06e13e4e.png)
Kafka的Producer发送消息采用的是 异步发送的方式。
在消息发送的过程中,涉及到了 两个线程: main线程和 Sender线程,以及一个 线程共享变量:RecordAccumulator。
①main线程中创建了一个双端队列RecordAccumulator,将消息发送给RecordAccumulator。
②Sender线程不断从RecordAccumulator中拉取消息发送到Kafka broker。
RecordAccumulator:相当于生产者的仓库,将生产的数据暂存到这里,默认值32M
2.1.2partition分区
2.1.2.1分区优点
1. 提高并行度,生产者根据分区发送数据,消费者根据分区进行消费
2. 存储资源更加合理.通过分区将大量的数据分割成一块一块的,方便存储与管理
2.1.2.2分区策略
三种策略.
1. 可指定数据存储分区
2.没有指明但有key时,根据key的hash值与topic的分区数进行取余得到分区值
3.没有key的情况下,采用黏性分区.开始会随机选择一个分区,后面尽可能一直使用该分区.待该分区的batch已满或者已完成,再随机选择一个分区(与之前不同)
2.2 Broker 工作流程
2.2.1工作原理
![](https://i-blog.csdnimg.cn/blog_migrate/64c21b21ffd877a945dfa4823ac608af.png)
2.2.2 Kafka副本
2.2.2.1副本信息
kafka副本作用 | 提高数据可靠性 |
kafka副本个数 | 默认1个,生产环境中一般配置为2个,保证数据可靠性;但是过多的副本会增加磁盘存储空间、增加网络数据传输、降低kafka效率。 |
kafka副本角色 | 副本角色分为Leader和Follower。kafka生产者只会把数据发送到Leader,follower会主动从Leader上同步数据。 |
kafka中的AR | 是所有副本的统称(Assigned Repllicas),AR = ISR + OSR ISR:表示和Leader保持同步(默认30s)的follower集合。 OSR:表示Follower与Leader副本同步时,延迟过多的副本。 |
2.2.2.2leader选举
kafka集群中有一个broker的Controller会被选举为Controller Leader,负责管理集群broker的上下线、所有的topic的分区副本分配和Leader选举等工作。Controller的信息同步工作是依赖于Zookeeper的。
![](https://i-blog.csdnimg.cn/blog_migrate/cbbbfe1b7e7a81cbb9a23b50ba4e92c1.png)
2.2.3 leader和 follower故障处理细节
follower故障处理细节
![](https://i-blog.csdnimg.cn/blog_migrate/fa0334dc7be33fe77f962b217572d1fb.png)
leader故障处理细节
![](https://i-blog.csdnimg.cn/blog_migrate/df5c8925b7c5b2a6153cb9ed1dfc7f76.png)
总结:
LEO:指的是每个副本最大的offset;
HW:指的是消费者能见到的最大的offset,ISR队列中最小的LEO。
(1)follower故障
follower发生故障后会被临时踢出ISR,待该follower恢复后,follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步。等该 follower的LEO大于等于该Partition的HW,即follower追上leader之后,就可以重新加入ISR了。
(2)leader故障
leader发生故障之后,会从ISR中选出一个新的leader,之后,为保证多个副本之间的数据一致性,其余的follower会先将各自的log文件 高于HW的部分截掉,然后从新的leader同步数据。
注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。
2.2.4文件存储
2.2.4.1文件存储机制
![](https://i-blog.csdnimg.cn/blog_migrate/eec6e81a5dc44755284366f5f40b3f4f.png)
2.2.4.2 index文件和log文件详解
![](https://i-blog.csdnimg.cn/blog_migrate/ce2ee8c39ab75d53d27421e0916548cf.png)
offset是偏移量
position是偏移量对应的物理磁盘的位置
2.3消费者工作流程
2.3.1消费者总体工作流程
![](https://i-blog.csdnimg.cn/blog_migrate/a03c0f2284f428d99c8fb55ff0d0db51.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9bc6f0d66dae0d45ead83eb9d4743bf2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5aa2ab6251d301b2daa633e0fcb1f437.png)
2.3.2补充
1.消费者组内的数据不能消费同一个分区, 为了避免数据重复
2.消费者组之间消费互不影响.
3.Kafka实操
3.1kafka集群 启动/关闭 步骤
先启后停:先启动zookeeper,后启动kafka,同样先停止kafka,再停止zookeeper
3.2Kafka组件开启步骤
思路:先定义broker主题数及分区数----数据往哪儿存
其次:开启生产者,录入数据或者API操作也可(后面讲) -----生产数据
最后:开启消费者,-----消费者消费数据
3.3操作行命令
3.3.1 broker命令行
kafka的安装这里不再进行介绍, 以下的操作到安装kafka的家目录下进行操作:
查看主题命令行的参数: bin/kafka-console-producer.sh
参数 | 描述 |
--bootstrap-server | 连接kafka Broker主机名称和端口号 |
--topic | 操作的topic名称 |
--create | 创建主题 |
--delete | 删除主题 |
--alter | 修改主题 |
--list | 查看所有主题 |
--describe | 查看主题详细描述 |
--partitions | 设置主题分区数 |
--replication-factor | 设置主题分区副本 |
--config | 更新系统默认的配置 |
# 查看当前服务器中的所有topic
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --list
# 创建一个主题名为first的topic
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --replication-factor 3 --partitions 1 --topic first
# 修改分区数(注意:分区数只能增加,不能减少)
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --alter --topic first --partitions 3
3.3.2生产者命令行
查看命令行生产者的参数: bin/kafka-console-producer.sh
参数 | 描述 |
--bootstrap-server | 连接kafka Broker主机名称和端口号 |
--topic | 操作的topic名称 |
启动生产者,生产消息
bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic first
>hello world
>laotie 666
3.3.3消费者命令行
查看命令行消费者的参数:bin/kafka-console-consumer.sh
参数 | 描述 |
--bootstrap-server | 连接kafka Broker主机名称和端口号 |
--topic | 操作的topic名称 |
--from-beginning | 从头开始消费 |
--group | 指定消费者组名称 |
消费消息
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic first
📊📊📊文本为学习之余,梳理的知识点,有初学的小伙伴可以慢慢研究,有疑惑的地方可在下方留言,欢迎大家随时交流.
📊📊📊如果有喜欢的小伙伴,欢迎点赞,收藏及留言,谢谢你们😘~
📊📊📊如有错误之处,请随时指正!!!
![](https://i-blog.csdnimg.cn/blog_migrate/60831c5057c1f92b0f03c9d7c3da8d70.png)