Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程

  • 5. Kafka优化
    • 5.1 资源配置
      • 5.1.1 操作系统
      • 5.1.2 磁盘选择
      • 5.1.3 网络带宽
      • 5.1.4 内存配置
      • 5.1.5 CPU选择
    • 5.2 集群容错
      • 5.2.1 副本分配策略
      • 5.2.2 故障转移方案
      • 5.2.3 数据备份与恢复
    • 5.3 参数配置优化
    • 5.4 数据压缩和批量发送
  • 6. Kafka常见问题
    • 6.1 Kafka都有哪些组件?
    • 6.2 Kafka的LSO、LEO、 HW 的含义?
    • 6.3 Controller选举是怎么实现的?
    • 6.4 分区副本AR, ISR, OSR的含义?
    • 6.5 Producer生产消息是如何实现的?
    • 6.6 Producer ACK应答策略?
    • 6.7 Producer 消息重复或消息丢失的原因?
    • 6.8 Consumer消息重复或消息丢失的原因?
    • 6.9 Kafka数据如何保证有序?

在这里插入图片描述

在这里插入图片描述

本文档参看的视频是:

  • 尚硅谷Kafka教程,2024新版kafka视频,零基础入门到实战
  • 黑马程序员Kafka视频教程,大数据企业级消息队列kafka入门到精通
  • 小朋友也可以懂的Kafka入门教程,还不快来学

本文档参看的文档是:

  • 尚硅谷官方文档,并在基础上修改 完善!非常感谢尚硅谷团队!!!!

在这之前大家可以看我以下几篇文章,循序渐进:

❤️Kafka 3.x.x 入门到精通(01)——对标尚硅谷Kafka教程

❤️Kafka 3.x.x 入门到精通(02)——对标尚硅谷Kafka教程

❤️Kafka 3.x.x 入门到精通(03)——对标尚硅谷Kafka教程

❤️Kafka 3.x.x 入门到精通(04)——对标尚硅谷Kafka教程

❤️Kafka 3.x.x 入门到精通(05)——对标尚硅谷Kafka教程

❤️Kafka 3.x.x 入门到精通(06)——对标尚硅谷Kafka教程

❤️Kafka 3.x.x 入门到精通(07)——对标尚硅谷Kafka教程

在这里插入图片描述

5. Kafka优化

5.1 资源配置

5.1.1 操作系统

Kafka的网络客户端底层使用Java NIO的Selector方式,而Selector在Linux的实现是epoll,在Windows上实现机制为select。因此Kafka部署在Linux会有更高效的I/O性能。

数据在磁盘和网络之间进行传输时候,在Linux上可以享受到零拷贝机制带来的快捷和便利高效,而Windows在一定程度上会使用零拷贝操作。

所以建议Kafka部署在Linux操作系统上。

5.1.2 磁盘选择

Kafka 存储方式为顺序读写,机械硬盘的最大劣势在于随机读写慢。所以使用机械硬盘并不会造成性能低下。所以磁盘选用普通机械硬盘即可,Kafka自身已经有冗余机制,而且通过分区的设计,实现了负载均衡的功能。不做磁盘组raid阵列也是可以的。

磁盘空间需要多少,需要根据具体场景进行简单估算

设计场景:日志数据每天向kafka发送1亿条数据,每条数据有两个副本防止数据丢失,数据保存两周,每条消息平均大小为1KB。

  1. 每天1亿条1KB消息,保存两份,则每天总大小为:

    • ( 100000000 ∗ 1 K B ∗ 2 ) / 1024 / 1024 ≈ 200 G B (100000000*1KB*2)/1024/1024≈200GB (1000000001KB2)/1024/1024200GB
  2. kafka除了消息数据还有其他类型的数据,故增加10%的冗余空间,则需要220GB

  3. 两周时间则为 220GB*14≈3TB

  4. 如果启用压缩,压缩比约在 0.75 左右,则总存储空间规划为3TB*0.75=2.25TB

5.1.3 网络带宽

如果网络为万兆带宽,基本不会出现网络瓶颈,如果数据量特别大,按照下文中的设计场景进行计算。如果网络为百兆或者千兆带宽,在处理较大数据量场景下会出现网络瓶颈,可按照下面的传统经验公式进行计算处理,也可按照下述场景按照自己生产实际情况进行设计。

经验公式: 服务器台数 = 2 × ( 生产者峰值生产速率 × 副本数 ÷ 100 ) + 1 服务器台数 = 2 × (生产者峰值生产速率 × 副本数 ÷ 100) + 1 服务器台数=2×(生产者峰值生产速率×副本数÷100)+1

