分区策略
- 指明partition的情况下,直接将指明的值作为partition值
- 没有指明partition值但是有key情况下,将key的hash值与topic的partition数进行取余得到partition值
- 既没有partition又没有key的情况下,第一次调用产生一个随机整数,然后每次调用会在这个整数上递增,将这个值与topic可用的partition总数取余得到partition值,也就常说的 round-robin(轮询) 算法
数据可靠性保证
- 两种策略
- 同步半数副本,那么保证数据不丢失需要2n+1个副本
- 同步全部副本,那么保证数据不丢失需要n+1个副本
kafka采用同步全部副本
并且优化加入ISR(同步副本)策略,保证如果有一个副本出现不能同步或者同步缓慢而迟迟不能发送ack命令的策略(如果follower长时间未向leader同步数据,则该follower将被踢出ISR,时间阈值由replica.lag.time.max.ms参数设定。) 当Leader发生故障之后,就会从ISR中选区新的leader
-
ISR(同步副本)
TODO -
acks应答机制 参数配置:
- acks:
0
producer不等待broker的ack,提供了最低延迟,broker一接受还没写入磁盘就返回,那么会丢失数据
- acks:
1
producer等待broker的ack,Partition的Leader回落后返回ack,如果在follower同步成功前leader发生故障,那么会丢失数据
。 - acks:
-1或all
producer等待broker的ack,所有follower同步成功后返回ack- 但是如果follower同步成功但是还没有发送ack的时候 leader坏掉了,这时候重新选举leader,选举成功后会再次发送消息,会造成
消息重复
- 如果ISR副本个数为1的时候 ack设置为all还
可能会丢数据
- 但是如果follower同步成功但是还没有发送ack的时候 leader坏掉了,这时候重新选举leader,选举成功后会再次发送消息,会造成
以上的follower都是ISR同步副本中的follower
ExactlyOnce 精准一次性
- At least once 至少一次 acks: -1
可以保证数据不丢失,不能保证数据不重复 - At Most once 至多一次 acks: 0
可以保证数据不重复,不能保证数据不丢失 - Exactly Once
不重复也不丢失,采用幂等性。0.11之前,采用消费者段进行去重
配置文件设置enable.idompotence=true
即可以开启幂等性
生产者在初始化的时候分配一个PID,发往同一Partition的消息会带有Sequence Number。
而且Broker会对<PID,Partition,SeqNumber>做缓存,相同主键提交时候,Broker只会持久化一条。
缺点《生产者,重启后数据还会重复》1