首页 > 其他分享 >kafka

kafka

时间:2024-04-14 17:44:21浏览次数:18  
标签:请求 分区 Kafka 缓冲区 kafka 数据 Leader

高性能之道

Kafka的特性之一就是高吞吐率,但是Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,但是Kafka即使是普通的服务器,Kafka也可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性也使得Kafka在日志处理等海量数据场景广泛应用。Kafka会把收到的消息都写入到硬盘中,防止丢失数据。为了优化写入速度Kafka采用了两个技术顺序写入和MMFile 。

因为硬盘是机械结构,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是最耗时的。所以硬盘最讨厌随机I/O,最喜欢顺序I/O。为了提高读写硬盘的速度,Kafka就是使用顺序I/O。这样省去了大量的内存开销以及节省了IO寻址的时间。但是单纯的使用顺序写入,Kafka的写入性能也不可能和内存进行对比,因此Kafka的数据并不是实时的写入硬盘中 。

Kafka充分利用了现代操作系统分页存储来利用内存提高I/O效率。Memory Mapped Files(后面简称mmap)也称为内存映射文件,在64位操作系统中一般可以表示20G的数据文件,它的工作原理是直接利用操作系统的Page实现文件到物理内存的直接映射。完成MMP映射后,用户对内存的所有操作会被操作系统自动的刷新到磁盘上,极大地降低了IO使用率。

Kafka服务器在响应客户端读取的时候,底层使用ZeroCopy技术,直接将磁盘无需拷贝到用户空间,而是直接将数据通过内核空间传递输出,数据并没有抵达用户空间。

传统IO操作

  • 1.用户进程调用read等系统调用向操作系统发出IO请求,请求读取数据到自己的内存缓冲区中。自己进入阻塞状态。
  • 2.操作系统收到请求后,进一步将IO请求发送磁盘。
  • 3.磁盘驱动器收到内核的IO请求,把数据从磁盘读取到驱动器的缓冲中。此时不占用CPU。当驱动器的缓冲区被读满后,向内核发起中断信号告知自己缓冲区已满。
  • 4.内核收到中断,使用CPU时间将磁盘驱动器的缓存中的数据拷贝到内核缓冲区中。
  • 5.如果内核缓冲区的数据少于用户申请的读的数据,重复步骤3跟步骤4,直到内核缓冲区的数据足够多为止。
  • 6.将数据从内核缓冲区拷贝到用户缓冲区,同时从系统调用中返回。完成任务

高级特性

Offset自动控制

Kafka消费者默认对于未订阅的topic的offset的时候,也就是系统并没有存储该消费者的消费分区的记录信息,默认Kafka消费者的默认首次消费策略:latest
auto.offset.reset=latest

Acks & Retries

Kafka生产者在发送完一个的消息之后,要求Broker在规定的额时间Ack应答答,如果没有在规定时间内应答,Kafka生产者会尝试n次重新发送消息。

幂等性

Kafka在0.11.0.0版本支持增加了对幂等的支持。幂等是针对生产者角度的特性。幂等可以保证上生产者发送的消息,不会丢失,而且不会重复。实现幂等的关键点就是服务端可以区分请求是否重复,过滤掉重复的请求。要区分请求是否重复的有两点:
唯一标识:要想区分请求是否重复,请求中就得有唯一标识。例如支付请求中,订单号就是唯一标识
记录下已处理过的请求标识:光有唯一标识还不够,还需要记录下那些请求是已经处理过的,这样当收到新的请求时,用新请求中的标识和处理记录进行比较,如果处理记录中有相同的标识,说明是重复记录,拒绝掉。

事务控制

在Kafka0.11.0.0除了引入的幂等性的概念,同时也引入了事务的概念。通常Kafka的事务分为 生产者事务Only、消费者&生产者事务。一般来说默认消费者消费的消息的级别是read_uncommited数据,这有可能读取到事务失败的数据,所有在开启生产者事务之后,需要用户设置消费者的事务隔离级别。

isolation.level = read_uncommitted 默认

数据同步机制

Kafka的Topic被分为多个分区,分区是是按照Segments存储文件块。分区日志是存储在磁盘上的日志序列,Kafka可以保证分区里的事件是有序的。其中Leader负责对应分区的读写、Follower负责同步分区的数据,0.11 版本之前Kafka使用highwatermarker机制保证数据的同步,但是基于highwatermarker的同步数据可能会导致数据的不一致或者是乱序。在Kafka数据同步有以下概念。

LEO:log end offset 标识的是每个分区中最后一条消息的下一个位置,分区的每个副本都有自己的 LEO.

HW: high watermarker称为高水位线,所有HW之前的的数据都理解是已经备份的,当所有节点都备 份成功,Leader会更新水位线。

ISR:In-sync-replicas,kafka的leader会维护一份处于同步的副本集和,如果在replica.lag.time.max.ms时间内系统没有发送fetch请求,或者已然在发送请求,但是在该限定时间内没有赶上Leader的数据就被剔除ISR列表。在Kafka-0.9.0版本剔除replica.lag.max.messages消息个数限定,因为这个会导致其他的Broker节点频繁的加入和退出ISR。

