微服务架构之–消息队列Kafka图解最全知识点(3)
broker消息存储
broker状态数据
broker负载均衡 分区数量负载:各台broker的partition数量应该均匀 partition Replica分配算法如下:
容量大小负载:每台broker的硬盘占用大小应该均匀 在kafka1.1之前,Kafka能够保证各台broker上partition数量均匀,但由于每个partition内的消息数不同,可能存在不同硬盘之间内存占用差异大的情况。在Kafka1.1中增加了副本跨路径迁移功能kafka-reassign-partitions.sh,我们可以结合它和监控系统,实现自动化的负载均衡 Kafka高可用 在介绍kafka高可用之前先介绍几个概念
Isr Kafka结合同步复制和异步复制,使用ISR(与Partition Leader保持同步的Replica列表)的方式在确保数据不丢失和吞吐率之间做了平衡。Producer只需把消息发送到Partition Leader,Leader将消息写入本地Log。Follower则从Leader pull数据。Follower在收到该消息向Leader发送ACK。一旦Leader收到了ISR中所有Replica的ACK,该消息就被认为已经commit了,Leader将增加HW并且向Producer发送ACK。这样如果leader挂了,只要Isr中有一个replica存活,就不会丢数据。 Isr动态更新 Leader会跟踪ISR,如果ISR中一个Follower宕机,或者落后太多,Leader将把它从ISR中移除。这里所描述的“落后太多”指Follower复制的消息落后于Leader后的条数超过预定值(replica.lag.max.messages)或者Follower超过一定时间(replica.lag.time.max.ms)未向Leader发送fetch请求。 broker Nodes In Zookeeper /brokers/topics/[topic]/partitions/[partition]/state 保存了topic-partition的leader和Isr等信息 Controller负责broker故障检查&&故障转移(fail/recover)
3.1 从/brokers/topics/[topic]/partitions/[partition]/state读取该Partition当前的ISR 3.2 决定该Partition的新Leader和Isr。如果当前ISR中有至少一个Replica还幸存,则选择其中一个作为新Leader,新的ISR则包含当前ISR中所有幸存的Replica。否则选择该Partition中任意一个幸存的Replica作为新的Leader以及ISR(该场景下可能会有潜在的数据丢失) 3.3 更新Leader、ISR、leader_epoch、controller_epoch:写入/brokers/topics/[topic]/partitions/[partition]/state 直接通过RPC向set_p相关的Broker发送LeaderAndISRRequest命令。Controller可以在一个RPC操作中发送多个命令从而提高效率。 Controller挂掉 每个 broker 都会在 zookeeper 的临时节点 "/controller" 注册 watcher,当 controller 宕机时 "/controller" 会消失,触发broker的watch,每个 broker 都尝试创建新的 controller path,只有一个竞选成功并当选为 controller。 使用Kafka如何保证幂等性 不丢消息
不重复 consumer拉取到消息先保存,commit成功后删除缓存数据 Kafka高性能
业务方对 Kafka producer的优化
(编辑:ASP站长网) |