带宽情况最容易成为 kafka 的瓶颈。

设计场景:如果机房为千兆带宽,我们需要在一小时内处理1TB的数据,需要多少台kafka 服务器?

  1. 由于带宽为千兆网,1000Mbps=1Gbps,则每秒钟每个服务器能收到的数据量为 1Gb=1000Mb
  2. 假设 Kafka 占用整个服务器网络的70%(其他 30%为别的服务预留),则Kafka可以使用到700Mb 的带宽,但是如果从常规角度考虑,我们不能总让Kafka顶满带宽峰值,所以需要预留出2/3甚至3/4的资源,也就是说,Kafka单台服务器使用带宽实际应为 700Mb/3=240Mb
  3. 1 小时需要处理1TB数据, 1 T B = 1024 ∗ 1024 ∗ 8 M b = 8000000 M b 1TB=1024*1024*8Mb=8000000Mb 1TB=102410248Mb=8000000Mb,则一秒钟处理数据量为: 8000000 M b / 3600 s = 2330 M b 8000000Mb/3600s=2330Mb 8000000Mb/3600s=2330Mb 数据。
  4. 需要的服务器台数为: 2330 M b / 240 M b ≈ 10 台 2330Mb/240Mb≈10 台 2330Mb/240Mb10
  5. 考虑到消息的副本数如果为 2,则需要20台服务器,副本如果为3,则需要30台服务器。

5.1.4 内存配置

Kafka运行过程中设计到的内存主要为JVM的堆内存和操作系统的页缓存,每个Broker节点的堆内存建议10-15G内存,而数据文件(默认为1G)的25%在内存就可以了。综合上述,Kafka在大数据场景下能够流畅稳定运行至少需要11G,建议安装Kafka的服务器节点的内存至少大于等于16G。

5.1.5 CPU选择

观察所有的Kafka与线程相关的配置,一共有以下几个
在这里插入图片描述

在生产环境中,建议CPU核数最少为16核,建议32核以上,方可保证大数据环境中的Kafka集群正常处理与运行。

5.2 集群容错

5.2.1 副本分配策略

Kafka采用分区机制对数据进行管理和存储,每个Topic可以有多个分区,每个分区可以有多个副本。应根据业务需求合理配置副本,一般建议设置至少2个副本以保证高可用性。

5.2.2 故障转移方案

当Kafka集群中的某个Broker节点发生故障时,其负责的分区副本将会被重新分配到其他存活的Broker节点上,并且会自动选择一个备份分区作为新的主分区来处理消息的读写请求。

5.2.3 数据备份与恢复

Kafka采用基于日志文件的存储方式,每个Broker节点上都有副本数据的本地备份。在数据备份方面,可以通过配置Kafka的数据保留策略和数据分区调整策略来保证数据的持久性和安全性;在数据恢复方面,可以通过查找备份数据并进行相应的分区副本替换来恢复数据。

5.3 参数配置优化

参数名默认参数值位置优化场景备注
num.network.threads3服务端低延迟
num.io.threads8服务端低延迟
socket.send.buffer.bytes102400(100K)服务端高吞吐
socket.receive.buffer.bytes65536(64K)服务端高吞吐场景
max.in.flight.requests.per.connection5生产端幂等
buffer.memory33554432(32M)生产端高吞吐
batch.size16384(16K)生产端提高性能
linger.ms0生产端提高性能
fetch.min.bytes1消费端提高性能网络交互次数
max.poll.records500消费端批量处理控制批量获取消息数量
fetch.max.bytes57671680 (55M)消费端批量处理控制批量获取消息字节大小

5.4 数据压缩和批量发送

通过压缩和批量发送可以优化Kafka的性能表现。Kafka支持多种数据压缩算法,包括Gzip、Snappy、LZ4和zstd。在不同场景下,需要选择合适的压缩算法,以确保性能最优。
下面的表格为网络上不同压缩算法的测试数据,仅作参考

压缩算法压缩比率压缩效率解压缩效率
snappy2.073580m/s2020m/s
lz42.101800m/s4220m/s
zstd2.884520m/s1600m/s

从表格数据可以直观看出,zstd有着最高得压缩比,而LZ4算法,在吞吐量上表现得非常高效。对于Kafka而言,在吞吐量上比较:lz4 > snappy>zstd>gzip。

而在压缩比上:zstd > lz4 > gzip > snappy

Kafka支持两种批处理方式:异步批处理和同步批处理。在不同场景下,需要选择合适的批处理方式,进行性能优化。同时需要合理设置批处理参数,如batch.size、linger.ms等。

