Kafka系统介绍及高性能原理

一、Kafka介绍

在这里插入图片描述
kafka有两个版本号,前面是scale的版本号,后面是kafka的版本号,scale语言依赖jvm,最终也是编译成class文件,
kafka4.0之前的版本内置了zookpeer,但是生产环境一般不会用,会替换成自己neizhi,4.0之后抛弃zookpeer,自己内部基于raft协议实现了一套。

二、消息队列的分类

在这里插入图片描述
至多一次,常见的rabbitmq,rocketmq都是这种方式,通过ACK机制确认消息已被消费者消费,此时会将消息删除;没有限制则主要是通过消费者上传的offset(偏移量)来确认消费消息的初始位置,同一消息可以被反复多次消费,一直到达到指定条件,比如kafka是默认保留7天,7天后则会被删除。

三、kafka基础架构

在这里插入图片描述
每个partition在磁盘上,其实是一个文件,理论上partition没有数量的上限,但是不建议数量过多。因为partition过多,意味着磁盘上对应的文件也越多,反而影响性能。
在这里插入图片描述

Kafka集群以Topic形式负责分类集群中的Record,每一个Record属于一个Topic,每个Topic底层都会对应一组分区的日志用于持久化Topic中的Record。同时在Kafka集群中,Topic的每一个日志分区都一定会有一个Broker担当该分区的Leader,其他的Broker担当该分区的follower。Leader负责分区数据的读写操作,follower负责同步该分区的数据。这样如果分区的Leader宕机,该分区的其他follower会选取新的Leader继续负责该分区数据的读写,其中集群中的Leader的监控和Topic的部分元数据是存储在Zookeeper中。
在这里插入图片描述
在这里插入图片描述
分区越大,理论上可以处理的并发读写也越大。

四、kafka消费者和消费者组在这里插入图片描述

在这里插入图片描述

消费者组

在这里插入图片描述
注意:消费者组内消费者的数量大于topic中分区的数量,多出的消费者正常情况下无法消费消息,但是当其他消费者无法正常工作时,它可以充当备份,顶上去。
每个消费组会记录一个独立的消费进度offset,在服务端通过命令可以查看。
在这里插入图片描述

五、kafka高性能之道

1.顺序IO和MMap

在这里插入图片描述

2.Zero copy

常规的IO
在这里插入图片描述
在这里插入图片描述

DMA协处理器
在这里插入图片描述在这里插入图片描述
Zero copy
在这里插入图片描述
在这里插入图片描述
由图可知:所谓0拷贝,主要是省去了,从内核缓冲区copy到用户缓冲区和用户缓冲区copy到内核与socket相关的缓冲区这两步,而是直接从内核缓冲区copy到内核与socket相关的缓冲区。总结如下:
在这里插入图片描述
DMZ主要负责磁盘或网络设备缓存区,到内核的拷贝
CPU主要负责内核到用户态的拷贝
mmap主要是硬盘上文件的位置和应用程序缓冲区(application buffers)进行映射(建立一种一一对应关系),由于mmap()将文件直接映射到用户空间,所以实际文件读取时根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了一次数据拷贝,不再有文件内容从硬盘拷贝到内核空间的一个缓冲区
在这里插入图片描述
**sendfile:**当调用sendfile()时,DMA将磁盘数据复制到kernel buffer,然后将内核中的kernel buffer直接
拷贝到socket buffer;但是数据并未被真正复制到socket关联的缓冲区内。取而代之的是,只有记录数据位置和长度的描述符被加入到socket缓冲区中。DMA模块将数据直接从内核缓冲区传递给协议引
擎,从而消除了遗留的最后一次复制。但是要注意,这个需要DMA硬件设备支持,如果不支持,CPU就必须介入进行拷贝。
在这里插入图片描述
**splice:**Linux 从2.6.17 支持splice。数据从磁盘读取到OS内核缓冲区后,在内核缓冲区直接可将其转成内核空间其他数据buffer,而不需要拷贝到用户空间。如下图所示,从磁盘读取到内核buffer后,在内核空间直接与socket buffer建立pipe管道。
和sendfile()不同的是,splice()不需要硬件支持。
注意splice和sendfile的不同,sendfile是DMA硬件设备不支持的情况下将磁盘数据加载到kernel
buffer后,需要一次CPU copy,拷贝到socket buffer。而splice是更进一步,连这个CPU copy也不需
要了,直接将两个内核空间的buffer进行pipe。
在这里插入图片描述

kraft版本的架构

在这里插入图片描述

自定义序列化类

在这里插入图片描述

需要被序列化的对象
在这里插入图片描述
序列化实现
在这里插入图片描述
反序列化实现
在这里插入图片描述
其他序列化的方法:
在这里插入图片描述

生产者消息缓存机制

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

发送应答机制

1. acks=0
含义:生产者发送消息后,不等待任何 broker 的确认,直接认为消息发送成功。
特点:
速度最快(无网络等待开销),但可靠性最低。
消息可能因 broker 崩溃、网络故障等丢失,且生产者无法感知。
适用场景:对可靠性要求极低,追求极致吞吐量的场景(如日志采集的非核心数据)。
2. acks=1(默认值)
含义:生产者发送消息后,只需等待分区的 leader 副本确认接收并写入本地日志,就认为消息发送成功,无需等待 follower 副本同步。
特点:
平衡了速度和可靠性。
若 leader 副本在消息同步到 follower 前崩溃,消息可能丢失(此时 follower 未同步,新 leader 无该消息)。
适用场景:大多数普通业务场景,如常规的业务数据上报。
3. acks=all(或acks=-1)
含义:生产者发送消息后,需要等待分区的 leader 副本和所有 ISR(In-Sync Replicas,同步副本集)中的 follower 副本都确认接收并写入日志,才认为消息发送成功。
特点:
可靠性最高,消息几乎不可能丢失(除非所有 ISR 副本同时崩溃)。
速度最慢(需等待多个副本同步确认)。
适用场景:对数据可靠性要求极高的场景(如金融交易、支付记录等核心数据)。

生产者消息幂等性

在这里插入图片描述
在这里插入图片描述
kafka生产者打开幂等性需要打开以下配置:
在这里插入图片描述

kafka消息发送流程

在这里插入图片描述

主流mq的对比

在这里插入图片描述

zookeeper在kafka中的作用

1.zookeeper整体数据

在这里插入图片描述

2.Controller Broker选举机制

在这里插入图片描述在这里插入图片描述

3.Leader Partition选举机制

在这里插入图片描述
在这里插入图片描述

4.leader Partition的自平衡机制

在这里插入图片描述在这里插入图片描述

5.Partition的故障恢复机制

在这里插入图片描述
在这里插入图片描述
如果leader挂了,新的leader选举前,该partion服务不可用,流程如下,如下:
在这里插入图片描述

6.HW一致性保障-Epoch更新机制

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值