kafka 基本概念
- Kafka是一种高吞吐量的分布式发布/订阅消息系统,这是官方对kafka的定义。
- kafka是Apache组织下的一个开源系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景。
- 比如基于hadoop平台的数据分析、低时延的实时系统、storm/spark流式处理引擎等。
- kafka现在它已被多家大型公司作为多种类型的数据管道和消息系统使用。
kafka 角色术语
- 在介绍架构之前,先了解下kafka中一些核心概念和各种角色。
1 | 1. Broker:Kafka集群包含一个或多个服务器,每个服务器被称为broker。 |
Kafka 拓扑架构
一个典型的Kafka集群包含若干Producer,若干broker、若干Consumer Group,以及一个Zookeeper集群。
Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。
Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。
Topic与 Partition
Kafka中的topic是以partition的形式存放的,每一个topic都可以设置它的partition数量。
Partition的数量决定了组成topic的log的数量。
推荐partition的数量一定要大于同时运行的consumer的数量。
另外,建议partition的数量大于集群broker的数量,这样消息数据就可以均匀的分布在各个broker中。
1 | 1. 那么,Topic为什么要设置多个Partition呢,这是因为kafka是基于文件存储的, |
Kafka 消息发送的机制
每当用户往某个Topic发送数据时,数据会被hash到不同的partition。(也可以通过指定 写到某一个partition中)
这些partition位于不同的集群节点上,所以每个消息都会被记录一个offset消息号,就是offset号。
消费者通过这个offset号去查询读取这个消息。
发送消息流程
首先获取topic的所有Patition,如果客户端不指定Patition,也没有指定Key的话,使用自增长的数字取余数的方式实现指定的Partition。
这样Kafka将平均的向Partition中生产数据。如果想要控制发送的partition,则有两种方式,
一种是指定partition,另一种就是根据Key自己写算法。实现其partition方法。
每一条消息被发送到broker时,会根据paritition规则选择被存储到哪一个partition。
如果partition规则设置的合理,所有消息可以均匀分布到不同的partition里,这样就实现了水平扩展。
同时,每条消息被append到partition中时,是顺序写入磁盘的,因此效率非常高,经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证。
1 | kafka 实现高效和内存无关,依靠顺序写入磁盘 |
Kafka 消息消费机制
Kafka中的Producer和consumer采用的是push(推送)、pull(拉取)的模式,即Producer只是向broker push消息,consumer只是从broker pull消息,
push和pull对于消息的生产和消费是异步进行的。
pull模式的一个好处是Consumer可自主控制消费消息的速率,同时Consumer还可以自己控制消费消息的方式是批量的从broker拉取数据还是逐条消费数据。
当生产者将数据发布到topic时,消费者通过pull的方式,定期从服务器拉取数据,当然在pull数据的时候,服务器会告诉consumer可消费的消息offset。
消费规则
- 不同 Consumer Group下的消费者可以消费partition中相同的消息,相同的Consumer Group下的消费者只能消费partition中不同的数据。
- topic的partition的个数和同一个消费组的消费者个数最好一致,如果消费者个数多于partition个数,则会存在有的消费者消费不到数据。
- 服务器会记录每个consumer的在每个topic的每个partition下的消费的offset,然后每次去消费去拉取数据时,都会从上次记录的位置开始拉取数据。
Kafka 消息存储机制
在存储结构上,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件,
每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。
partiton命名规则为topic名称+序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。
在每个partition (文件夹)中有多个大小相等的segment(段)数据文件,每个segment的大小是相同的,但是每条消息的大小可能不相同,因此segment 数据文件中消息数量不一定相等。
- segment数据文件有两个部分组成,分别为index file和data file,此两个文件是一一对应,成对出现,后缀”.index”和“.log”分别表示为segment索引文件和数据文件。
- 其实Kafka最核心的思想是使用磁盘,而不是使用内存,使用磁盘操作有以下几个好处:
1 | 1、磁盘缓存由Linux系统维护,减少了程序员的不少工作。 |