深入Kafka设计原理(二)
2021-02-24 18:23:55 0 举报
深入Kafka设计原理(二)
作者其他创作
大纲/内容
Follower1
2
504
Producer层
1.Producer发送消息到topic
offset_id
③分区写入消息Leader更新LEO
consumer_offset_37
时间戳
Consumer指定offset进行消费底层原理
503
data
⑤Follower还没有来得及获取Leader的最新消息Leader就宕机了
每个consumer_offset_num文件夹下
...
3
consumer_offset_1
5
4
501
范围
1
2020-10-22 09:00:00
consumer_offset_25
3.如果在指定time内,没有拉取到消息,那么就会认为这个consumer宕机了,会把当前分区分给其他consumer进行处理
consumer_offset_48
此处省略了N次分裂,最后会指向每一个有序的offset_id对应的索引时间戳
consumer_offset_33
consumer_offset_9
Producer2
consumer_offset_36
Follower2
Consumer3
⑥Follower1选举成新的Leader,此时LEO为3消息4和消息5丢失
consumer_offset_19
consumer_offset_38
进行索引分裂(和B+Tree很相似)
Consumer Group1
consumer_offset_21
Consumer1
深入消息写入机制当ack=all时
算法:hash(consumer group id) % __consumer_offsets主题的分区数
consumer_offset_26
consumer_offset_31
此处省略了N次分裂,最后会指向每一个有序的offset_id对应的索引序号
如果说目前需要指定time进行消费,那么kafka会先去timeIndex文件内找到该时间范围然后再到log文件内按范围查找到具体的消息
2.Consumer向topic中读取消息
B1_Topic1
①Follower完全赶上Leader,如果Leader没有消息,则阻塞
consumer_offset_50
.log日志文件
consumer_offset_22
consumer_offset_8
consumer_offset_6
consumer_offset_32
Leader
consumer_offset_17
300
4.consumer会不定期将自己分区内的offset根据算法提交到指定的consumer_offset_num
consumer_offset_13
Leader(原Follower1)
consumer_offset_18
consumer_offset_35
Consumer_offset(默认50个,可以进行设置)
consumer_offset_39
poll(time)
consumer_offset_46
2020-10-22 14:00:00
Broker2
深入消息写入机制当ack=1时
consumer_offset_28
Consumer的offset记录机制(用于指定offset进行消费)
B2_Topic1
B2_Topic2
Consumer2
Producer1
500
consumer_offset_34
consumer_offset_11
consumer_offset_20
Follower(原Follower2)
HW
consumer_offset_3
HW|LEO
Broker1
②producer--->
④Leader有新消息,将阻塞的Follower放开通知它们来取新消息,Follower开始获取
consumer_offset_41
consumer_offset_4
consumer_offset_47
consumer_offset_44
LEO
consumer_offset_49
consumer_offset_10
consumer_offset_12
0
Consumer4
.index索引文件
consumer_offset_45
consumer_offset_40
consumer_offset_27
consumer_offset_42
2020-10-22 15:00:00
consumer_offset_2
consumer_offset_14
.timeindex索引文件
consumer_offset_16
700
2020-10-22 12:00:00
B1_Topic2
⑥Follower获取失败并进行选举
⑥所有的Follower都将消息4和5同步,HW移动到LEO峰值
consumer_offset_30
consumer_offset_43
consumer_offset_23
2020-10-22 11:00:00
1000
consumer_offset_15
consumer_offset_24
consumer_offset_29
3.在Java底层,Consumer会一直调用poll(time)方法进行“长轮询”拉取消息
consumer_offset_7
⑤由于所有的ISR都同步到了消息4,HW移动到4,但是Follower2还没有完全把消息5同步,所以HW不会停留在5
如果说目前需要指定offset进行消费,那么kafka会先去index文件内找到该offset的id范围然后再到log文件内按范围查找到具体的消息
consumer_offset_5
深入Kafka设计原理(二)
Consumer层
0 条评论
下一页