Kafka上的优化经验

1. 平滑扩容

Motivation

kafka扩容⼀台新机器的流程

假如集群有 3 broker ,⼀共有 4 TP ,每个 3 副本,均匀分布。现在要扩容⼀台机器,
broker 加⼊集群后需要通过⼯具进⾏ TP 的迁移。⼀共迁移 3 TP 的副本到新 broker
上。等迁移结束之后,会重新进⾏ leader balance ,最终的 TP 分布如图所示:

从微观的⻆度看,TP 从⼀台 broker 迁移到另⼀个 broker 的流程是怎么样的呢?咱们来看 下 TP3 第三个副本,从 broker1 迁移到 broker4 的过程,如下图所示,broker4 作为 TP3 的 follower,从 broker1 上最早的 offffset 进⾏获取数据,直到赶上最新的 offffset 为⽌,新副 本被放⼊ ISR 中,并移除 broker1 上的副本,迁移过程完毕。

但在现有的扩容流程中存有如下问题:数据迁移从 TP3 的最初的 offset 开始拷⻉数据,这 会导致⼤量读磁盘,消耗⼤量的 I/O 资源,导致磁盘繁忙,从⽽造成 produce 操作延迟增 ⻓,产⽣抖动。所以整体迁移流程不够平滑。我们看下实际的监控到的数据。从中可以看到 数据迁移中, broker1 上磁盘读量增⼤,磁盘 util 持续打满,produce P999 的延迟陡增,极其不稳定。

改进⽅案

在迁移 TP 时, 直接从 partition 最新的 offset 开始数据迁移,但是要同步保持⼀段时间,
主要是确保所有 consumer 都已经跟得上了 。如图所示,再来看这个 TP3 的第三个副本从
broker1 迁移到 broker4 的过程。这次 broker4 直接从 broker1 最新的 offset 开始迁移,即
transfer start 这条竖线。此时,因为 consumer1 还没能跟得上,所以整个迁移过程需要保
持⼀段时间,直到 transfer end 这个点。这个时候,可以将 TP3 的新副本放到 ISR 中,同
时去掉 broker1 上的副本,迁移过程完毕。从这次的迁移过程中看,因为都是读最近的数
据,不会出现读⼤量磁盘数据的问题,仅仅多了⼀个副本的流量,基本对系统⽆影响。此
时,我们再来看下磁盘读量、磁盘 util 、以及 produce 的延迟,从图中可知基本没有任何变
化。整体过程⾮常平滑,可以说通过这种⽅式很优雅地解决了 Kafka 平滑扩容问题,我们之
前也有在晚⾼峰期间做扩容的情况,但是从 Kafka 整体服务质量上看,对业务没有任何影
响。这个功能有⼀个 patch 可⽤: https://issues.apache.org/jira/browse/KAFKA-8328

这个⽅案存在的问题

1. 快⼿的这个patch是针对kafka 0.10.2.0版本,其他版本不⽀持,如果我们引⼊的话,需要针对⽣产环境上的版本进⾏代码修改

2. 设计的缺陷

a)replica直接从最新的produce offset进⾏复制,⽆法保证kafka⼀致性语义(所有的副本数据完全⼀致),最新的replica缺失now - retention_ms这段时间的数据,如果consumer想要通过⾃定义offset来消费历史数据,可能会抛异常(当这个replica变成leader时);

b)replica从最新的produce offset进⾏同步,加⼊ISR的时机为 所有consumer offset全部⼤于起始同步offset,如果某个consumer group在此期间停⽌了消费测试⽤的group id),则会导致这个replica⼀直⽆法加⼊ISR

3. 这个patch只能在jdk 7 & scala 2.10编译通过,测试通过,在jdk 8 & scala 2.11环境下,测试⽆法通过

4. 社区的意⻅

 

5. 快⼿针对这个改进提了⼀个KIP,但是这个KIP已经被删掉了,没有找到他们当时对这个improvement的讨论

6. 这个patch kafka社区没有approve

2. Kafka RPC 队列隔离

Motivation

如图所示, Kafka RPC 框架中,⾸先由 accepter 从⽹络中接受连接,每收到⼀个连接,都
会交给⼀个⽹络处理线程( processer )处理, processor 在读取⽹络中的数据并将请求简单
解析处理后,放到 call 队列中, RPC 线程会从 call 队列中获取请求,然后进⾏ RPC 处理。
此时,假如 topic2 的写⼊出现延迟,例如是由于磁盘繁忙导致,则会最终将 RPC 线程池打
满,进⽽阻塞 call 队列,进⽽打满⽹络线程池,这样发到这个 broker 的所有请求都没法处
理了。