可以看出0.11版本之前Kafka的副本备份机制的设计存在问题。依赖HW的概念实现数据同步,但是存在数据不一致问题和丢失数据问题,因此Kafka-0.11版本引入了 Leader Epoch解决这个问题,不在使用HW作为数据截断的依据。而是已引入了Leader epoch的概念,任意一个Leader持有一个LeaderEpoch。该LeaderEpoch这是一个由Controller管理的32位数字,存储在Zookeeper的分区状态信息中,并作为LeaderAndIsrRequest的一部分传递给每个新的Leader。Leader接受Producer请求数据上使用LeaderEpoch标记每个Message。然后,该LeaderEpoch编号将通过复制协议传播,并用于替换HW标记,作为消息截断的参考点。

标签:请求,分区,Kafka,缓冲区,kafka,数据,Leader
From: https://www.cnblogs.com/xu-xiaofeng/p/18134438

相关文章

  • Kafka如何保证消息的顺序性
    Kafka发布模式通过一系列机制来确保消息的顺序性,特别是在分区内部。以下是关键要点:1.分区机制:Kafka的核心机制之一是分区(Partition)。每个主题(Topic)可以被分割成多个分区,而消息在发布时会被追加到特定的分区中。在每个分区内部,消息是按照它们被追加的顺序来存储的,因此保证了分区......
  • 【ALL】Kafka从抬脚到入门
    一、Kafka简介1.1、定义旧定义Kafka是一个分布式的基于发布/订阅模式的消息队列。新定义Kafka是一个开源的分布式事件流平台,用于数据管道、流分析、数据集成和关键任务的应用。1.2、使用场景主要用于大数据实时处理领域。缓冲:有助于控制和优化数据流经过系统的速度......
  • Kafka做消息队列的原理
    Kafka作为消息队列的实现原理主要基于其分布式架构和日志式存储机制。以下是Kafka作为消息队列工作的核心原理:1.分布式架构与分区:Kafka采用分布式架构,将数据分布存储在多个节点(称为Broker)上,以实现数据的水平扩展和并行处理。Kafka中的消息流被组织成主题(Topic),每个主题可以包......
  • docker-compose部署kafka
    docker-compose.ymlversion:'2'services:zookeeper:image:develop-harbor.geostar.com.cn/3rd/zookeeper:3.5.5ports:-"2181:2181"kafka:image:develop-harbor.geostar.com.cn/3rd/wurstmeister/kafka:2.12-2.2.1......
  • kafka集群
    对于运维需要掌握的kafka基础操作,读写管理掌握后,下一步就是集群部署搭建了。1.kafka天然支持集群2.kafka将集群状态写入zookeeper。集群部署1.确保zk启动[devops03root/opt/kafka_2.11-2.4.0]#netstat-tunlp|grep2181tcp600:::2181......
  • kafka基础
    1.流处理平台2.消息队列企业要求掌握kafka,工作里使用1.api原理2.项目实战配置3.kafka面试题学习目标1.从零熟练的掌握kafka2.学习核心API以及底层原理3.结合微信小程序,微服务完成kafka实战特性本课适合需要掌握kafka消息传递系统,以及维护大数据架构的专业......
  • Kafka 进阶
    1、为什么有消息系统解耦合异步处理例如电商平台,秒杀活动。一般流程会分为:1:风险控制、2:库存锁定、3:生成订单、4:短信通知、5:更新数据通过消息系统将秒杀活动业务拆分开,将不急需处理的业务放在后面慢慢处理;流程改为:1:风险控制、2:库存锁定、3:消息系统、4:生成订单、5:短信通知......
  • linux环境安装——kafka安装复习
    需要安装jdk、zk;然后才是kafka  kafka版本:kafka_2.13-3.2.3.tgz                             [root@iZf8zi6zcbssmm6c2nrhapZ/]#ls-alttotal84drwxrwxrwt.9rootroot4096Apr914:42tmpdrw......
  • Kafka、ActiveMQ、RabbitMQ、RocketMQ四大消息队列优劣对比与选择指南
    在分布式系统架构中,消息队列(MessageQueue,MQ)扮演着至关重要的角色,它作为异步通信的核心组件,能够实现系统解耦、削峰填谷、数据缓冲等功能。本文将聚焦于四大主流消息队列——Kafka、ActiveMQ、RabbitMQ、RocketMQ,深度剖析它们各自的优缺点,并在最后提供一份详尽的选择指南,以助......
  • Kafka 集群架构
    Kafka集群架构设计旨在提供高吞吐量、低延迟、容错性和可扩展性的消息传递服务。以下是Kafka集群架构的关键组成部分及其工作原理:核心组件BrokerBroker是Kafka集群中的一个独立服务器实例。每个Broker负责维护一部分Topic的Partition,并提供消息的接收、存储、检索和转发......