Kafka 概要介绍 | Kafka 01

460 阅读5分钟

Kafka 的适用场景

官方文档对 Kafka 的定义是

Apache Kafka® is a distributed streaming platform.

这是一个简单朴实让人难以捉摸的自我介绍。那在什么情况下可以使用它呢。有这么几种场景

  • 当你需要一个消息系统时,可以考虑使用它。Kafka 提供了一个消息系统一般会具备的两种特性:消息队列和发布订阅
  • 当你需要一个分布式的存储系统时,可以考虑使用它。Kafka 支持消息的持久化,你可以选择产生而不消费消息,以这种将信息保留到磁盘。Kafka 支持数据的多副本,高容错,即使一个副本损坏了可以由其他副本替代。另外令人泪目的是,数据量的增长并不会影响它的性能,你可以按你的需要不断的扩充集群
  • 如果你需要进行流式计算,可以考虑使用它。它允许你实时处理源源不断的流数据。

Kafka 的核心概念

介绍完 Kafka 的用途,接下来介绍 Kafka 中几个核心的概念。

  • 集群(cluster) - Kafka 是一个分布式的流式平台,所以它可以以集群的形式在多条机器上运行
  • topic(主题) - 生产者将数据写入到不同的 topic 中,消费者可以订阅不同的 topic 并消费其中的数据。可以暂时简单理解成,将流式记录归成不同的分类,这个分类就是 topic
  • 生产者,负责发布数据到 topic
  • 消费者,负责从 topic 中获取并处理数据

Kafka 的结构

Topic

Topic 是很多条流记录的集合,可以先简单把它认为是一条队列,流记录不断地写入到队列中。

Topic 由一个或者多个分区组成,Topic 按一定的规则将记录发布到不同的分区中。如下图所示,topic 分成了三个分区,每个分区负责保存一部分数据。新产生的数据不断地追加到某一个分区的尾端,分区将保证这些数据是有序的,并且顺序是不变的。同时,分区给每条记录分配一个称之为 offset 的标识符,用于唯一标记一条记录。


Kafka 可以为记录设置保留时间。当记录发布到 topic 之后,在保留时间之内,无论记录有没有被消费,都可以持久化地存储在 topic 中,随时可以被继续消费。无论积累的记录有多少,都不会影响 Kafka 的性能。

分区(Partition)

前面说过 topic 是由一个或者多个分区组成的。每个分区中的记录都是有序的(按发布到 topic 的时间)。

将 topic 分成多个分区有什么好处呢?

  • 有助于水平扩展。每台机器的存储空间是有限的,当一台机器容纳不下所有数据时,最直接的想法就是将数据分散到多台机器中。Kafka 将 topic 分成多个分区,不同的分区分布到多个机器中,这样就可以很方便地实现扩展
  • 提高性能。同个 topic 的不同分区的数据是可以被并行处理的。这样可以并行消费一个 topic 中多个分区的数据
  • 负载均衡。分成多个分区并发布到多台机器中,可以让读写请求更均衡地落到不同的机器上,减轻单台机器的压力
同时,每个分区都会依照配置保留多个副本以便容灾。一个作为 leader,其他分区副本作为 follower。Leader 负责所有的读写请求,follower 负责复制 leader 的数据。当 leader 挂掉时,就会选举 follower 中的一个成为新的 leader。Kafka 会让 leader 尽可能均衡地分散在不同的机器节点,以便均衡负载。

同个分区内的数据是保证顺序的,但是同个 topic 的不同分区之间的数据是不保证顺序的。

生产者(Producer)

生产者负责选择 topic 和分区,将数据发布到分区中

消费者(Consumer)

消费者负责从 topic 的分区中取出并处理数据。实际上,消费者不是一个个孤立的个体,而是被组织成一个消费组,一个消费组有一个或多个消费者。消费组订阅 topic,然后该组内的消费者从这个 topic 里取数据。同个消费组内的消费者允许发布在不同的机器中。如下图。


如上图,一个 topic 分成了四个分区 P0 ~ P3,其中 P0 和 P3 在 Server1 上,P1 和 P2 在 Server2 上。一个 topic 允许有多个订阅者(每个订阅者是一个消费组)。对于上面的例子,有两个消费组订阅了这个 topic,即消费组 A 和消费组 B。消费组 A 中有 C1 和 C2 两个消费者实例,消费组 B 中有 C3、C4、C5 和 C6 四个消费者实例。

同个消费组里,topic 的一个分区只能由其中一个消费者实例消费,但一个消费者实例可以处理多个分区(这也就意味着消费者实例的数量不会多于分区的数量)。比如上例中,对于消费组 A,P0 和 P3分配给了 C1,C1 负责处理这两个分区的记录,C2 不能处理这两个分区的记录。如果消费组里新增了消费者,则会选择一些其他消费者负责的分区分配给它。如果消费组里移除了某个消费者,它所负责的分区将分配给同组里的其他消费者。

Kafka 提供的保证

这里直接引用官网原文的描述

At a high-level Kafka gives the following guarantees:

  • Messages sent by a producer(生产者) to a particular topic partition(分区) will be appended in the order they are sent. That is, if a record M1 is sent by the same producer as a record M2, and M1 is sent first, then M1 will have a lower offset than M2 and appear earlier in the log.(即提供写顺序保证)
  • A consumer instance(消费者实例) sees records in the order they are stored in the log.(即提供读顺序保证)
  • For a topic with replication factor N, we will tolerate up to N-1 server failures without losing any records committed to the log.(即提供多副本保证数据不丢失)


资料参考:http://kafka.apache.org/intro