在这里插入图片描述

6. Kafka常见问题

6.1 Kafka都有哪些组件?

生产者、 消费者、管理员 。。。。。。

6.2 Kafka的LSO、LEO、 HW 的含义?

LSO,LEO,HW其实都是kafka中的偏移量。只不过它们代表的含义是不相同的。

这里的LSO有两层含义:

  • 一个是Log Start Offset, 一个是Log Stable Offset,第一个表示数据文件的起始偏移量,同学们还记的,咱们的log文件的文件名吗,文件名中的那个数字就是当前文件的LSO
  • 第二个表示的位移值是用来判断事务型消费者的可见性,就是所谓的事务隔离级别,一个叫read_commited, 一个叫read_uncommited。当然了,如果你的生产者或消费者没有使用事务,那么这个偏移量没有任何的意义。

LEO 表示 Log End Offset,就是下一个要写入的数据偏移量,所以这个偏移量的数据是不存在的

HW表示高水位线偏移量的意思。是kafka为了数据的一致性所增加的一种数据隔离方式。简单的理解,就是消费者只能消费到,小于高水位线偏移量的数据。

6.3 Controller选举是怎么实现的?

这里的controller选举主要指的还是Kafka依赖于ZK实现的controller选举机制,也就是说,kafka的所有broker节点会监听ZK中的一个controller临时节点,如果这个节点没有创建,那么broker就会申请创建,一旦创建成功,那么创建成功的broker就会当选为集群的管理者controller,一旦失去了和ZK的通信,那么临时节点就会消失,此时就会再次进行controller的选举,选举的规则是完全一样的,一旦新的controller选举,那么controller纪元会被更新。

6.4 分区副本AR, ISR, OSR的含义?

这里的AR可以理解为分区的所有副本集合。而ISR表示的就是正在同步数据的副本列表,列表的第一个就是分区的Leader副本,其他的副本就是Follower副本。

OSR就是没有处于同步数据的副本列表。

一旦副本拉取数据满足了特点的条件,那么会从OSR中移除并增加到ISR中。同样,如果副本没有拉取数据满足了特定的条件,就会从ISR中移除,放入到OSR中。这就是所谓的ISR列表的收缩和扩张。kafka使用这种ISR的方式有效的权衡了数据可靠性和性能之间的关系

6.5 Producer生产消息是如何实现的?

这里所谓的生产消息。指的就是生产者客户端的生产数据的基本流程。咱们之前的图形中,就把这个流程已经画出来了。我相信图形比文字应该更容易记忆,所以请大家参考前面的生产者组件。

在这里插入图片描述

6.6 Producer ACK应答策略?

ACK应答机制其实就是生产者发送数据后kafka接收确认方式。Kafka确认的方式有3种:

  • 第一种是当生产者数据发送到网络客户端的缓冲区后,Kafka就认为数据收到了,那么就会进行响应,也就是应答。但是这种方式,数据可靠性是非常低的,因为不能保证数据一定会写入日志文件。但是发送效率影响不大。

  • 第二种是当主题分区的Leader副本将数据写入日志后,Kafka才认为数据收到了,然后再对生产者进行响应。这种方式,发送数据的效率会降低,但是可靠性会高一些。而可靠性最高的就是第三种方式

  • 第三种方式就是主题分区的ISR副本列表种所有的副本都已经将数据写入日志后。Kafka才认为数据收到了,然后再对生产者进行响应。这种方式,发送数据的效率会非常低。生产者对象可以根据生产环境和业务要求对应答机制进行配置。

三种方式分别对应0,1和-1(all)。另外,生产者数据幂等性操作要求ACK应答处理机制必须为-1,而ACK的参数默认值也是-1

6.7 Producer 消息重复或消息丢失的原因?

Producer消息重复和消息丢失的原因,主要就是kafka为了提高数据可靠性所提供的重试机制,如果禁用重试机制,那么一旦数据发送失败,数据就丢失了。而数据重复,恰恰是因为开启重试机制后,如果因为网络阻塞或不稳定,导致数据重新发送。那么数据就有可能是重复的。所以kafka提供了幂等性操作解决数据重复,并且幂等性操作要求必须开启重试功能和ACK取值为-1,这样,数据就不会丢失了。

kafka提供的幂等性操作只能保证同一个生产者会话中同一个分区中的数据不会重复,一旦数据发送过程中,生产者对象重启,那么幂等性操作就会失效。那么此时就需要使用Kafka的事务功能来解决跨会话的幂等性操作。但是跨分区的幂等性操作是无法实现的。(引入了事务)

