Topics、Partitions和Brokers

Topic

kafka把消息存在topic中,每一条消息包含键值(key),值(value)和时间戳(timestamp)。

Topic由用户定义并配置在Kafka服务器,用于建立Producer和Consumer之间的订阅关系。生产者发送消息到指定的Topic下,消息者从这个Topic下消费消息。

Partition

消息分区,一个topic可以分为多个 partition,每个partition是一个有序的队列。

  • partition中的每条消息都会被分配一个有序的id(offset)。

  • 每个Partition里的数据默认保留时间是一周, 并且一旦数据写入后,数据就不能被更改(immutability)

image-20201205215326231

如上图所示,kafka将topic中的消息存在不同的partition中。如果存在键值(key),消息按照键值(key)做分类存在不同的partiition中,如果不存在键值(key),消息按照轮询(Round Robin)机制存在不同的partition中。默认情况下,键值(key)决定了一条消息会被存在哪个partition中。


Broker

  • 一个Kafka集群是由多个Broker组成的,每个Broker其实就是一台服务器。

  • 每个broker都有自己的id,这个id必须为整数。

  • 只要连接到任何一个broker,就能连接到整个集群。

  • broker可以设置为3个,某些大型集群可能有100个。

img

kafka将partition的数据复制到不同的broker,提供了partition数据的备份。这个数值叫做Replication factor, 通常是2或3,这样即使一个broker挂了,其他的broker继续可以服务:

例如,下面的Topic-A的replication factor是2:

image-20201206072204083

Partition 0和Partition1都有一个副本, 如果broker 102挂了,剩下的两个可以继续服务。

image-20201206072409784

每一个partition都有一个broker作为leader,若干个broker作为follower。所有的数据读写都通过leader所在的服务器进行,并且leader在不同broker之间复制数据。

Client向Partition 1中写入数据时,会写入到Broker 2,因为Broker 2是Partition 1的Leader,然后Broker 2再将数据复制到follower Broker 1和Broker 3中:

img