热门标签 | 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 上的文件过多,会导致线程处理不过来,无法及时清理掉对应的磁盘文件,从而导致磁盘被打满等异常情况。



推荐阅读
  • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
    收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入解析RDMA中的队列对(Queue Pair)
    本文将详细探讨RDMA架构中的关键组件——队列对(Queue Pair,简称QP),包括其基本概念、硬件与软件实现、QPC的作用、QPN的分配机制以及用户接口和状态机。通过这些内容,读者可以更全面地理解QP在RDMA通信中的重要性和工作原理。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 深入理解Kafka架构
    本文将详细介绍Kafka的内部工作机制,包括其工作流程、文件存储机制、生产者与消费者的具体实现,以及如何通过高效读写技术和Zookeeper支持来确保系统的高性能和稳定性。 ... [详细]
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社区 版权所有