Kafka----Producer
分区策略
-
原因
-
方便扩展,每个partition可以通过调整以适应他所在的机器,而一个topic 有多个Partition 组成 因此整个集群可以适应任意大小的数据
-
可以提高并发 以Partition进行读写
-
-
原则
- 将生产者发送出的消息封装成ProducerRecord(行记录)
- Inter partition :分区号
- timestamp:时间戳
- 当partition有值时,将直接作为分区号
- 当partition没有值,但<K,V>有值时,将key的hash值与topic中的partition的值进行取余得到partition
-当既没有partition和key值的时候,第一次调用时随机生成一个整数(之后调用时在这个整数上尽心递增),将这个值与Topic可用的partition总数取余得到partition值,也就是常说的round-robin算法
数据可靠性
副本数据同步策略
现有两个策略可以进行选择
策略一: 类似Zookeeper的机制,当半数n以上的机器故障,则需要2n+1台服务器进行
策略二:全部同步机制,只要存在一台机器上有副本就可以,只需要n+1台服务器
因此Kafka会选择策略二来节省数据,降低数据的冗余度
当在发送ACK时如果有机器宕机则不会同步完成
因此Kafka优化了策略,新加了==ISR==策略
ISR
- in-sync replica set (ISR)同步副本
- ISR将同步时间快,同步条数多的服务器列入ISR内
- 当Leader挂掉之后在ISR中选取新的Leader
- 可以选择为Leader的前提条件是1.同步的时间 2.同步的条数
- 在高版本中成为Leader的前提条件为同步的时间
ACKS
acks
- 0 producer不需要等待broker的ack 不需要重试,不需要去接收是否收到的消息(当broker发生故障时可能发生数据丢失)
- 1 producer只等待Leader写完 ,不等待Follower写完 (当同步到Follower时 Leader发生故障,可能发生数据丢失)
- -1(ALL)producer将会等待broker的ack 当Leader和ISR中的Follower全部完成后才会返回ack(当Follower同步完成之后,Leader发生故障,则ISR中将会选取新的Leader来完成刚刚的数据同步,就会造成数据重复)
HW:High Watermark(高水位,所有副本中最小的LEO)
LEO:Log End Offset(每个副本的最后一个offset)
- HW之前的数据才是Consumer可见的数据
- 保障消费者消费时的一致性
- HW之保持数据一致性,不能保证数据重复和丢失
- Leader发生故障
- 当有新的Leader产生时
- Follower将高于HW的部分截取掉
- 然后从新的Leader上同步offset数据 - Follower发生故障
- Follower 发生故障后会被临时踢出 ISR
- 待该 Follower 恢复后,Follower 会读取本地磁盘
- 记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉
- 从 HW 开始向 leader 进行同步
- 等该 follower 的 LEO 大于等于该 Partition 的 HW
- 即 follower 追上 leader 之后,就可以重新加入 ISR 了。
Exactly Once(精准一次性)
- 当ACK= -1时 保证数据不丢失,可能重复数据(At Least Once)
- 当ACK= 0时 最多只发送一次(At Most Once)
- Exactly Once = At Least Once +== 幂等性==
幂等性
- 在broker中进行处理
- 在Kafka中进行去重
- 向Server发送多少次重复数据,Server只会持续化一条
开启幂等性
- 将生产者Producer的参数中enable.idompotence 设置为 ture 就可以
- 当设置为true时 ack会默认为 -1