热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KAFKA进阶:深入探讨kafka分区数过多的问题及影响

大家好,这是一个为了梦想而保持学习的博客。这个专题会记录我对于KAFKA的学习和实战经验,希望对大家有所帮助,目录形式依旧为问答的方式,相当于是模拟面试。一、概述在对kafka有了

大家好,这是一个为了梦想而保持学习的博客。这个专题会记录我对于 KAFKA 的学习和实战经验,希望对大家有所帮助,目录形式依旧为问答的方式,相当于是模拟面试。





一、概述

在对 kafka 有了基础的认知之后,回过头来看看,当前 kafka 的 存储架构 还存在哪些问题呢?
很多地方有提到 kafka 无法承载大量的分区这个问题,但是都只给了个结论,没有说明其中缘由,这里我们就来梳理一下。




二、磁盘顺序写特性被破坏,导致写入吞吐量下降

我们从前面的【十一】小节知道,kafka 有如此高的写入吞吐量,主要是得益于追加写的性能极高,但是如果这个特性被破坏,那么写入吞吐量就会有明显的下降,那么什么时候会破坏这个特性呢?我们先从基本的磁盘 IO 说起。

机械硬盘的 IO 过程可以简单的理解为两个阶段:寻址 + 数据写入 其中寻址是个物理动作,就是需要通过旋转加上磁臂去找到对应的扇区,这个过程的耗时是毫秒级的,相对于其他计算机类的操作,高出了好几个数量级。 而数据写入呢,就是将我们的数据写入物理载体中,相对来说也是很快的。

从这个大概的过程中,我们知道,机械硬盘的 IO 过程慢就慢在寻址这个操作上,那我们有没有什么办法能优化掉这个过程呢?其中一个优化点就是追加写。
试想你一直只对一个文件进行写入,那么磁臂就根本就不需要再寻址了呀,接着往下写就好啦,所以就省去了寻址的这个开销,让写磁盘的性能能接近写内存。
也正是由于追加写的这个特性,在 Linux 的 IO 调度层面,有 4 种不同的调度策略,都尝试将随机的 IO 请求尽可能的合并成顺序写或者临近读,从而优化 IO 性能,在这里我简单的提一下,大家有兴趣可以进行查阅相关资料:



  • NOOP:大致上就是所有进程共用一个先进先出队列,做了简单的相邻请求合并。

  • CFQ(默认):特点是按照 I/O 请求的地址进行排序,而不是按照先进先出的顺序响应的,并且会为每个进程都创建一个这样特点的队列。但是存在 “饿死” 的场景,也就是我一个很小的读请求要读取很后面的地址,但是因为排序之后,被前面的很大的 I/O 请求给卡住了,导致无法被执行。

  • DEADLINE:针对 CFQ 算法进行了优化,为每个请求设置了超时时间,如果达到了这么个时间一定要被调度执行,读等待时间为 500ms,写等待时间为 5s。

  • ANTICIPATORY:为每个 I/O 都设置 6ms 的等待时间窗口,如果 6ms 内收到了相邻的 I/O 请求,那么就进行合并,通过增加时间的方式来获取更高的性能,尽可能的将随机读写转换为顺序读写。

进入正题,为什么 kafka 的分区数多了知道会破坏追加写的特性呢?
分区底层对应的是底层一个个 segment 文件,如果一个 broker 上,有上万个分区,那么对应的就需要去写上万个 segment,那么从磁盘的角度来说就是我刚写完 A 文件,又要重新寻址去写 B 文件,以此类推,当文件一多,就相当于是随机 IO 了,追加写的特性就由此被破坏,写入吞吐量就受到了非常大的影响。另外提一句,RocketMQ 就是基于这个原因将所有分区数据都写到一个 commitLog 中来规避这个问题。

最后再提一句,我们在说随机 I/O 和追加写的时候,是站在磁盘的角度去说的,跟上层持不持有 file 的引用或者用什么流去写入没有什么关系,这也是我之前认知的一个误区。

另外就是,这个问题只会存在于机械硬盘,云盘和 SSD 都不会存在,因为云盘走的是带宽,而 SSD 是元器件也不需要物理旋转寻址。




三、集群故障转移受影响,导致故障转移耗时增加

另外一个影响点就是我们日常运维会遇到的问题,故障转移和集群状态恢复时间受到影响。
其中的影响点主要是由于 kafka 故障转移时主要依靠 controller+zk 去实现的,而整个过程的是单线程顺序去执行的,整个过程大概分为:计算新的 leader + 更新 zk 数据 + 通知其他节点将 follower 变为 leader + 更新元数据。而在这个过着执行完之前,对应受影响的分区都是没有 leader 可以去提供读写服务的,所以对业务的影响是很大的。
试想我们集群有几十万的分区数,那么这个过程将非常耗时,达到分钟级别甚至小时级别。但是 kafka 在 1.1.0 版本优化了这个问题,主要优化点三个:zk 批量异步写 / 批量计算通知 / 日志优化。
具体参见胡夕大佬的翻译文章:【译】Apache Kafka 支持单集群 20 万分区




四、元数据太过庞大,导致更新元数据操作变重

这个问题就是显而易见的了,当分区数很多的时候,整个集群的元数据将会变得庞大,一旦集群状态变化,整个集群都会更新元数据,但是由于元数据太过庞大会让这个更新操作变得非常沉重。




五、日志清理受影响

kafka 的日志文件操作,是 broker 有个后台清理线程去定时检查执行的,一旦一台 broker 上的文件过多,会导致线程处理不过来,无法及时清理掉对应的磁盘文件,从而导致磁盘被打满等异常情况。



推荐阅读
  • 历经两个月,他成功斩获阿里巴巴Offer
    经过两个月的努力,一位普通的双非本科毕业生最终成功获得了阿里巴巴的录用通知。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 全面解读Apache Flink的核心架构与优势
    Apache Flink作为大数据处理领域的新兴力量,凭借其独特的流处理能力和高效的批处理性能,迅速获得了广泛的关注。本文旨在深入探讨Flink的关键技术特点及其应用场景,为大数据处理提供新的视角。 ... [详细]
  • 本文探讨了有效学习专业技能的方法,包括编程语言、操作系统、软件组件及前沿技术的探索,旨在为初学者提供一套系统的自学指南。 ... [详细]
author-avatar
10灬月
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有