0%

Kafka基本概念

一个经典的Kafka架构包括若干个Producer、Broker、Consumer和ZooKeeper集群。

ZooKeeper是Kafka用来负责集群元数据的管理以及控制器的选举。

Producer将消息发送到Broker中去,Broker负责将收到的消息存储到磁盘当中,然后Consumer负责从Broker订阅并且消费消息。

Kafka还有两个重要的概念就是主题Topic以及分区Partition。Kafka中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题,消费者负责订阅主题并进行消费。

主题是一个逻辑上的概念,还可以细分为多个分区,一个分区只属于单个主题。同一主题下不同分区包含的消息是不同的。分区在存储层面可以看作一个可以追加的日志,消息在追加到分区日志文件的时候会分配一个特定的偏移量offset。offset是消息在分区中的唯一标识,Kafka通过offset来保证消息在分区中的顺序性。但是offset不跨越分区,因此Kafka只保证分区有序而不保证主题有序。

Kafka的分区可以分布在不同的服务器上,横跨多个Broker,以此来提供比单个Broker更强大的性能。当消息发送到Broker之前,会根据分区规则选择存储到哪个分区。

Kafka为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力。同一分区的不同副本中保存的是相同的消息,但在同一时刻副本之间的消息可能并非完全相同,副本之间是一主多从的关系,其中leader副本负责处理读写请求,follower副本只负责与leader副本消息同步。副本处于不同的broker中,当leader副本出现故障时,从follower副本中重新选举新的leader副本继续对外提供服务。通过该机制使得Kafka集群中某个Broker失效时仍然能够对外提供服务。

分区中所有的副本称为AR(Assigned Replicas),所有与leader副本保持一定程度同步的副本组成ISR(In-Sync-Replicas)。当消费者发送消息时,会先发送到leader节点,然后follower节点才能从leader副本中拉取消息进行同步,同步期间follower副本相对于leader副本会有一定程度上的落后。与leader副本同步滞后过多的副本称为OSR(Out-of-Sync Replicas)。当leader副本发生故障时,只有ISR集合中的副本才有资格选举为新的leader。

Kafka的消费端也有容灾能力,Consumer使用拉(Pull)模式从服务端拉取消息,并且保存消费的具体位置。当消费者宕机重启时可以根据之前保存的消费位置重新拉取需要的消息进行消费。