java——spring boot集成kafka——broker、主题、分区、副本——概念理解

发布时间 2023-03-26 14:52:25作者: 小白龙白龙马

一、代理商Broker

 

在之前我们已经为大家介绍了生产者向消息队列中投递消息,消费者从消息队列中拉取数据。

 

在kafka消息队列中有一个非常重要的概念就是代理Broker,大家可以想象生活中的商品代理商是做什么的?进货、存货、销货。

 

kafka的代理Broker也承担着同样的作用:接收消息、保存消息、为消费者提供消息。

 

 

具体到kafka架构层面,我们可以认为一个Broker代理就是一个kafka的服务实例。

 

 

kafka可以启动多个服务实例,组成一个具有多个Broker代理的服务集群。

 

 

通常一个集群内的Broker越多,kafka集群的整体吞吐能力就越强。

 

 

这个也好理解,现实生活中一个产品的代理商越多,销售能力就越强,是一个道理。

 

 

 

 

因为kafka通常时进行分布式部署,所以一个物理服务器(一个操作系统)通常只部署启动一个kafka实例,所以在这种场景下Broker代理就可以理解是一台服务器。

 

 

可不可以一个服务器部署多个kafka实例?可以,通过修改端口避免端口冲突是可以实现的,但是这样不好。因为kafka之所以分布式部署是考虑到高可用,

 

即:一台服务器宕机,kafka集群仍然可用。如果一个服务器部署多个kafka实例,一旦该服务器宕机,那么影响面就很大了,很可能直接将kafka集群拖垮。

 

 

 

 

 

 

 

 

=====================================================================================

 

 

 

 

 

 

 

 

 

二、主题与主题分区

 

代理商Broker可以帮助上产厂家对商品进行“进销存”,但是有一个问题,商品没有进行分类。

 

 

显然茅台酒和乳制品、猪肉等不同产品的销售周期、销售频率是不一样的,为了有效的安排商品进销存需要对商品进行分类。

 

 

同理,kafka接收到的消息有些是需要快速处理数据,有些是高频但时效性要求低的数据。所以要对消息数据进行分类,每一个分类被称为一个Topic(主题)。

 

 

笔者觉得Topic这个词在这里翻译成"渠道"会更好,但是更多的人已经认可“主题”这种翻译方式了,所以先入为主。

 

 

下图中中间实线部分是一个单kafka实例的Broker,包含三个Topic。也就是该代理商代理酒类、乳制品、零食三种商品。Topic主题是一个逻辑概念,用来对消息进行分类。

 

 

 

 

 

 

上图中虚线范围代表主题Topic,管道状图形代表主题的分区partition。

 

 

代理商将商品按照主题Topic进行分类,那么还有一个问题,如果一个代理商的工作是单线程的,处理高并发的工作时就捉襟见肘了。

 

所以,我们为Topic主题引入分区的概念,分区是一个实实在在的物理存在的队列数据结构用于存放数据,占用系统内存以及磁盘数据存储等资源

  • 分区是一个主题Topic的分区,所以主题Topic包含一个或多个分区。一个Topic包含多少个分区取决于该主题下的商品处理的吞吐量能力需求。
  • 因为Topic是一个逻辑概念,所以分区也可以被叫做"分区代理",一个代理Broker包含多个分区。就像一个省级代理可以包含多个地市级代理。

 

 

 

疑问点:

 

 

kafka的工作方式和其他MQ基本相同,只是在一些名词命名上有些不同。为了更好的讨论,这里对这些名词做简单解释。通过这些解释应该可以大致了解kafka MQ的工作方式。

  • Producer (P):就是网kafka发消息的客户端
  • Consumer (C):从kafka取消息的客户端
  • Topic (T):可以理解为一个队列
  • Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个 topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个CG只会把消息发给该CG中的一个 consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还 可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
  • Broker (B):一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
  • Partition(P):为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。

 

 

 

 

 

 

 

 

 

 

 

 

 

===========================================================================================

 

 

 

 

 

分区副本与高可用

 

 

解决完吞吐量的问题,下面就是如何保证kafka集群高可用的问题。

 

 

上文已经介绍:一个kafka集群包含多个Broker实例,通常每个Broker实例部署在不同的服务器上独立运行。

 

 

这就是分布式架构内保证高可用的常用方法之一:服务多实例。一个服务实例挂掉,还有其他实例可以提供服务,从而保证高可用。

 

 

那么保证分布式集群高可用的第二种方法:数据多副本,一个副本的数据丢失,还有其他的数据副本可以使用。

 

 

kafka的数据存在哪?分区,所以对于kafka来说保证数据不丢的高可用方式就是分区多副本。

 

 

 

 

 

Broker服务多实例、分区多副本结合到一起就是上面的这一张图,解释一下这张图:

  • 1个酒类主题包含4个分区,每个分区有三个副本(一主二从、同一颜色)
  • 三个分区副本分布式四个Broker服务实例上
  • 生产者只向主分区副本发送消息数据
  • 消费者也只从主分区副本拉取消息数据

 

另外,上图中的一个主题分区的三个分区副本之间的主从关系不是固定不变的,是根据分区副本所在的Broker服务实例的状态选举出来的。

 

举例说明,分区副本A、B、C,目前状态是A是主分区副本。如果分区副本A所在的Broker挂掉了,那么分区副本A就失去了“主副本资质”,在分区副本B和C之间重新选举一个主分区副本。

 

所以以上图所示的集群为例,分区副本分散存在于多个Broker服务实例上,所以即使其中1个或2个服务实例挂掉了,也不会使消息服务整体不可用。

 

因为还剩一个分区副本,生产者和消费者只和主分区副本(Leader)进行数据通信,从分区副本(Follower)只起到数据备份的作用。

 

 

 

 

 

 

 

 

 

 

 

1)Producer :消息生产者,就是向kafka broker发消息的客户端;

 

2)Consumer :消息消费者,向kafka broker取消息的客户端;

 

3)Consumer Group (CG):消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。

 

4)Broker :一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。

 

5)Topic :可以理解为一个队列,生产者和消费者面向的都是一个topic;

 

6)Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition**,每个partition是一个有序的队列;

 

7)Replica:副本,为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个leader和若干个follower;


8)leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是leader。

 

9)follower:每个分区多个副本中的“从”,实时从leader中同步数据,保持和leader数据的同步。leader发生故障时,某个follower会成为新的leader。

 

 

=============================================================================

 

 

 

 

 

 

一个集群中有多个broker(kafka服务器)

 

一个broker中可以有多个主题;

 

一个主题有多个分区,多个分区分布在不同的服务器上;

 

多副本(备份);

 

 

分区副本分散存在于多个Broker服务实例上,所以即使其中1个或2个服务实例挂掉了,也不会使消息服务整体不可用。

因为还剩一个分区副本,生产者和消费者只和主分区副本(Leader)进行数据通信,从分区副本(Follower)只起到数据备份的作用。

 

 

 

 

 

 

=================================================================================