消息路由策略
- productor 选取 partition 分区的策略(broker contorller 将当前 topic 所有的partition leader 返回给 productor )
- 直接指定了partition,则直接写入到partition
- 没有指定paritition,但是指定了key,通过key的hash值与 partition 数量取模,该取模的结果就是要选出的partiton索引
- 若 partition 和key 都没有指定,轮询算法选一个
消息写入算法
- 生成者 向 broker 提交连接请求,连接上的任意broker 都会向其发送 broker controller 的通信url
- 生成者 指定要消费的topic, broker controller 接受到请求后,从zk中查找指定topic 的所有 partition 的leader 。返回给生成者
- 生产者 接受到 leader 的列表后, 根据消息路由策略选择要发送的 partition leader。将消息发出
- leader 将消息写入到 本地log。 并通知isr 中的 follower
- isr 中的followers 从leader 同步信息后,向leader 响应ack
- leader 收到所有的ack后, 增加HW, 标识消费者可以消费到该位置了。
消息写入过程存在哪些问题?
- leader 接受到消息后,宕机怎么办,leader 可能因为网络问题,接不到消息?
- partition leader 选举的过程中 ISR 列表中没有从节点怎么办?
- leader 没有收到所有的ack的时候,宕机了。会存在问题?
- 生产者生产消息后,broker 没有给返回ack,超时后,重新提交消息问题
1.消息发送可靠性机制
- 通过配置可靠性级别 ack 参数的值进行设置
- 0 值, 异步发送,生产者 发送消息后,不需要 kafka 反馈成功ack。效果高。可靠性低。有可能存在消息丢失
- 1 值,同步发送,partition leader 收到消息后, 马上发送成长ack。存在的问题 是 当leader收到消息后, 还没有向follower 同步, leader 挂了。原来写入到leader 中的消息丢失了。
- -1 值,同步发送,当所有partition的副本都同步完消息后, 才能向生产者发送ack。如果超时后, 生产者会自动重发。 很少出现消息丢失。存在重复消息接受情况。kafka 运行为消息生成唯一标识。允许用户自定义去重。
2. partition leader的选举范围
- ISR 列表中没其他副本的时候 。可以通过 参数 unclean.leader.election.enable 取值 设置leader 选举
- false 标识有副本活过来 才进行选举,该策略可靠性有保证。但是可用性低
- true 标识从任何没有宕机的follower 中选一个,可能存在大量的消息丢失。可靠性没有保障
3. HW 截断机制
leader 收到消息后,ISR 中其它Follower 正在进行同步过程中,还未同步完毕。leader 宕机。会出现 paritition中的 leader 和follower的数据不一致
。使用截断。当leader 恢复后,将其从leo回退到 其宕机时候的HW。然后再与新的leader 进行数据同步。
(HW截断机制可能会引发消息的丢失)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。