史上最全的kafka知识解析 kafka作用是什么( 三 )


LEO是Log End Offset的缩写 , 它标识当前日志文件中下一条待写入消息的Offset , 图中Offset为9的位置即为当前日志文件的LEO , LEO的大小相当于当前日志分区中最后一条消息的Offset值加1 。分区ISR集合中的每个副本都会维护自身的LEO , 而ISR集合中最小的LEO即为分区的HW , 对消费者而言只能消费HW之前的消息 。
ISR副本集合ISR全称是“In-Sync Replicas” , 是分区中正在与Leader副本进行同步的Replication列表 。正常情况下ISR必定包含Leader副本 。
ISR列表是持久化在Zookeeper中的 , 任何在ISR列表中的副本都有资格参与Leader选举 。
ISR列表是动态变化的 , 副本被包含在ISR列表中的条件是由参数replica.lag.time.max.ms控制的 , 参数含义是副本同步落后于Leader的最大时间间隔 , 默认10s , 意思就是如果说某个Follower所在的Broker因为JVM FullGC之类的问题 , 卡顿相对Leader延时超过10s , 就会被从 ISR 中排除 。Kafka之所以这样设计 , 主要是为了减少消息丢失 , 只有与Leader副本进行实时同步的Follower副本才有资格参与Leader选举 , 这里指相对实时 。
注:
分区中的所有副本统称为AR(Assigned Replicas) 。ISR集合是AR集合中的一个子集 。与Leader副本同步滞后过多的副本(不包括Leader副本)组成OSR(Out-of-Sync Replicas)
复制机制如图所示 , 假设某个分区的ISR集合中有3个副本 , 即一个Leader副本和2个Follower副本 , 此时分区的LEO和HW都为3 。消息3和消息4从生产者发出之后会被先存入Leader副本 。
在消息写入Leader副本之后 , Follower副本会发送拉取请求来拉取消息3和消息4以进行消息同步 。
在同步过程中 , 不同的Follower副本的同步效率也不尽相同 。在某一时刻Follower1完全跟上了Leader副本而Follower2只同步了消息3 , 如此Leader副本的LEO为5 , Follower1的LEO为5 , Follower2的LEO为4 , 那么当前分区的HW取最小值4 , 此时消费者可以消费到offset为0至3之间的消息 。
当所有的副本都成功写入了消息3和消息4 , 整个分区的HW和LEO都变为5 , 因此消费者可以消费到offset为4的消息了 。
关于读写分离Kafka并不支持读写分区 , 生产消费端所有的读写请求都是由Replication Leader副本处理的 , Replication Follower副本的主要工作就是从Leader副本处异步拉取消息 , 进行消息数据的同步 , 并不对外提供读写服务 。
Kafka之所以这样设计 , 主要是为了保证读写一致性 , 因为副本同步是一个异步的过程 , 如果当Follower副本还没完全和Leader同步时 , 从Follower副本读取数据可能会读不到最新的消息 。
Kafka的消息发送机制Producer采用push模式将消息发布到Broker , 每条消息都被append到patition中 , 属于顺序写磁盘(顺序写磁盘效率比随机写内存要高 , 保障kafka吞吐率) 。
Producer写入消息序列图如下所示:
流程说明:
Producer先从Zookeeper的”/brokers/…/state”节点找到该Partition的Leader 。Producer将消息发送给该Leader 。Leader将消息写入本地log 。followers从Leader pull消息 , 写入本地log后Leader发送ACK 。Leader收到所有ISR中的replica的ACK后 , 增加HW并向Producer发送ACK 。Broker保存消息每个patition物理上对应一个文件夹(该文件夹存储该patition的所有消息和索引文件)


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: