Kafka, 分布式的消息引擎(中间件,消息队列), 提供点对点或发布-订阅,主要处理数据在系统间的流转。
也提供了弱持久化和弱流式计算,但据我了解,多数场景是只把Kafka作为消息传输工具。

为什么要用到消息队列, Kafka作为消息队列有什么特色?
  • 削峰填谷
    只考虑数据系统有两个,上游和下游。 当上游数据有突发流量,下游处理会有风险时,消息队列这在中间起到了“削峰“缓冲流量的作用。

  • 解耦和异步通信

消息队列作为一个接口层,解耦重要的业务流程。
消息队列提供了异步处理机制,允许用户把一个消息放入队列,等需要时再处理它们。

Kafka的物理架构

生产者 + 消费者 + 中间有多个broker组成的Kafka集群 + zookeeper( 老版本)

broker, 消息代理商的意谓, 这个消息代理,这么理解:
Producers,往Broker指定Topic写消息。
Consumers,从Brokers里拉取指定Topic的数据。

Zookeeper在这个过程起什么作用。
分布式协调组件, Kafka用ZK储存meta信息, consumer消费状态, 新版本在淡化ZK。

补充一下controller。
管理协调集群的, 有点类似 resource manager。

Kafka 分区 Partition的分类

Leader 唯一对外服务的副本, 生产者写,消费者读。
Follower 和Leader保持同步的跟随者副本。
AR, 数据分区的所有副本。
ISR, In-Sync Replicas 与Leader同步,不至于太落后的副本(集合)。
参数, replica.lag.time.max.ms
OSR, ISR反面 超过阈值后从ISR剔出去的副本, AR=ISR+OSR

Kafka为什么这么快?

Zero-copy DMAC
https://chowdera.com/2021/09/20210919064412301v.html

Follower是如何与Leader同步数据

follower要从Leader同步数据:

  • F向L发送同步数据赋诗,包含了F需要的offset 请求序列:
  • 发请求1, 请求2,请求3, 请求4,  表示以最新的请求为准。 
    
  • 超10秒没有发送请求, 或者没有收到请求数据, Follower从ISR剔除队列,降级为OSR。 
    

ISR为空时怎么办?
Unclean选举。

为什么Unclean选举会造成数据丢失?
新上任的领导落后Leader太多, 有个gap, 但生产者继续发, 而老leader下线不服务。
新leader和原leader之间的差异就丢了。

数据传输的可靠性

在Producer端, send方法设置 ack的参数

  • 正1, leader接收就算发送成功
  • 负1, 即all 所有副本(ISR中)都收到才算成功
  • 0, fire and shot 发了就不管

重复消费, 幂等性,事务。

丢失, 这里要采用带有回调的send方法, 并且ack要设置为负1.

关于副本的Leader选举细节 介绍介绍。

unclean选择, 是否允许 OSR的能否参加选举。
丢数据: OSR 是落后原Leader进度较多的, 如果它成为leader, spark streaming拿到的 HW 会突破变小。

每个Partition有个Controller进程, 当Leader挂了

Kafka 读写分离

主写从读

分区重分配

kafka-reassign-partitions

本质在于数据复制,增加新的副本,然后进行数据同步,最后再删除老副本。