改进⽅案

解决这个问题的思路也⽐较直接,需要按照控制流、数据流分离,且数据流要能够按照
topic 做隔离。⾸先将 call 队列按照拆解成多个,并且为每个 call 队列都分配⼀个线程池。
call 队列的配置上,⼀个队列单独处理 controller 请求的队列(隔离控制流),其余多个
队列按照 topic hash 的分散开(数据流之间隔离)。如果⼀个 topic 出现问题,则只会
阻塞其中的⼀个 RPC 处理线程池,以及 call 队列。这⾥还有⼀个需要注意的是 processor
在将请求放⼊ call 队列中,如果发现队列已满,则需要将请求⽴即失败掉(否则还是会被阻
塞)。这样就保障了阻塞⼀条链路,其他的处理链路是畅通的。

3. Cache改造

Motivation

我们都知道, Kafka 之所以有如此⾼的性能,主要依赖于 page cache producer 的写操
作, broker 会将数据写⼊到 page cache 中,随后 consumer 发起读操作,如果短时间内
page cache 仍然有效,则 broker 直接从内存返回数据,这样,整体性能吞吐⾮常⾼。
但是由于 page cache 是操作系统层⾯的缓存,难于控制,有些时候,会受到污染,从⽽导
Kafka 整体性能的下降。我们来看 2 个例⼦:
 
第⼀个 case consumer lag 读会对 page cache 产⽣污染。

如图所示,假如有 2 consumer 1 producer 。其中,蓝⾊ producer 在⽣产数据,蓝
consumer 正在消费数据,但是他们之间有⼀定的 lag ,导致分别访问的是不同的 page
cache 中的 page 。如果⼀个橙⾊ consumer topic partition 最初的 offffset 开始消费数据
的话,会触发⼤量读盘并填充 page cache 。其中的 5 个蓝⾊ topic page 数据都被橙⾊
topic 的数据填充了。另外⼀⽅⾯,刚刚蓝⾊ producer ⽣产的数据,也已经被冲掉了。此
时,如果蓝⾊ consumer 读取到了蓝⾊ producer 刚刚⽣产的数据,它不得不再次将刚刚写
⼊的数据从磁盘读取到 page cache 中。综上所述,⼤ lag consumer 会造成 cache
染。在极端情况下,会造成整体的吞吐下降。
第⼆个 case follower 也会造成 page cache 的污染。

 

在图中 broker1 机器内部,其中 page cache 中除了包括蓝⾊ producer 写⼊的数据之外,
还包括橙⾊ follower 写⼊的数据。但是橙⾊ follower 写⼊的数据,在正常的情况下,之后不
会再有访问,这相当于将不需要再被访问的数据放⼊了 cache ,这是对 cache 的浪费并造
成了污染。所以,很容易想到 Kafka 是否可以⾃⼰维护 cache 呢?⾸先,严格按照时间的
顺序进⾏ cache ,可以避免异常 consumer lag 读造成的 cache 污染。其次,控制
follower 的数据不进⼊ cache ,这样阻⽌了 follower cache 的污染,可以进⼀步提升
cache 的容量。
 

改进⽅案

我们在 broker 中引⼊了两个对象:⼀个是 block cache ;另⼀个是 flflush queue Producer
的写⼊请求在 broker 端⾸先会被以原 message 的形式写⼊ flflush queue 中,之后再将数据
写⼊到 block cache 的⼀个 block 中,之后整个请求就结束了。在 flflush queue 中的数据会
由其他线程异步地写⼊到磁盘中(会经历 page cache 过程)。⽽ follower 的处理流程保持
和原来⼀致,从其他 broker 读到数据之后,直接把数据写到磁盘(也会经历 page
cache )。这种模式保证了 block cache 中的数据全都是 producer 产⽣的,不会被 follower
污染。
对于 consumer ⽽⾔,在 broker 接到消费请求后,⾸先会从 block cache 中检索数据,如
果命中,则直接返回。否则,则从磁盘读取数据。这样的读取模式保障了 consumer
cache miss 读并不会填充 block cache ,从⽽避免了产⽣污染,即使有⼤ lag consumer
读磁盘,也仍然保证 block cache 的稳定。

接下来,我们看下 block cache 的微观设计,整个 block cache 3 个部分组成:

