kafka理论总结

server向 producer 应答机制有3种

一、立即回复,最快,但是最不安全
二、server 让leader 储存 ,立即发送ack
三、等所有的leader 及follower 全都同步完了,才回ack

ISR列表 保持同步的副本

存储的所有的副本的列表

isr in-sync replica set leader 维护一张leader的表

如果follower 在多少时间内未发送数据到leader则 踢出去

High Watermark


LEO log end offset
HW high waterMark


Exactly Once 语义:
服务器的ack级别:
ack -1 保证不会丢失数据 at least once 到少一次
优点: 保证不丢数据
缺点: 可能导致重复发送
ack 0 只发送一次数据 at most once 最多一次 (保证生产者的每条消息,只能发送一次)
优点: 可以保证数据不重复
缺点: 不能保证数据不丢失

如何保证消息,既不复发,也能保证发送呢? Exactly Once
历史: 在0.11版本以前的Kafka,对此是无能为力的,只能保证数据不丢失
历史解决办法: 费者对数据做全局去重

0.11版本的Kafka: 引入 "幂等性"
"幂等性" --> 不论向Server发送多少次重复数据,Server端都只会持久化一条
At Least Once + 幂等性 = Exactly Once

用法:
要启用幂等性,只需要将Producer的参数中enable.idompotence设置为true即可

原理: (pid,partition,SeqNumber)
开启幂等性的Producer在 "初始化" 的时候会被分配一个PID,发往同一Partition的消息会附带Sequence Number。而Broker端会对<PID, Partition, SeqNumber>做缓存,当具有相同主键的消息提交时,Broker只会持久化一条。
问题:
但是PID重启就会变化,同时不同的Partition也具有不同主键,所以幂等性无法保证跨分区跨会话的Exactly Once。

以上问题如何解决? 重重重重重要........
Kafka从0.11版本开始引入了事务支持
事务可以保证Kafka在Exactly Once语义的基础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败。
为了实现跨分区跨会话的事务,需要引入一个全局唯一的Transaction ID,并将Producer获得的PID和Transaction ID绑定。这样当Producer重启后就可以通过正在进行的Transaction ID获得原来的PID。


实现:
为了管理Transaction,Kafka引入了一个新的组件Transaction Coordinator.

负责两件事情:
1、写事务的执行状态写入kafka 一个topic里面
2、向producer提供事务的状态信息,从而来获取pid

猜你喜欢

转载自www.cnblogs.com/leigepython/p/12418528.html