6.8 Consumer消息重复或消息丢失的原因?

这里主要说的是消费者提交偏移量的问题。消费者为了防止意外情况下,重启后不知道从哪里消费,所以会每5s时间自动保存偏移量。但是这种自动保存偏移量的操作是基于时间的,一旦未达到时间,消费者重启了,那么消费者就可能重复消费数据。

Kafka提供自动保存偏移量的功能的同时,也提供了手动保存偏移量的2种方式,一个是同步提交,一个是异步提交。本质上都是提交一批数据的最后一个偏移量的值,但是可能会出现,偏移量提交完毕,但是拉取的数据未处理完毕,消费者重启了。那么此时有的数据就消费不到了,也就是所谓的数据丢失。

6.9 Kafka数据如何保证有序?

这里的有序我们要考虑的点比较多,但是总结起来就是生产有序,存储有序,消费有序。

所谓的生产有序就是生产者对象需要给数据增加序列号用于标记数据的顺序,然后再服务端进行缓存数据的比对,一旦发现数据是乱序的,那么就需要让生产者客户端进行数据的排序,然后重新发送数据,保证数据的有序。不过这里的缓存数据的比对,最多只能有5条数据比对,所以生产者客户端需要配置参数,将在途请求缓冲区的请求队列数据设置为5,否则数据依然可能乱序。因为服务端的缓存数据是以分区为单位的,所以这就要求生产者客户端需要将数据发送到一个分区中,如果数据发送到多个分区,是无法保证顺序的。这就是生产有序的意思。

那存储有序指的是kafka的服务端获取数据后会将数据顺序写入日志文件,这样就保证了存储有序,当然也只能是保证一个分区的数据有序。

接下来就是消费有序。所谓的消费有序其实就是kafka在存储数据时会给数据增加一个访问的偏移量值,那消费者只能按照偏移量的方式顺序访问,并且一个分区的数据只能被消费者组中的一个消费者消费,那么按照偏移量方式的读取就不会出现乱序的情况。

所以综合以上的描述。Kafka就能够实现数据的有序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c++】mutable是一个关键字,用于指定一个类成员可以在一个const成员函数中被修改。

mutable是一个关键字,用于指定一个类成员可以在一个const成员函数中被修改。通常,当一个成员函数被声明为const时,这意味着这个函数不能修改它所属的对象。然而,有时候你可能需要在一个const成员函数中修改某个成员变量。这时,你就可以使用mutable关键字。webrtc的StunReq…

机器学习:深入解析SVM的核心概念(问题与解答篇)【三、核函数】

核函数 **问题一:为什么说是有限维就一定存在高维空间可分呢?**原始空间与特征空间为什么映射到高维空间可以实现可分核函数的作用 **问题二:最终怎么得到函数**从对偶问题到决策函数的步骤:结论 **问题三:为什么说特征…

在国内 PMP 有多少含金量?

PMP认证并不是对所有人都有价值,也并不是考到它必须会升值加薪,那可能就有人会问了,那我为什么还要考PMP?此言差矣,我个人项目管理行业混迹了这么多年了,真正对我有用的证书除了学历以外就是PMP认证了&…

Ubuntu 24.04 LTS (Noble Numbat) 正式版发布

Ubuntu 24.04 LTS (Noble Numbat) 正式版发布 Canonical 的第 10 个长期支持版本在性能工程、企业安全和开发人员体验方面树立了新标准 请访问原文链接:Ubuntu 24.04 LTS (Noble Numbat) 正式版发布,查看最新版。原创作品,转载请保留出处。…

搭建基础镜像(centos+jdk)

搭建基础镜像(centosjdk) 1. 目录结构1.1 应用目录2.2 镜像目录 2. 编写Dockerfile2.1 设置工作目录2.2 解决时间同步问题(设置时区)2.3 核心逻辑2.4 设置环境变量 3. 构建镜像3.1 构建镜像3.2 导出镜像 1. 目录结构 1.1 应用目录…

10.MMD 室内场景导入背景视频和灯光

导入背景视频 1. 导入人物和场景 场景是Akali’s room,可以在墙壁上添加视频 先添加主场景 2. 修改视频文件格式 在背景里选择导入背景视频文件 需要将mp4视频格式转化为AVI格式 方法一 先将视频导入格式工厂 点击配置 将视频编码改成DivX 再开始处理 …

DockerUI安装使用

DockerUI安装使用 主机环境 [roottest01 ~]# uname -a Linux test01 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [roottest01 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)安装 [roottest01 ~]# doc…

