Kafka学习笔记
戳蓝字“CSDN云计算”关注我们哦!
作者:张大胖007
来源:csdn博客
链接:
https://blog.csdn.net/weixin_44359255/article/details/85560656
要解决的问题
1 存储数据
2 重复消费
将数据的生产和消费分开 (异步通信)
保证顺序
缓冲
Kafka 重要的消息组件
生产者
消费者
消费者组
Topic
Kafka对消息保存时,根据Topic 归类
Broker
一个Kafka实例称为一个Broker
partition
一个大的Topic 可以分为多个partition,用来做负载均衡。一个partition中的数据是有序的,不能保证多个partition之间的数据有序。如果数据必须有序,就放到一个partition中
offset
有几个Broker,最多就有几个备份。
kafka 消费是以消费者组为单位的(一个消费者,也是放在消费者组中的)。 一个消费者组消费一个topic 的数据,消费者组中不同消费者 只能 消费不同分区的数据。一个消费者只能消费 一个分区的数据。
如果一个topic 有两个分区,三个消费者来消费的话,有一个消费者什么也不做。 只能增加分区,才有用。
如果一个topic 有三个分区,两个消费者,后面突然再增加一个消费者,会引发再平衡。
一个topic 可以由多个分区组成,一个消费者只能消费一个分区。
生产者和 zookeeper 不会产生直接的联系。 生产者需要得到 分区信息,但是 因为kfaka 集群和zookeeper 一直 有连接,生产者直接访问集群的时候,就可以获取到zk中的信息。
消费者需要连接zookeeper, 因为需要维护offset 并且需要不断更新到 zookeeper中。 同时还要把 消费者消费的哪个分区的数据 这种对应关系 提交到zookeeper。
Kafka 使用零复制技术提高传输效率 (数据不会读取到应用层,直接通知操作系统,完成相应的操作),另外Kafka 顺序写磁盘效率(PageCache )比随机写内存要高,保证了Kafka的吞吐量。 预读 和后写 技术 也是为了提高吞吐量。
分区的原则
(1)指定了patition,则直接使用;
(2)未指定partition但指定key,通过对key的value进行hash算出一个patition;
(3)patition和key都未指定,使用轮询选出一个patition
每个partition 可以有多个副本,副本有一个 leader,其他为follower(只负责从leader 中同步数据)。 producter和consumer 只与leader 交互。 如果partition 没有副本,当broker 挂掉后,该broker 上 partition 的数据不能被消费,同时生产者也将不能往该borker 上 的partition 上面存放 数据。
kafka 写数据流程
生产者连接kafka集群,集群通过连接zookeeper获取到分区信息,把它返回给生产者
生产者拿到分区信息后,会启动sender 线程,使用双端队列来向kafka 集群发送数据
kafka 集群中是否收到消息,基于ack 应答机制
0: 集群无需应答,即可发送下一条,性能非常好,但是可能会丢失数据,不安全。
1:集群中只需要Leader应答即可发送下一条,性能稍微差一下,而且数据可能会丢失。
-1(all):集群中所有的备份都需要应答方可发送下一条数据。性能最差,但是数据不会丢失
HW : 高水位,是消费者在当前分区中能够读取的最大偏移量
LEO : Log End Offset,当前broker日志中最后存储的数据偏移量
kafka 会保存一定大小的数据和一定时间类的数据,是否删除历史数据不会影响kafka 性能。
kafka 消费数据流程
消费者从 zookeeper 中获取分区信息,zookeeper 返回分区信息给生产者
生产者从分区中拉取数据进行消费。
以上offset 会保存在zookeeper中
消费者也可以不连接zookeeper,直接从集群中获取每个topic 分区信息,这样offset 也会保存到kafka 集群中
一个消费者可以读取多个分区的数据,但是一个分区的数据只能属于某一个消费者。
---------------------
推荐阅读
Gartner的预言:通向混合IT之旅
崩溃!新浪程序员加班错失 77 万年会大奖
刚刚!华为又被美国盯上了!
阿里“菜鸟”AI?
以太坊升级的拖油瓶,竟只是这几行代码
程序员有话说 | 程序猿在乘地铁的时候都在想什么?
清华北大“世界排名断崖式下跌”?
1.微信群:
添加小编微信:color_ld,备注“进群+姓名+公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!
2.征稿:
投稿邮箱:[email protected];微信号:color_ld。请备注投稿+姓名+公司职位。