服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 超简单的Kafka架构入门指南,看这一篇就够了

超简单的Kafka架构入门指南,看这一篇就够了

2023-05-08 14:09一灯架构 Java教程

本文简单介绍了Kafka架构,以及架构中涉及到底的一些名词概念,包括Producer(生产者)、Consumer(消费者)、Broker(代理节点)、Topic(主题)、Partition(分区)、Leader Replica(领导者副本)、Follower Replica(跟随者副本)、LEO(Lo

1. Kafka简介

Apache Kafka 是一种高吞吐、分布式的流处理平台,由 LinkedIn 开发并于 2011 年开源。它具有高伸缩性、高可靠性和低延迟等特点,因此在大型数据处理场景中备受青睐。Kafka 可以处理多种类型的数据,如事件、日志、指标等,广泛应用于实时数据流处理、日志收集、监控和分析等领域。

通常用作消息队列和流处理,作为消息队列的时候,竞品有RabbitMQ、ActiveMQ、RocketMQ、Apache Pulsar等。

2. Kafka架构

下面介绍一下Kafka架构中最重要的三个参与者:

  1. Producer(生产者):生产者负责将消息发送到 Kafka 集群。
  2. Consumer(消费者):消费者负责从 Kafka 集群中拉取并消费消息。
  3. Broker(代理节点):Broker 是 Kafka 集群中的一个服务代理节点,可以看作是一台服务器。Kafka 集群通常由多个 Broker 组成,以实现负载均衡和容错。

超简单的Kafka架构入门指南,看这一篇就够了

3. 分区与副本

Kafka为了对消息进行分类,引入了Topic(主题)的概念。生产者在发送消息的时候,需要指定发送到某个Topic,然后消息者订阅这个Topic并进行消费消息。

Kafka为了提升性能,又在Topic的基础上,引入了Partition(分区)的概念。Topic是逻辑概念,而Partition是物理分组。一个Topic可以包含多个Partition,生产者在发送消息的时候,需要指定发送到某个Topic的某个Partition,然后消息者订阅这个Topic并消费这个Partition中的消息。

Kafka为了提高系统的吞吐量和可扩展性,把一个Topic的不同Partition放到多个Broker节点上,充分利用机器资源,也便于扩展Partition。

Kafka为了保证数据的安全性和服务的高可用,又在Partition的基础上,引入Replica(副本)的概念。一个Partition包含多个Replica,Replica之间是一主多从的关系,有两种类型Leader Replica(领导者副本)Follower Replica(跟随者副本),Replica分布在不同的Broker节点上。

Leader Replica负责读写请求,Follower Replica只负责同步Leader Replica数据,不对外提供服务。当Leader Replica发生故障,就从Follower Replica选举出一个新的Leader Replica继续对外提供服务,实现了故障自动转移。

下图展示的是,同一个Topic的不同Partition在Broker节点的分布情况:

超简单的Kafka架构入门指南,看这一篇就够了

Kafka为了提升Replica的同步效率和数据写入效率,又对Replica进行分类。针对一个Partition的所有Replica集合统称为AR(Assigned Replicas,已分配的副本),包含Leader Replica和Follower Replica。与Leader Replica保持同步的Replica集合称为ISR(In-Sync Replicas,同步副本),与Leader Replica保持失去同步的Replica集合称为OSR(Out-of-Sync Replicas,失去同步的副本)AR = ISR + OSR

Leader Replica将消息写入磁盘前,需要等ISR中的所有副本同步完成。如果ISR中某个Follower Replica同步数据落后Leader Replica过多,会被转移到OSR中。如果OSR中的某个Follower Replica同步数据追上了Leader Replica,会被转移到ISR中。当Leader Replica发生故障的时候,只会从ISR中选举出新的Leader Replica。

4. 偏移量

Kafka为了记录副本的同步状态,以及控制消费者消费消息的范围,于是引入了LEO(Log End Offset,日志结束偏移量)HW(High Watermark,高水位)。

LEO表示分区中的下一个被写入消息的偏移量,也是分区中的最大偏移量。LEO用于记录Leader Replica和Follower Replica之间的数据同步进度,每个副本中各有一份。

HW表示所有副本(Leader和Follower)都已成功复制的最小偏移量,是所有副本共享的数据值。换句话说,HW之前的消息都被视为已提交,消费者可以消费这些消息。用于确保消息的一致性和只读一次。

下面演示一下LEO和HW的更新流程:

  1. 初始状态,三个副本中各有0和1两条消息,LEO都是2,位置2是空的,表示是即将被写入消息的位置。HW也都是2,表示Leader Replica中的所有消息已经全部同步到Follower Replica中,消费者可以消费0和1两条消息。

超简单的Kafka架构入门指南,看这一篇就够了

  1. 生产者往Leader Replica中发送两条消息,此时Leader Replica的LEO的值增加2,变成4。由于还没有开始往Follower Replica同步消息,所以HW值和Follower Replica中LEO值都没有变。由于消费者只能消费HW之前的消息,也就是0和1两条消息。

超简单的Kafka架构入门指南,看这一篇就够了

  1. Leader Replica开始向Follower Replica同步消息,同步速率不同,Follower1的两条消息2和3已经同步完成,而Follower2只同步了一条消息2。此时,Leader和Follower1的LEO都是4,而Follower2的LEO是3,HW表示已成功同步的最小偏移量,值是3,表示此时消费者只能读到0、1、2,三条消息。

超简单的Kafka架构入门指南,看这一篇就够了

  1. 所有消息都同步完成,三个副本的LEO都是4,HW也是4,消费者可以读到0、1、2、3,四条消息。

超简单的Kafka架构入门指南,看这一篇就够了

5. 消费者组

Kafka为了提高消息的处理效率,引入了消费者组的概念。一个消费者组(Consumer Group)包含多个消费者,一个消费者组可以同时订阅多个Topic,一个Topic也可以同时被多个消费者组订阅。

为了保证同一个Partition的消息被顺序处理,针对一个消费者组,一个Partition的消息只会交给这个消息者组的一个消费者处理。

超简单的Kafka架构入门指南,看这一篇就够了

6. 总结

本文简单介绍了Kafka架构,以及架构中涉及到底的一些名词概念,包括Producer(生产者)、Consumer(消费者)、Broker(代理节点)、Topic(主题)、Partition(分区)、Leader Replica(领导者副本)、Follower Replica(跟随者副本)、LEO(Log End Offset,日志结束偏移量)、HW(High Watermark,高水位)、Consumer Group(消费者组)等。

原文地址:https://mp.weixin.qq.com/s/AL47zpYKMxecbqU7jpdN0g

延伸 · 阅读

精彩推荐
  • Java教程java基础之方法详解

    java基础之方法详解

    这篇文章主要介绍了java基础之方法详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下...

    池鱼i_6552021-10-14
  • Java教程带你用Java全面剖析类和对象

    带你用Java全面剖析类和对象

    下面小编就为大家带来一篇全面理解Java类和对象。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    富春山居_ZYY5072021-12-29
  • Java教程mybatis的mapper特殊字符转移及动态SQL条件查询小结

    mybatis的mapper特殊字符转移及动态SQL条件查询小结

    mybatis mapper文件中条件查询符,如>=,<,之类是不能直接写的会报错的需要转移一下,本文给大家介绍了常见的条件查询操作,对mybatis的mapper特殊字符及动态...

    kenx6722022-01-17
  • Java教程Java ArrayList扩容机制原理深入分析

    Java ArrayList扩容机制原理深入分析

    在Java中,ArrayList是最常用的集合之一。它是一种容器,它的内部定义了一个Object类型的数组elementData,因此可用于存储任意类型的数据。我们知道,数组是...

    绿仔牛奶_6082023-03-04
  • Java教程Spring Boot如何实现定时任务的动态增删启停详解

    Spring Boot如何实现定时任务的动态增删启停详解

    这篇文章主要给大家介绍了关于Spring Boot如何实现定时任务的动态增删启停的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工...

    极客网3392020-07-20
  • Java教程Java关键字instanceof的两种用法实例

    Java关键字instanceof的两种用法实例

    这篇文章主要介绍了Java关键字instanceof的两种用法实例,本文给出了instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、...

    junjie4692019-12-12
  • Java教程java使用poi读取ppt文件和poi读取excel、word示例

    java使用poi读取ppt文件和poi读取excel、word示例

    这篇文章主要介绍了java使用poi读取ppt文件和poi读取excel、word示例,需要的朋友可以参考下 ...

    java教程网7232019-11-14
  • Java教程Java中volatile 的作用

    Java中volatile 的作用

    这篇文章主要介绍了Java中volatile 的作用,volatile是Java并发编程的重要组成部分,主要作用是保证内存的可见性和禁止指令重排序,下文更多对volatile作用的介...

    ​Java中文社群7352022-12-08