Kafka
2022-06-19 22:46:36 3 举报
Kafka详解
作者其他创作
大纲/内容
Product2
应用程序缓冲区
5
consumer-1LeaderCoordinator
2
c1
1
3
4
10
7
8
p4
...
pull
push
6
p0
p2
p5
round-robin策略
LEO
follower
9
Partition3Commit Log
C3
HW/LEO
0
Consumer Group 0
Kafka-0GroupCoordinator
leader
同步消息
Kafka commit log
同步状态
stick策略
Topic APartition 0(Leader)
Broker-2
3.1 SyncGroupRequest发送分区方案
Consumer 2
HW/LEO机制
Topic APartition 2(follower)
Broker: 消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群Topic: Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topicProducer: 消息生产者,向Broker发送消息的客户端Consumer: 消息消费者,从Broker读取消息的客户端ConsumerGroup: 每个Consumer属于一个特定的Consumer Group,一条消息可以被多个不同的Consumer Group消费,但是一个Consumer Group中只能有一个Consumer能够消费该消息Partition: 物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的Controller: 在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。
c3
Topic APartition 1(Follwer)
Kafka Cluster
X
文件读取缓冲区
11
HW
Topic APartition 1(follower)
3.2 下发分区方案
内核
Kafka日志分段存储
②
sendfile
p1
DMA拷贝
CPU拷贝
C7
Old
每4k分发一个offset
③
Product0
C1
Product1
/controller
consumer
Topic BPartition 0(Follower)
Kafka3种Rebalance策略
Broker-1
Topic BPartition 0(Leader)
KafkaCluster
Topic CPartition 0(Leader)
Zookeeper Cluster
ConsumerGroup A
Consumer 1
follower1
ComsumerGroup B
follower2
①
C6
Kakfa主要有三种rebalance的策略:range、round-robin、sticky。Kafka 提供了消费者客户端参数partition.assignment.strategy 来设置消费者与订阅主题之间的分区分配策略。默认情况为range分配策略。假设一个主题有6个分区(0-5),现在有三个consumer消费:range策略: 就是按照分区序号排序,假设 n=分区数/消费者数量 = 2, m=分区数%消费者数量 = 1,那么前 m 个消费者每个分配 n+1 个分区,后面的(消费者数量-m )个消费者每个分配 n 个分区。round-robin策略: 就是轮询分配,比如分区0、3 给一个consumer,分区1、4给一个consumer,分区2、5给一个consumersticky策略: 初始时分配策略与round-robin类似,但是在rebalance的时候,需要保证如下两个原则。1. 分区的分配要尽可能均匀 。2. 分区的分配尽可能与上次分配的保持相同。font color=\"#d32f2f\
P0
C5
P3
Controller
{\"controller_epoll\
P2
用户进程
Partition是一个有序的message序列,这些message按顺序添加到一个叫做commit log的文件中。每个partition中的消息都有一个唯一的编号,称之为offset,用来唯一标示某个分区中的message。 每个partition,都对应一个commit log文件。一个partition中的message的offset都是唯一的,但是不同的partition中的message的offset可能是相同的。每个consumer是基于自己在commit log中的消费进度(offset)来进行工作的。在kafka中,消费offset由consumer自己来维护;一般情况下我们按照顺序逐条消费commit log中的消息,当然我可以通过指定offset来重复消费某些消息,或者跳过某些消息。
New
p3
Topic APartition 1(Leader)
P1
Topic APartition 0(Follower)
Partition0Commit Log
range策略
2.1 JoinGroupRequest
Partition2Commit Log
Service2
Kafka零拷贝
c2
1.1 FindCoordinatorRequest
leader(原follower1)
结合ack=1
Consumer
同步ISR信息
kafka底层通过操作系统的sendfile来实现零拷贝1.减少了2次内核与用户态的数据拷贝2.减少了内核与用户空间上下文切换sendfile当调用sendfile()时,DMA将磁盘数据复制到kernel buffer,然后将内核中的kernel buffer直接拷贝到socket buffer;只有记录数据位置和长度的描述符会被加入到socket缓冲区中。DMA模块将数据直接从内核缓冲区传递给协议引擎,从而消除了遗留的最后一次复制。sendfile消耗成本:3次拷贝,2次上下文切换。详细原理见《IO模型详解》笔记
Topic CPartition 0(Follower)
ConsumerGroup-1
Kafka基础架构
kafka 通过分段的方式将 数据分为多个 LogSegment,每个 LogSegment 包含一个日志文件以及两个所以文件。这样可以避免数据文件无限制地扩展。通过 log.segment.bytes 参数可以设置 LogSegment 的大小。Log分为三种:00000000000000000000.log 里存储的是消息内容,这个就是日志文件00000000000000000000.index 里存储的是消息索引00000000000000000000.timeindex 里存储的是按时间的索引index 和 timeindex 两个索引文件,是 kafka 为了提高查找消息的性能,为每一个日志文件添加的索引文件。index 文件中存储了部分offset 以及物理偏移量 (offset 和 物理偏移量的对应关系),这样就可以通过 offset 来方便地找到真正的消息体。根据 offset 查找时,在 index 文件中类似二分查找到最接近于 目标offset 的索引,以及它对应的物理偏移量,再根据这个索引以及物理偏移量,去 log 中查找想要的 offset 对应的消息。
网络设备缓冲区
/brokers/topics/topic_A/partitions/partition_0/state
Broker-0
Topic APartition 1(Follower)
consumer-2
第一阶段:选择组协调器组协调器GroupCoordinator:每个consumer group都会选择一个broker作为自己的组协调器coordinator,负责监控这个消费组里的所有消费者的心跳,以及判断是否宕机,然后开启消费者rebalance。consumer group中的每个consumer启动时会向kafka集群中的某个节点发送 FindCoordinatorRequest 请求来查找对应的组协调器GroupCoordinator,并跟其建立网络连接。第二阶段:加入消费组JOIN GROUP在成功找到消费组所对应的 GroupCoordinator 之后就进入加入消费组的阶段,在此阶段的消费者会向 GroupCoordinator 发送 JoinGroupRequest 请求,并处理响应。然后GroupCoordinator 从一个consumer group中选择第一个加入group的consumer作为leader(消费组协调器),把consumer group情况发送给这个leader,接着这个leader会负责制定分区方案。第三阶段(SYNC GROUP)consumer leader通过给GroupCoordinator发送SyncGroupRequest,接着GroupCoordinator就把分区方案下发给各个consumer,他们会根据指定分区的leader broker进行网络连接以及消息消费。
1.2 选出GroupCoordinator2.2 选出LeaderCoordinator
套接字发送缓冲区
Commit LogIndex
Service1
Producer
ISR机制与Partition同步
Kafka-2
C4
Commit Log
Partition1Commit Log
Kafka-1
C2
Kafka消费者
ComsumerGroup A
Kafka消费者Rebalance机制
broker消息磁盘
{\"version\
④
Broker-0Controller
ISR机制isr 是replicas的一个子集,它只列出当前还存活着的,并且已同步备份了该partition的节点。并且ISR列表会通过集群中的Controller同步状态到zookeeper当中。并且在zookeeper中,为临时节点,若出现节点值的变化,则会通知其他follower。HW/LEOHW俗称高水位,HighWatermark的缩写,取一个partition对应的ISR中最小的LEO(log-end-offset)作为HW。消费者,只对HW的消息可见。font color=\"#f44336\
Commit LogTimeindex
Consumer Group 1
按照时间定位消息的offset
0 条评论
回复 删除
下一页