第⼀部分: 2 block pool ,维护着空闲的 block 信息,之所以分成 2 类,主要是因
segment 数据以及 segment 的索引⼤⼩不同,统⼀划分会导致空间浪费;
第⼆部分:先进先出的 block 队列,⽤于维护 block ⽣产的时序关系,在触发淘汰时,会优
先淘汰时间上最早的 block
第三部分: TP+offffset 到有效 blocks 的索引,⽤于快速定位⼀个 block 。⼀个 block 可以看
做是 segment 的⼀部分。 segment 数据以及 segment 索引和 block 的对应关系如图所示。
最后,还有两个额外的线程:
eliminater 线程,⽤于异步进⾏ block cache 淘汰,当然,如果 produce 请求处理时,发现
block cache 满也会同步进⾏ cache 淘汰的;
异步写线程,⽤于将 flflush queue 中的 message 异步写⼊到磁盘中。
这个就是 Kafka cache 的整体设计,可以看出,已经很好地解决了上述的两个对 cache
染的问题了。

性能测试

我们搭建了 5 broker 的集群,其中⼀个换成了 Kafka cache 的版本。并创建了⼀个 150
partition topic 3 副本。所以算上副本,⼀共有 450 partition ,每台机器上 90
TP 。之后我们 Mirror 了⼀个线上的流量数据,并启动 150 consumer ,以总体 lag 450w
条数据开始读。

从图中可以看出,原始版本在这种情况下会造成⼤量的磁盘读,⽽ Kafka cache 版本没有任

何磁盘读取操作,这说明 Kafka cache 版本可以 cache 更多的有效数据,这点是排除了
follower 造成的污染,经过精细化统计,发现 Kafka cache 有效空间刚好为原版本的 2
(正好和同⼀台 broker TP leader follower 的数量⽐⼀致)。从恢复的时间上看,
由于排除了读磁盘以及多个 consumer 之间读可能会 cache 产⽣的污染, Kafka cache 的版
本也⽐原有版本速度要快了 30%

除此之外,再看下改进后的 broker ,从这个图中可以看出, produce 整个写⼊过程,先是同
步写⼊内存,然后再被异步刷⼊磁盘。虽然 page cache 的模式也是类似这种,但是 page cache 会存在⼀定不稳定性(可能会触发同步写盘)。这个是我们上线 Kafka cache 版本前
后的 produce p999 的延迟对⽐。从图中可以看到: Kafka cache 版本⽐原来版本的延迟低
了很多,且稳定性有极⼤改进。

 

引⼊该⽅案存在的问题

1. ⽬前快⼿只提出了⼀个⾃⼰管理 Cache 的⽅案,没有公开源码,我们需要⾃⼰写代码实
2. 我们集群 Kafka 的版本⽬前不统⼀,在实现这个⽅案之前需要统⼀ Kafka 版本

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot集成ShardingSphere实现按月数据分片及创建自定义分片算法 | Spring Cloud 44

一、前言 在前面我们通过以下章节对数据分片有了基础的了解: Spring Boot集成ShardingSphere实现数据分片(一) | Spring Cloud 40 Spring Boot集成ShardingSphere实现数据分片(二) | Spring Cloud 41 Spring Boot集…

权限提升:信息收集 .(Linux系统)

权限提升:信息收集. 权限提升简称提权,由于操作系统都是多用户操作系统,用户之间都有权限控制,比如通过 Web 漏洞拿到的是 Web 进程的权限,往往 Web 服务都是以一个权限很低的账号启动的,因此通过 Webshel…

1.1 基于B/S 结构的 Web 应用

文章目录 1.1 基于B/S 结构的 Web 应用1.2 JDK安装与配置1.3 服务器Tomcat下载与安装1.4 Eclipse安装与使用1.4.1 Eclipse 下载及创建Dynamic Web Project1.4.2 Eclipse 中的编码问题1.4.3 将Tomcat和Eclipse相关联1.4.4 Eclipse 自动部署项目到 Tomcat 的 webapps 目录 1.5 My…

【AWS入门】AWS Lamda

目录 创建一个Lamda函数用Lamda函数控制启停EC2实例创建一台EC2实例创建角色创建lamda函数 使用Amazon EventBridge计划启停实例创建EventBridge 用户往S3存储桶上传图片文件,触发Lambda函数,将图片压缩并上传至另一个存储桶创建两个存储桶通过Cloudform…

【SpringMVC】| SpringMVC执行流程原理 | 常用注解 剥析

MVC目录 一. 🦁 MVC模型二. 🦁 SpringMVC1. SpringMVC执行流程(重点)Ⅰ. SpringMVC四大组件Ⅱ. 执行流程 2. RequestMapping3. RequestParam4. ReuqestHeader & CookieValue5. RESTful风格支持Ⅰ. 传统 vs restfulⅡ. PathVar…

