kafka核心内容讲解-爱代码爱编程
存储策略
每个topic有多个分区组成,而每个分区由多个segmet组成,每个segment由.log文件和.index文件组成
index文件主要保存消息的偏移量,根据消息的偏移量以及消息大小快速定位到消息的位置
当查找消息时采用二分查找
生产者
分区原因
- 方便在集群中扩展
- 提高并发
分区原则
producer在发送消息时把每条消息包装成一个producerRecoder对象
数据可靠性保障
为保障leader接收到数据之后,生产者可以继续发送数据,leader接收完数据在什么时候给生产者反馈(ack)?
一种是半数以上follower同步完之后发送ack,一种是全部follower同步完发送
注:第二种在0.8之前有两种决定:同步时间和同步的消息数量,在0.8之后只有同步时间决定
生产者的acks参数提供三种配置给用户,让用户根据数据可靠性保障选取策略
acks=0 不管leader返回ack,不断发送数据,可能丢失数据
acks=1 只要leader写完数据就返回ack,不管follower是否同步完,可能丢失数据
acks=-1 全部leader和follower写完数据返回ack,可能重复数据
ISR中数据的一致性
HW保证存储一致性和消费一致性,不保证数据丢失和数据重复(acks)
如何保证ExactlyOnce
消费者
两种分区分配策略
- RoundRobin 按照消费者组划分,把所有主题看做整体然后轮询分配分区
- Range(默认) 按照主题划分(先看谁订阅了主题再看是否属于同一个组)
当消费者组里的消费者增加或者减少的时候会重新触发分区分配策略
消费者偏移量保存在消费者组中
- 保存在zookeeper中,offset是由group+topic+partition决定
- 0.9开始默认吧offset保存在kafka的一个内置主题中,该topic为_consumer_offsets。要想消费该主题需要先修改consumer.properties配置文件添加exclude.internal.topics=false
kafka高校读写数据原因
- 顺序写磁盘 600M/s比随机写磁盘100K/s块
- 零拷贝
- 分布式
kafka事务
- producer事务
引入全局transactionId绑定pid,当producer挂掉之后,重新启动可以通过transactionId找回pid,再加上at least once(producer.properties里设置acks=-1)+幂等性=exactly once可以实现精准一次性写入到kafka集群同时解决跨分区跨会话问题 - consumer事务
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_40059536/article/details/111056877