【算法基础实验】图论-UnionFind连通性检测之quick-find

Union-Find连通性检测之quick-find 理论基础 在图论和计算机科学中,Union-Find 或并查集是一种用于处理一组元素分成的多个不相交集合(即连通分量)的情况,并能快速回答这组元素中任意两个元素是否在同一集合中的问题。Union-Fin…

分布式存储 Ceph 的演进经验

从 2004 年到今天,Ceph 的存储后端一直都在演变,从最开始基于 B 树的 EBOFS 演变到今天的 BlueStore,存储后端已经变得非常成熟,新的存储系统不仅能够提供良好的性能,还有着优异的兼容性。我们在这篇文章中将要简单介绍…

Android SQLiteDatabase的使用详解

1、数据库–公共变量: 2、数据库–打开: 3、数据库–增: 4、数据库–删: 5、数据库–改: 6、数据库–查: 7、数据库–关闭: 8、数据库–辅助工具: 9、数据库–效果&…

配置DHCP和DNS

DHCP DHCP原理 作用:是一种网络协议,用于自动分配IP地址、子网掩码、默认网关、DNS服务器等TCP/IP参数 1.DHCP的四个报文 1.discover报文: 找寻dhcp服务器 2.offer报文: 服务器回复discover报文并且携带网络配置信息&#xff…

我在公司干了两年,有个在公司工作三年的成员要离职,接手别人代码才发现真的是一言难尽

微服务框架是别的团队的人搭建的,他负责单独开发一个报表模块,这是初始版本,还未上线 1、nacos做注册中心,却胡乱注册,服务命名有下划线 测试环境nacos配置命名空间为dev,直接与其他的微服务test命名空间…

Qt QLineEdit详解

1.简介 QLineEdit是一个单行文本编辑器。 行编辑允许用户使用一组有用的编辑功能输入和编辑单行纯文本,包括撤消和重做、剪切和粘贴以及拖放。 通过更改行编辑的echoMode,它也可以用作“只写”字段,用于密码等输入。 文本的长度可以限制为ma…

毅四捕Go设计模式笔记——命令模式

命令模式(Command Pattern) 为了解决什么问题? 命令模式的目的是将请求发起者和请求执行者解耦,使得请求的发起者不需要知道具体的执行者是谁,也不需要知道执行的具体过程,只需要发送请求即可。 通过使用…

如何轻松在D盘新建文件夹?意外丢失的文件夹怎么找回

对于很多刚接触电脑的朋友来说,如何正确地新建文件夹并将其放置在特定盘符(如D盘)可能是一个不小的挑战。同时,如果新建的文件夹突然消失,而我们又确信自己没有删除它,那么该如何找回呢?本文将为…

直播间怎么提高流量?巨量千川官方真实投流助力获客轻松翻倍

随着互联网的快速发展,直播已经成为了一种极具吸引力和互动性的娱乐和营销方式。然而,如何提高直播间的流量,(直播间流量:kxs7667)吸引更多观众成为了每个直播主都关注的重要问题。与此同时,巨量千川官方真实投流作为一…

如何在WordPress中设置网站的SEO标题和描述

在WordPress中,想要让你的网站在搜索引擎结果中脱颖而出,设置优秀的SEO标题和描述至关重要。这不仅可以帮助搜索引擎更好地理解你的网站内容,还可以吸引更多的点击率和流量。而选择一款合适的SEO插件是实现这一目标的关键之一。让我们来看看两…

pgvector扩展在IvorySQL Oracle兼容模式下的应用实践

向量数据库是生成式人工智能(GenAI)的关键组成部分。作为PostgreSQL的重要扩展,pgvector支持高达16000维的向量计算能力,使得PostgreSQL能够直接转化为高效的向量数据库。 IvorySQL基于PostgreSQL开发,因此它同样支持添加pgvector扩展。在Ora…

部署YUM仓库及NFS共享服务

YUM yum仓库常用类型: 本地源仓库:baserulfile:// 在线源仓库:baserulhttp:// ftp源仓库:baseru:ftp:// 实验: 首先安装软件 [rootlocalhost yum.repos.d]# cd /mnt/Packages/ [rootloca…

基于FPGA的数字信号处理(3)--什么是浮点数?

科学计数法 你可能不了解「浮点数」&#xff0c;但你一定了解「科学记数法」。 10进制科学记数法把一个数表示成a与10的n次幂相乘的形式&#xff08;1≤|a|<10&#xff0c;a不为分数形式&#xff0c;n为整数&#xff09;&#xff0c;例如&#xff1a; 19970000000000 1.9…