【网络技术】什么是CNI

序言 你只管努力,其他交给时间,时间会证明一切。 Never look back unless you are planning to go that way. 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用…

【应急响应】日志自动提取分析项目ELKLogkitLogonTracerAnolog等

日志自动提取-七牛Logkit&观星应急工具 1、七牛Logkit:(Windows&Linux&Mac等) https://github.com/qiniu/logkit/ 支持的数据源(各类日志,各个系统,各个应用等) File: 读取文件中的日志数据,包…

面了一个4年经验的测试工程师,自动化都不会也要15k,我也是醉了····

在深圳这家金融公司也待了几年,被别人面试过也面试过别人,大大小小的事情也见识不少,今天又是团面的一天, 一百多个人都聚集在一起,因为公司最近在谈项目出来面试就2个人,无奈又被叫到面试房间。 整个过程…

数说热点 | 跟着《长月烬明》起飞,今年各地文旅主打的就是一个听劝

近日,随着热播剧《长月烬明》的爆火,蚌埠、宣城、敦煌等多个与剧情梦幻联动的宝藏城市被带飞,各地热心网友也纷纷催促自家文旅局赶紧“蹭飞”,《长月烬明》以一己之力打造了影视文旅融合的新样板。 仙偶剧特效天花板,…

《互联网安全产品漏洞管理规定》

《网络产品安全漏洞管理规定》由工业和信息化部、国家互联网信息办公室、公安部联合印发,自2021年9月1日起施行。 该《规定》明确,任何组织或者个人不得利用网络产品安全漏洞从事危害网络安全的活动,不得非法收集、出售、发布网络产品安全漏洞…

Redis高频面试题,使用场景

一、缓存 1、什么是缓存穿透 ? 怎么解决 ? 缓存穿透 查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库。 解决 方案一:缓存空数据,查询返回的数据为空,仍把这个空结果进行…

【JavaEE】认识线程

目录 1、什么是线程 2、为什么引入线程 2.1、线程的优缺点 3、CPU的工作原理 4、线程和进程的关系 4.1、线程和进程的入口函数 4.2、线程独享的资源 1、什么是线程 一个进程中可以有一个或者多个线程,每个线程都是一个独立的执行流。多个线程之间,也…

3.rabbitMQ之发布确认高级和整合springboot(重要)找了很多博客整理出来的

1.极端情况下 rabbitMQ需要重启,导致消息投递失败(生产者发消息全部丢失)(交换机或者队列出问题) 生产者需要把数据放到缓存,用定时任务重新发送 解决方法: 0.必须配置文件写 spring.rabbitmq.publisher-confirm-typecorrelatedspring.rabbitmq.publisher-returnstruecorrelati…

Word Embedding

One-hot-encoding 缺点 1.向量维度和向量个数很大,假设有1w个token的话,向量个数和维度就都是1w 2. 语义相近的词的向量并不相似 Word Embedding 核心思想:可以通过上下文理解单词的语义 predection-based方法 使用前一个单词预测下一个…

【机器学习】信息量、香农熵、信息增益

这节可以搭配 【机器学习】Logistic回归(重新整理)信息量(信息)信息量公式的推理过程 香农熵信息增益 【机器学习】Logistic回归(重新整理) B站视频:“交叉熵”如何做损失函数?打包…

Linux一学就会——编写自己的shell

编写自己的shell 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行…

视觉震撼的数据可视化示例

众所周知,数据可以非常强大——当你真正理解它告诉你什么时。 数据和信息可视化(数据可视化或信息可视化)是对大量复杂的定量、定性数据、信息进行设计和创建易于沟通、易于理解的图形或视觉表示的实践,在静态、动态或交互式视觉项目的帮助下&#xff0…

存储网络架构——DAS、NAS、SAN、分布式组网架构

目录 DAS直连式存储 NAS网络附加存储 SAN存储 存储区域网络 分布式存储组网 DAS直连式存储 DAS遇到的挑战 NAS网络附加存储 向主机提供文件服务;文件系统由存储设备维护,用户访问文件系统,不直接访问底层存储 拥有所有主机上文件与底层存储空…

JS案例分析-某国际音x-tt-params参数分析

今天我们要分析的网站是:https://www.tiktok.com/selenagomez?langen,参数名字叫x-tt-params。 先来抓个包 这个接口是用户视频列表url,参数叫x-tt-params,该接口中还有其他参数像msToken,X-Bogus, _sig…

【51单片机】点亮一个LED灯(看开发板原理图十分重要)

🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The Right Path】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔基础内容 &#x1f3f3…