Kafka中的常用术语
- Broker:Kafka集群包含一个或多个服务器,这种服务器被称为broker
- Topic:每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。(物理上不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处)
- Partition:parition是物理上的概念,每个topic包含一个或多个partition,创建topic时可指定parition数量。每个partition对应于一个文件夹,该文件夹下存储该partition的数据和索引文件
- Producer:负责发布消息到Kafka broker
- Consumer:消费消息。每个consumer属于一个特定的consumer group(可为每个consumer指定group
name,若不指定group name则属于默认的group)。使用consumer high level
API时,同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer
group可同时消费这一消息。
Kafka架构图示例

一个典型的kafka集群中包含若干producer(可以是web前端产生的page view,或者是服务器日志,系统CPU、memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。
生产者写入消息流程

- producer先从zookeeper的 "/brokers/…/state"节点找到该partition的leader;
- producer将消息发送给该leader;
- leader将消息写入本地log;
- followers从leader pull消息,写入本地log后向leader发送ACK;
- leader收到所有ISR中的replication的ACK后,增加HW(high watermark,最后commit 的offset)并向producer发送ACK。
文件存储机制
Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。
topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,且每条数据都有自己的offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。

由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment。每个segment对应两个文件——“.index”文件和“.log”文件。“.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中message的物理偏移地址。

index和log文件以当前segment的第一条消息的offset命名。下图为index文件和log文件的结构示意图:

Kafka分区策略
1

本文详细解析Kafka的架构、消息写入流程、文件存储机制、分区策略、数据可靠性保证、消费方式及分区分配策略。Kafka通过Zookeeper管理集群,使用Pull模式消费,提供 Exactly Once 语义,确保数据一致性。通过顺序写入、内存映射文件和零拷贝技术,实现高吞吐率。
最低0.47元/天 解锁文章
366

被折叠的 条评论
为什么被折叠?



