kafka架构详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kafka架构详解相关的知识,希望对你有一定的参考价值。

参考技术A kafka是一个高性能、低延迟的分布式发布-订阅消息系统,适用于在线、离线消息消费,为了防止数据丢失,kafka将消息持久化到磁盘上并在集群内复制.

在深入了解kafka之前,先介绍kafka体系架构中的一些组件,包括Topic、Producer、Consumer、Consumer Group、Broker、Partition、Leader、Follower。

Topic

消息被发送到kafak中都有一个类别,这个类别叫做Topic,kafka中的消息都是通过主题进行组织的,一个Topic可以有1个或多个Partition。

Producer

生产者,即是将消息发送到kafka的过程,发送消息是需要指定Topic,并且可以指定Partition。Broker接收到消息后,将消息存放在partition中。

Consumer

消费者,从broker topic中读取消息,可以订阅一个或多个topic。

Consumer Group

消费者组由一个或多个消费者组成,消费者组中的消费者共同消费一个主题的分区,主题中每个分区只能被同一个消费者组中的一个消费者消费。

Broker

kafka集群包括一个或多个节点,每个节点就叫做Broker。

Partition

Topic中的数据可以分割为一个或多个Partition,Partition在底层逻辑是log文件,每个Partition由多个Segment组成,任何发送到kafka的消息最终都是会被追加到log文件的尾部。

Leader

Topic的Partition允许有若干个副本,每个分区都一个leader和多个follower,leader负责所有的读写操作。

Follower

Follower追随Leader,所有的读写请求都是通过Leader路由,请求会广播给所有的Follower,Follower和Leader保持数据同步。如果Leader失效,通过Follower选举一个新的Leader.

下面通过一张简单的UML图简要说明组件之间的交互和关联关系

主要关系说明如下

- kafka集群可以有1个或多个Broker

- Broker 可以包含多个副本(每个分区可以包含多个副本,通常每个分区副本数不会多于Broker数量,一个broker中包含很多个分区)

- Topic可以有1个或多个分区

- broker中的每个partition可以有0个或1个副本

- 一个partition有一个leader副本和0个或多个follower副本

- partition的每个副本都必须位于单独的broker上

- 每个partition副本位于一个broker上,并且一个partition不能划分多个broker。

Kafka架构

下面重点介绍Producer、Topic、Consumer的关系,一个简单生产消费的过程例子如下图所示

在这个例子中,一个生产者将消息发送给单个topic

上面这个图中,1个生产者发布消息到1个topic,一个消费者消费1个Topic,如上图中的Producer 1和Consumer 1;一个Topic可以是由多个生产者发布消息,如Topic4;1个消费者可以消费多个Topic,如图中的Consumer 2。

如上图的例子,一个生产者可以给多个Topic发布消息。一个消费者同一时间只能给一个topic发布消息,但是可以使用异步发布消息,生产者可以一次将多个消息发送给多个Topic.

生产者负责将每条消息发送到分区,默认分区由消息key通过hash算法确定,如果没有指定消息key,则通过循环轮询来确定分区。但是在实际业务场景中,默认的分区行为并不能满足业务需要,比如需要确保消息的顺序或需要将消息平均分配给消费者等等。因此,生产者在发布消息的时候可以使用自定义分区方式,为消息指定分区key、重写分区算法或手动设置分区等方式将消息发布到特定分区。

kafka内部运作的基本逻辑大概为:每个主题都有1个或多个分区,这些分区分不在1个或多个Broker上,为了提高消息的可靠性不会丢失,可以配置多个副本因子,这样每个分区可以被复制到一个或多个Broker上,每个分区对应一个log文件,只能被一个消费组中的一个消费者消费,用于提高Topic的并发性。因此一般将消费组消费者数量设置为小于或者等于topic的分区数量,如果要增加消费者也相应的增加对应的分区数量。

同一个分区内的消息是由顺序的,每个分区仅能被同一个消费组中的一个消费者顺序消费。但是,当多个消费组订阅了同一个topic,则每个组中的消费者都会收到消息。

下面例子说明多分区情况下,消费者组和消费者消费的几种情况。

分区数和消费者数相同,如下图所示

这种情况,同一个消费组的每个消费者只消费一个分区。

另外一种情况,消费组中的消费者数量多于分区数,如下图所示

消费者数量多于分区数,则某些消费者就处于空闲状态,当有消费者down掉或添加新的分区情况时,空闲消费者将发挥作用。

另外一种情况,消费者数比分区数少,如下图所示

这种情况,导致某些分区需要负责更多的分区,处理更多的消息。

最后,多个消费组消费了同一个topic

topic消息被广播到每个消费组,每个消费组都可以接受同一个消息。这是kafka实现一个Topic广播的方式,一个Topic可以被多个Conumse Group的消费者同时消费;同一个消息只能被一个消费者组中的一个消费者消费。

以上是关于kafka架构详解的主要内容,如果未能解决你的问题,请参考以下文章

详解kafka架构原理与安装部署

2 万字长文深入详解 Kafka,从源码到架构全部讲透

kafka详解(架构集群)-step1

多图详解Kafka 优秀的架构设计!它的高性能是如何保证的?

2 万字长文深入详解 Kafka,从源码到架构全部讲透

KafkaConsumer 架构设计剖析和源码全流程详解