03 kafka 基础入门


kafka 基本概念

  1. Kafka是一种高吞吐量的分布式发布/订阅消息系统,这是官方对kafka的定义。
  2. kafka是Apache组织下的一个开源系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景。
  3. 比如基于hadoop平台的数据分析、低时延的实时系统、storm/spark流式处理引擎等。
  4. kafka现在它已被多家大型公司作为多种类型的数据管道和消息系统使用。

kafka 角色术语

  1. 在介绍架构之前,先了解下kafka中一些核心概念和各种角色。
1
2
3
4
5
6
7
8
1. Broker:Kafka集群包含一个或多个服务器,每个服务器被称为broker。
2. Topic:每条发布到Kafka集群的消息都有一个分类,这个类别被称为Topic(主题)。 *****
3. Producer:指消息的生产者,负责发布消息到Kafka broker。
4. Consumer :指消息的消费者,从Kafka broker拉取数据,并消费这些已发布的消息。
5. Partition:Parition是物理上的概念,每个Topic包含一个或多个Partition,每个partition都是一个有序的队列。
partition 中的每条消息都会被分配一个有序的id (称为offset)(号码标识)。 *****
6. Consumer Group:消费者组,可以给每个Consumer指定消费者组,若不指定消费者组,则属于默认的group。
7. Message:消息,通信的基本单位,每个producer可以向一个topic发布一些消息。

Kafka 拓扑架构

  1. 一个典型的Kafka集群包含若干Producer,若干broker、若干Consumer Group,以及一个Zookeeper集群。

  2. Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。

  3. Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。

Topic与 Partition

  1. Kafka中的topic是以partition的形式存放的,每一个topic都可以设置它的partition数量。

  2. Partition的数量决定了组成topic的log的数量。

  3. 推荐partition的数量一定要大于同时运行的consumer的数量。

  4. 另外,建议partition的数量大于集群broker的数量,这样消息数据就可以均匀的分布在各个broker中。

1
2
3
4
5
6
1. 那么,Topic为什么要设置多个Partition呢,这是因为kafka是基于文件存储的,
2. 通过配置多个partition可以将消息内容分散存储到多个broker上,这样可以避免文件尺寸达到单机磁盘的上限。
3. 同时,将一个topic切分成任意多个partitions,可以保证消息存储、消息消费的效率,
4. 因为越多的partitions可以容纳更多的consumer,可有效提升Kafka的吞吐率。
5. 因此,将Topic切分成多个partitions的好处是可以将大量的消息分成多批数据同时写到不同节点上,
将写请求分担负载到各个集群节点。

Kafka 消息发送的机制

  1. 每当用户往某个Topic发送数据时,数据会被hash到不同的partition。(也可以通过指定 写到某一个partition中)

  2. 这些partition位于不同的集群节点上,所以每个消息都会被记录一个offset消息号,就是offset号。

  3. 消费者通过这个offset号去查询读取这个消息。

发送消息流程

  1. 首先获取topic的所有Patition,如果客户端不指定Patition,也没有指定Key的话,使用自增长的数字取余数的方式实现指定的Partition。

  2. 这样Kafka将平均的向Partition中生产数据。如果想要控制发送的partition,则有两种方式,

  3. 一种是指定partition,另一种就是根据Key自己写算法。实现其partition方法。

  4. 每一条消息被发送到broker时,会根据paritition规则选择被存储到哪一个partition。

  5. 如果partition规则设置的合理,所有消息可以均匀分布到不同的partition里,这样就实现了水平扩展。

  6. 同时,每条消息被append到partition中时,是顺序写入磁盘的,因此效率非常高,经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证。

1
kafka 实现高效和内存无关,依靠顺序写入磁盘

Kafka 消息消费机制

  1. Kafka中的Producer和consumer采用的是push(推送)、pull(拉取)的模式,即Producer只是向broker push消息,consumer只是从broker pull消息,

  2. push和pull对于消息的生产和消费是异步进行的。

  3. pull模式的一个好处是Consumer可自主控制消费消息的速率,同时Consumer还可以自己控制消费消息的方式是批量的从broker拉取数据还是逐条消费数据。

  4. 当生产者将数据发布到topic时,消费者通过pull的方式,定期从服务器拉取数据,当然在pull数据的时候,服务器会告诉consumer可消费的消息offset。

消费规则

  1. 不同 Consumer Group下的消费者可以消费partition中相同的消息,相同的Consumer Group下的消费者只能消费partition中不同的数据。
  2. topic的partition的个数和同一个消费组的消费者个数最好一致,如果消费者个数多于partition个数,则会存在有的消费者消费不到数据。
  3. 服务器会记录每个consumer的在每个topic的每个partition下的消费的offset,然后每次去消费去拉取数据时,都会从上次记录的位置开始拉取数据。

Kafka 消息存储机制

  1. 在存储结构上,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件,

  2. 每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。

  3. partiton命名规则为topic名称+序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。

  4. 在每个partition (文件夹)中有多个大小相等的segment(段)数据文件,每个segment的大小是相同的,但是每条消息的大小可能不相同,因此segment 数据文件中消息数量不一定相等。

  1. segment数据文件有两个部分组成,分别为index file和data file,此两个文件是一一对应,成对出现,后缀”.index”和“.log”分别表示为segment索引文件和数据文件。

  1. 其实Kafka最核心的思想是使用磁盘,而不是使用内存,使用磁盘操作有以下几个好处:
1
2
3
4
1、磁盘缓存由Linux系统维护,减少了程序员的不少工作。
2、磁盘顺序读写速度超过内存随机读写。
3、JVM的GC效率低,内存占用大。使用磁盘可以避免这一问题。
4、系统冷启动后,磁盘缓存依然可用。