kafka把消息存在topic中,每一条消息包含键值(key),值(value)和时间戳(timestamp)。
Topic由用户定义并配置在Kafka服务器,用于建立Producer和Consumer之间的订阅关系。生产者发送消息到指定的Topic下,消息者从这个Topic下消费消息。
消息分区,一个topic可以分为多个 partition,每个partition是一个有序的队列。
partition中的每条消息都会被分配一个有序的id(offset)。
每个Partition里的数据默认保留时间是一周, 并且一旦数据写入后,数据就不能被更改(immutability)
如上图所示,kafka将topic中的消息存在不同的partition中。如果存在键值(key),消息按照键值(key)做分类存在不同的partiition中,如果不存在键值(key),消息按照轮询(Round Robin
)机制存在不同的partition中。默认情况下,键值(key)决定了一条消息会被存在哪个partition中。
一个Kafka集群是由多个Broker组成的,每个Broker其实就是一台服务器。
每个broker都有自己的id,这个id必须为整数。
只要连接到任何一个broker,就能连接到整个集群。
broker可以设置为3个,某些大型集群可能有100个。
kafka将partition的数据复制到不同的broker,提供了partition数据的备份。这个数值叫做Replication factor
, 通常是2或3,这样即使一个broker挂了,其他的broker继续可以服务:
例如,下面的Topic-A的replication factor
是2:
Partition 0和Partition1都有一个副本, 如果broker 102挂了,剩下的两个可以继续服务。
每一个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中: