Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. Java
  3. 正文
                           

【原创】Kafka如何选择合适的分区数,你选对了吗

2020-08-04 2744点热度 0人点赞 0条评论











点击上方蓝色字关注我们~


我们经常会面临这样的问题,在确定某个topic下应该设置多少分区数,有时并不知道应该如何设置,如何评估等。或者别人问你当前kafka集群中,具体的业务topic中分区数是多少,是如何知道需要多少分区或怎么选择比较适合的分区数。



1

结合业务场景和非业务条件


那么我们应该如何选择合适的分区数呢?


具体的业务具体分析。


但是前期我们可以根据这些条件:实际业务场景(消息总量,消息生产或消费频率,要求的吞吐量等)、软件条件、硬件条件、负载情况等,进行大致的评估我们可以设置topic多少分区数。




2

使用压测工具,得出最佳分区数


kafka官方也提供了脚本方便我们针对我们的kafka集群做测试,我们可以测试当前提供的硬件条件进行压测,得出当前机器环境到底能支持多少分区数,从而达到尽量最优的方案。


生产者性能测试脚本:kafka-producer-perf-test.sh

消费者性能测试脚本:kafka-consumer-perf-test.sh


设置好topic的某个分区数,之后我们可以选择不同的参数:比如消息发送总量、单条消息大小、吞吐量、acks、消费线程数等等,这样压测之后就能得出一份测试报告,报告包含的数据有:50%/90%/95%/99%的消息处理耗时、平均处理耗时、每秒消息发送吞吐量、每秒拉取的消息的字节大小/消息数量、消费总数、再平衡时间、按消息计数/消息大小计算的吞吐量等等。


合适的增加分区数是可以提高吞吐量,但超过一定的阈值之后,吞吐量也会随之下降。如果生产上对吞吐量有一定的要求,可以在生产机器硬件条件下进行压测,得出适合你的最优分区数。




3

吞吐量越高并不会一直与分区数有关


对kafka生产者而言,数据写入每个分区是可以并行进行的。对kafka消费者而言,每个分区只能给一个消费者线程消费,所以消费组的消费并行度依赖于分区数。这样看来好像分区数越多,理论上吞吐量应该越高。


但是,事实真的是这样吗?


消息中间件kafka的吞吐量并不只是跟分区有关。


消息写入(生产)的吞吐量与这些有关:消息大小、消息压缩方式、消息发送方式(同步或异步)、消息确认类型acks、副本因子等。


同样,消息消费的吞吐量与业务逻辑消费速度等有关。




4

分区数与操作系统有关


分区数也不能无限制的增加,因为其占用了文件描述符,进程可支配的文件描述符是有限的。


一般如果要设置比较大的分区数,要特别留意是否超过系统的最的大描述符文件。虽然可以通过改系统配置,但是应尽量避免这种,毕竟文件句柄也是有开销的。




5

注意消息写入分区策略


我们知道消费写入哪个分区,默认或者有些会根据Key计算其应写入哪个分区,这个时候就要考虑与Key较强关联的应用是否会影响你的使用场景。


比如有些应用场景可能只是要求某个分区内消息有序,如果一旦调整分区数,就有可能影响这种使用场景。


所以我们一般会尽量配置较好的分区数,尽量满足未来2年内目标的吞吐量。


如果与Key关联较弱的应用,我们可以在未来根据实际情况进行增加分区数。




6

分区数会影响系统可用性


Kafka通过多副本机制实现集群高可用和高可靠,每个分区至少会有一个或多个副本,每个副本会存在于不同的Broker节点,并且只有leader副本对外提供服务。


kafka集群内部所有副本都采用了自动化的方式进行管理,所有副本的数据都能保持一定程度上的同步。当Broker发生故障,leader副本所在的Broker节点上的所有分区将处于暂不可用状态。


此时集群内follower副本就会重新进行选举出leader副本,整个过程由kafka控制器负责,并且集群上的分区会存在暂时不可用,并且如果分区数过多,这个不可用的时间窗口就会更大。





7

分区数越多也会增加耗时


分区数越多,kafka在正常启动和关闭的耗时也会变得越长。


与此同时,主题分区数也会在日志清理时增加耗时,也会在删除时耗费更多的时间。在旧版本上是比较明显,在新版本已经得到了改善。





8

分区数理论参考设置值


一般情况下,分区数可以配置为Broker节点数的整数倍,比如:Broker节点是3,那么可以设置分区数为3、6、9。


但是在broker节点数庞大的情况下,比如大几十、上百、上千则不合适,一般这种也是比较极少的吧,除非有BAT的量级。如果需要可以在选定分区数时可以进一步考虑引入机架等参考因素。





9

实际情况具体分析,切勿盲目


最后,当你后期增加分区数时,要注意是否有必要或合理。笔者曾见过这种场景:将日志消费后写入es,但是存在消息堆积严重,于是将分区数从6个增加到12个,此时对堆积情况并没有很好得到改善,甚至出现更差(比如同一日志文件日志数据出现不连续,即有序),最后只能删掉主题,重新设置原来的分区数。


因为系统的主要瓶颈在于es的写入能力,造成消费速度慢,从而引起海量日志消息的堆积。


所以分析出当前的主要问题(瓶颈等)很重要,切记不能随意或盲目设置分区数。


参考书籍:《深入理解kafka》


kafka相关文章:

这些MQ概念你都懂吗:死信队列、重试队列、消息回溯等

Kafka面试题!掌握它才说明你真正懂Kafka
Kafka的20项最佳优化实践
回复公众号【资料】获得干货资料集锦:技术ppt、IT大会资料、架构、分布式资料等。
推荐好文

1、互联网Code Review最佳实践分享

2、dubbo面试题!会这些,说明你看懂了dubbo源码

3、Kafka面试题!掌握它才说明你真正懂Kafka
4、
Netty 5.0为啥被舍弃?原因竟然是...
5、
中台之上——业务架构系列【汇总】

6、必备瑞士军刀IDEA插件,你使用了哪些

7、线上热更新代码只需3步 Arthas实战

8、Eureka源码剖析之七:架构&面试题【总结】

9、互联网工程师应该用这种姿势打印日志

10、加入:互联网基础/架构交流群

-关注搬运工来架构,与优秀的你一同进步-

如果喜欢这篇文章可以点在看哦↘

本文仅供学习!所有权归属原作者。侵删!文章来源: 搬运工来架构

更多文章:

  1. Kafka为什么要去掉ZooKeeper?一文了解Kafka 中 ZooKeeper 的演变过程
  2. 手把手教你实战TDD
  3. 殷浩详解DDD 第四讲:领域层设计规范
  4. 从代码到设计的性能优化指南
  5. 这些MQ概念你都懂吗:死信队列、重试队列、消息回溯等
  6. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  7. 超实用的IDEA插件推荐!百万级下载量
  8. 【视频】如何写高效内存Java代码——How to Write Memory-Efficient Java Code
  9. 【视频】NettyInAction作者:统治一切的框架Netty- One Framework to rule them all
  10. 笔记 | 面试官问我:TCP与UDP的区别
标签: 原创
最后更新:2020-08-04

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
最新 热点 推荐
最新 热点 推荐
微服务架构:必懂的6大性能维度 Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议
视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代微服务架构:必懂的6大性能维度
Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 大型系统架构重构10步法 MySQL事务死锁问题排查 记一次事务里发普通消息的线上问题排查过程 视频笔记:什么是AI 智能体? 事件驱动架构(EDA) VS 请求响应架构(RR) 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 分布式事务的几种实现方式

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2