Kafka高吞吐核心机制:分区与副本原理及生产实践
发布时间:2026/10/23 7:05:40 锦皓数字建站

这个系列写到第七篇了。前几篇我们把topic、生产者、消费者这些概念都过了一遍后台留言里问得最集中的一个问题就是Kafka凭什么能扛这么高的吞吐消息到底会不会丢分区和副本到底是怎么配合的说实话这几个问题的答案最后都落到了同一件事上——分区和副本机制。分区决定了Kafka的水平扩展能力和消费者并行度副本决定了Kafka在机器宕机时是不是还能继续服务、数据还能不能保住。这篇我不想再复述官方文档里的分区和副本简介而是直接按生产环境的视角把磁盘上的数据结构、ISR、HW、Leader Epoch、分区分配策略、acks和min.insync.replicas的配合、线上故障排查全部串起来讲一遍。适合刚学完基础、正打算把Kafka往深了用的同学也适合已经在维护Kafka但对一些细节还是模棱两可的人。1. 为什么分区和副本是Kafka的命脉1.1 分区一个主题拆成多条有序队列Kafka里的一个topic在逻辑上是一个数据流但物理实现并不是一个大文件。主题会被拆成若干个partition每个分区本质上是独立有序、不可变、只能追加写入的消息日志。分区内的offset从0开始单调递增但是不同分区之间没有全局顺序。我见过不少新人一开始默认“topic里的消息是全局有序的”结果一上并发消费就发现顺序全乱了其实就是没理解分区这个局部有序、全局无序的特性。分区带来的核心收益是并行和水平扩展。一个分区在单台机器上顺序写文件的效率已经很高但单机吞吐总归有上限。把数据拆到多个分区并分散到多台broker之后生产、消费、存储全部可以并行吞吐能力才能真正往上走。拿快递站打比方topic是目标城市分区是分拣通道同一个通道里的包裹按顺序排列但不同通道之间谁先谁后不影响大局。没有分区Kafka就是一个跑在单机上的顺序日志完全失去分布式队列的意义。这里要特别注意几个限制分区数创建之后只能增加而且增加会导致按key哈希的分区映射关系变化分区数是消费者并行度的上限一个分区同一时刻只能被同一个消费组里的一个消费者进程读取分区太多又会带来文件句柄、内存和网络资源开销。所以分区数不是一个可以随便拍脑袋设置的数字后面第3节我会给出一套可落地的计算思路。1.2 副本把数据复制到多台机器上Kafka的高可用来自于副本。每个分区可以有多个replica副本之间分为leader和followerleader负责读写follower只负责从leader那里同步数据并做备份。主题的replication.factor参数决定了副本总数生产环境我建议至少配3。副本因子3意味着一个分区的数据会在3台broker上各有一份任何一台宕机数据和读写服务都不会断。为什么读写都集中在leader而不是让follower也开放写核心原因是为了避免分布式写冲突。如果同一个分区的多个副本都能接受写入就必须处理复杂的并发冲突和一致性协议高吞吐无从谈起。Kafka的模型是“单点顺序写、多点异步备份”同一分区的写入路径只有一条follower只从leader拉数据。你可以把它理解成主备数据库的日志同步每次写操作先在主机执行再从备机追日志主机挂了备机顶上对外看这个分区仍然是可用的。副本的放置还会考虑机架感知把同一分区的副本尽量分布到不同机架、不同机器上避免一个机架断电导致所有副本同时不可用。副本因子也不是越大越好3副本能容忍一台broker故障5副本虽然容错更强但磁盘和网络成本翻倍。之前我接手过一个集群为了省磁盘把副本因子设成2一台broker宕机后ISR常常只剩1个副本连min.insync.replicas都满足不了生产写入直接失败。只能说副本因子2的情况高可用效果很尴尬很多场景下反而不如1副本加快速恢复来得省心。2. 分区与副本的底层构成2.1 磁盘上的一个分区长什么样每个分区在磁盘上对应一个目录目录名是topic-分区编号比如orders-0。进入目录后你不会看到一个完整的大文件而是看到一组segment。每个segment包含三个主要文件.log存放消息数据.index存放offset索引.timeindex存放时间戳索引。segment的大小由log.segment.bytes控制默认1GB写满后滚动生成新的segment。磁盘上这套逻辑非常重要Kafka的高性能就建立在顺序写和索引分段这两个设计上。写消息时数据只是追加到当前活跃segment的.log文件末尾不需要随机读写所以单分区顺序写磁盘的速度非常快。删除旧数据时只需要把过期的整个segment删掉不会动正在写的文件。消费端定位消息时给定一个offset系统会先在所有segment中按起始offset做二分查找找到包含这个offset的segment文件再通过.index里的稀疏索引做一次粗粒度定位最后在.log里顺序扫描少量消息。这种“二分查找段定位加稀疏索引加快定位”的方式跟一个几GB大文件从头读到尾相比性能完全不在一个量级。2.2 AR、ISR、OSR三个集合的关系创建主题时系统会为每个分区生成一个副本分配清单这个清单叫AR即Assigned Replicas。比如说分区0的AR是[1, 2, 0]意思是broker 1、2、0上各有一个该分区的副本其中排在最前面的往往是优先副本。AR在整个分区的生命周期内基本保持不变除非你手工做分区副本迁移。AR里当前与leader保持同步的副本集合叫ISR即In-Sync Replicas。ISR里的副本是leader真正依赖的备份生产者的acksall时leader要等ISR内所有副本都确认写入才返回成功。AR里剩余那些已经掉队或者宕机的副本叫OSR它们仍然属于AR但暂时没有资格参与数据“背书”。一句话概括AR是法定清单ISR是当前靠谱清单OSR是待观察清单。ISR是动态变化的follower追不上leader就会被踢出ISR追上了再加回来。比如topic有3个副本broker 1上的follower因为磁盘慢超过阈值没跟上leaderISR就从3个缩到2个。等它恢复并追平又会重新回到ISR。这个收缩和扩容的过程在监控里对应IsrShrinksPerSec和IsrExpandsPerSec两个指标。2.3 LEO、HW和Leader Epoch每个副本都会维护一个LEO即Log End Offset表示下一条消息将要写入的位置。LEO并不是单纯指文件末尾而是每个副本各自记录的同步水位。HW即High Watermark是分区的高水位它的数值等于当前ISR集合中所有副本LEO的最小值。HW同时是消费者的可见边界。offset小于HW的消息消费者可以读到等于或大于HW的消息即使已经写进了leader但因为还没有被足够多的ISR副本确认Kafka认为它们是不提交的不允许消费。为什么要设这么一条边界因为消费者的读取不能依赖某一时刻leader上的临时数据否则一旦leader故障新leader来自一个数据落后的follower消费者之前读到的消息就凭空消失了出现消费回退。HW把消费者的读水位和“已被ISR确认”的水位对齐最大程度避免了这种情况。Leader Epoch是另一个容易被忽略但很关键的概念又叫leader纪元。每次发生leader选举Epoch值就加1。broker之间通信时会带上这个Epoch用来识别请求是否来自已经过期的旧leader。一个典型的场景就是“僵尸leader”旧leader网络断开后新leader选举产生并开始写入此时旧leader恢复过来如果它还能以曾经的leader身份继续写就会覆盖新leader的数据。有了Epoch新leader可以直接拒绝旧leader的请求或者强制旧leader先截断日志保证数据不会被乱写覆盖。3. 分区的核心使用3.1 生产者如何决定写入哪个分区生产者在发送消息时有三个层面的分区分流逻辑如果消息指定了分区编号直接写那个分区优先级最高如果消息带了key但没有指定分区就对这个key做Murmur2哈希再用结果对分区总数取模算出来的编号就是目标分区如果key和分区都没指定生产者会使用sticky策略先选一个分区持续写入一批消息凑满后再切换相比每一条都轮询切换批量发送效率更高。默认策略看起来简单但理解它对业务非常重要。比如说订单系统把订单号作为key发送那么同一个订单号的所有状态变更都会进入同一个分区。由于分区内消息严格有序消费者按分区读取时就能按顺序还原一个订单从创建到支付到完成的完整生命周期。这就是Kafka能支撑事件溯源类需求的基础。分区数一旦增加hash取模的基数变了原来的key很可能被分到新的分区依赖“同一个key进同一个分区”的顺序保证就被打破。所以给重要业务topic扩充分区数之前一定要先确认业务是否依赖key的顺序。如果依赖要么接受顺序被暂时打乱要么在设计时就预留足够的分区数。如果默认分区逻辑不满足需求也可以实现自定义Partitioner接口在代码里根据业务字段决定分区。例如需要把同一个渠道的消息集中到一起再批量处理可以在partition方法里根据渠道ID映射到固定分区。3.2 消费者如何分配分区生产者决定了消息去哪消费者端还需要决定谁消费哪个分区。消费者组内的协调者负责这件事触发时机包括消费者加入、退出、订阅变化、分区数变化这个过程就是rebalance。分区分配策略主要有四种RangeAssignor是按主题分区范围分段比如一个topic有12个分区、3个消费者Range可能把0到3分给消费者A4到7分给B8到11分给C如果消费者数不能被分区数整除前面的消费者会多分容易不均衡RoundRobinAssignor跨所有topic轮流分配相对均匀StickyAssignor的核心是尽量保留已有分配结果rebalance时只把需要挪动的分区挪走CooperativeStickyAssignor则更进一步支持增量式rebalance减少整个消费组的停顿。如果topic只有一个且分区数能被消费者数整除用哪种策略差别不大。如果topic数量多、分区数参差不齐我建议优先考虑Sticky或者CooperativeSticky。另外有一个很容易踩的坑消费组里起了5个consumer但topic只有3个分区最后至少有2个consumer一直都空闲着日志看着正常实际根本没活干。把消费者数量堆到超过分区数不会增加消费速度只会白白增加rebalance的频率。3.3 分区数到底怎么定这是一个非常现实的问题。常见错误是拍脑袋定个8个、16个理由是“看着吉利”。我建议按下面这个思路来算第一步先做压测得到两个基准值。单分区生产吞吐上限记为P也就是一台broker上单个分区持续写入的峰值单消费者处理上限记为C即一个consumer实例在真实业务逻辑下消费并处理单个分区的速度。第二步根据目标峰值吞吐T算最少分区数最少分区数 max(T / P, T / C)。这里取大的那一项因为生产和消费两端谁的能力差谁就是瓶颈。第三步给峰值冗余留余量建议乘1.5到2倍同时尽量让分区数等于broker数量的整数倍方便均匀分布。举一个实际的例子。目标峰值是每秒处理1万条消息单分区生产实测能扛到8000条每秒单消费者处理大概3000条每秒。消费侧是瓶颈按公式最少需要ceil(10000 / 3000) 4个分区。留2倍余量就是8个。如果集群有3台broker取12个可能更合适因为12是3的整数倍既方便均匀分布又给突发流量留足空间。也要清楚分区数的成本。每个分区和副本都会在broker内存中占用元数据空间在磁盘上占用文件句柄还会增加rebalance时长。一个单topic几百上千分区的集群一旦某台broker抖动导致大量leader切换controller要处理的元数据变更量会非常大整个集群的恢复时间会明显变长。Kafka不是分区越多越分布式而是要在并行度和资源成本之间取平衡。4. 副本同步与故障恢复4.1 follower是怎么同步的follower的同步机制从外部看很像一个消费者它向leader所在的broker发起FetchRequest按offset顺序拉取新消息然后在本地写盘并更新自己的LEO。只不过消费者读走消息不影响消息留存follower则要把消息真正复制到本地文件是物理意义上的备份。这种同步是异步的所以follower的LEO天然会落后于leader。同步过程涉及的参数主要有replica.fetch.max.bytes、replica.fetch.wait.max.ms等控制的是follower每次fetch能拉多少数据、最多等多久。正常情况下follower会非常快地追上leader几毫秒到几十毫秒的差距都很正常。如果网络、磁盘或者CPU出现问题follower的LEO会逐渐落后进而触发后面说的ISR剔除。另外Kafka 2.4之后引入了一个允许消费者从follower副本读取的特性前提是配置了rack awareness并且在消费者端指定了client.rack。这个特性在跨机房场景下很有用可以把读流量分散到本地机房的副本上减少跨机房带宽消耗。不过需要明确的是默认情况下读写仍旧全部走leader副本主要还是备份角色。4.2 ISR的收缩与恢复Kafka判断follower是否还配得上ISR的标准是一个时间窗口replica.lag.time.max.ms。如果follower在这个时间窗口内没有向leader发起有效的fetch请求或者它的LEO没有跟上来leader侧的副本管理器就会把它踢出ISR。这个参数的默认值在不同版本里不太一样多数情况下在10秒到30秒之间具体看集群实际版本。旧版本还曾经有一个按消息条数判断的replica.lag.max.messages后来官方把它移除了因为按条数判断太容易被流量波动误伤。比如一次性写入大批消息follower虽然正在拼命拉取但只要瞬时的lag超过条数阈值就会被移出ISR过一会又加回来造成毫无意义的抖动。现在只看时间业务逻辑更干净。ISR收缩本身不会立刻导致数据丢失只是让这个分区的“可信备份”数量变少了。follower恢复后会重新追上leader的LEO重新进入ISR。如果监控里看到ISR频繁收缩又恢复说明集群里存在周期性或者持续性的性能问题。排查顺序一般是磁盘IO有没有打满GC有没有长时间停顿网络有没有丢包CPU有没有被抢占。4.3 Leader选举机制当leader所在的broker宕机Kafka的controller会负责选出新的leader。选举逻辑本身不复杂优先从当前ISR里挑一个存活的副本作为新leader。ISR里的副本数据是完整的选它们不会丢数据。麻烦的是ISR为空的情况。比如三副本集群里两台broker同时宕机剩下一个副本本就不在ISR里它的数据落后于之前的leader。此时有两个选择允许unclean选举或者让分区处于无leader状态。unclean.leader.election.enable这个参数控制的正是这一点。默认是false即宁可不选也不选一个数据不完整的副本上来如果设成true则在ISR为空时选择任意存活副本当leader。这里一定要想清楚代价。开unclean选举分区可用性保住了但选上来的副本可能丢消息而且之前已经写入的消息也可能被截断。订单、支付、库存这类状态强一致的数据必须关掉日志、监控、点击流这类允许少量丢失的数据可以为了换可用性打开。同一个集群里的不同topic可以通过topic级配置单独覆盖。还有一个优先副本的概念。AR里排在第一个的副本叫preferred replica稳定状态下Kafka希望由它来当leader因为它通常对应当初创建分区时的最佳机架分布。集群长时间运行后leader可能漂移导致某些broker热点。这时候可以用工具触发preferred leader election把leader调整回优先副本。4.4 副本故障时会发生什么把副本故障拆成两种情况来看leader故障和follower故障的处理路径完全不同。leader故障时controller感知到broker下线会触发选举流程从ISR里挑一个新leader然后更新集群元数据。客户端不需要手工感知它们会通过metadata请求发现leader变了后续读写自动切到新leader上。这个窗口期内分区会有短暂不可用正常情况毫秒级恢复。follower故障时leader只会把它移出ISR。只要ISR里剩下的副本数量还满足min.insync.replicas读写完全不受影响。如果follower故障后ISR缩到低于阈值配置了acksall的生产者会收到NotEnoughReplicasException写请求开始报错这是保护机制在起作用而不是系统坏了。follower恢复后第一步是找到当前leader比较本地LEO和leader LEO的差距。如果本地日志存在落后于leader的部分就把落后的消息全部拉回来如果本地日志里有因为异常状态多出来的未同步消息follower会先做日志截断把自己对齐到leader的位置再继续追数据。这个过程保证了同一分区的所有副本最终数据一致。5. 生产者的acks与副本的配合5.1 acks三档到底怎么选生产者acks参数是发送可靠性最直观的一个开关一共三档第一档acks0发出去就不管了生产者不等broker任何确认消息可能丢但吞吐最高适合指标上报、日志采集这些可容忍丢失的场景。第二档acks1leader把消息写入本地日志就返回成功不需要等follower确认。这种情况在leader正常时不丢但leader在消息尚未同步给follower时宕机消息就丢了。这是很多内部系统在吞吐和可靠性之间做的折衷。第三档acksall或-1leader要等到ISR里所有副本都写入成功才返回。注意这里说的是ISR里的所有副本不是AR里的所有副本。如果ISR里只剩下leader一个副本acksall依然会成功因为“所有ISR副本”就只有它自己这种情况数据其实很不安全。所以acksall要跟min.insync.replicas配合才能真正把可靠性锁住。很多人对Kafka的可靠性有误解以为默认配置就能保证不丢消息。其实Kafka从不承诺“开了就永不丢”它承诺的是“在满足指定副本同步条件下的不丢失”。丢消息的三个边界往往是生产端配置、副本同步、unclean选举三个环节依次失守。5.2 min.insync.replicas为什么这么重要min.insync.replicas的值定义了分区至少要有多少个ISR副本才允许写入。如果ISR副本数小于这个值生产请求直接失败报NotEnoughReplicasException。它存在的意义是防止acksall在ISR缩水后形同虚设。经典配置组合是副本因子3min.insync.replicas2生产者acksall。来算一下这个组合的容灾能力。正常时ISR有3个副本满足min.insync2写入正常。一台broker宕机ISR可能缩到2个写入继续正常。如果第二台broker也宕机ISR剩1个小于2写入开始失败。这样数据的损失上限是可控的因为至少有两份副本确认过消息才算是写入成功。另一面也要看到min.insync.replicas不是越大越好。如果副本因子是3却把min.insync.replicas也设成3那么只要一台broker稍微出一点问题ISR从3变2整个topic就写不动了可用性大幅下降。一般建议是在副本因子基础上减1也就是3副本配25副本配3或4具体看业务对可用性和数据安全哪个更敏感。5.3 丢消息的三个边界第一个边界是生产端。acks0或1都可能在leader故障的窗口期丢消息。acks1时leader刚写入成功就返回但消息还没同步给followerleader立刻宕机这条消息只存在于一个副本上新leader被选出来时它已经不存在了。第二个边界是ISR副本数不足。即使acksall如果ISR里只有leader一个副本写入照样成功。这块数据只有一份随后leader宕机数据就彻底没了。所以只开acksall但不管min.insync.replicas可靠性仍然有洞。第三个边界是unclean leader election。当ISR为空允许unclean选举后会选一个数据落后的副本当leader它在被选中的时刻之前未同步的消息对于消费端来说已经丢失后续新写入的消息也不会包含旧leader曾接收但未同步的部分。把三个边界都堵上才算构建了一个“生产不丢、存储不丢、切换不丢”的可靠链路acksallmin.insync.replicas2副本因子3unclean.leader.election.enablefalse。任何一个环节为了性能或可用性开了个口子结果都可能不一样。6. 线上运维常用命令与监控指标6.1 我常用的一组排查命令实际运营中遇到分区或副本问题第一步通常是查看topic的分区分配状态。用describe命令可以直观看清楚每个分区的Leader、Replicas和Isrkafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders如果输出显示某个分区Leader: 1Replicas: 1,2,0但Isr: 1,2就说明broker 0上的那个副本已经掉出ISR了。你可别急着说“集群挂了”多数情况下只是follower暂时落后先看日志和监控确认原因再决定操作。做分区的副本迁移时需要先准备一个json文件描述每个分区要从哪里搬到哪里。执行命令如下kafka-reassign-partitions.sh --bootstrap-server localhost:9092 --reassignment-json-file reassign.json --execute这个操作是滚动迁移segment会一段段复制过去期间读写不受影响但要关注网络压力和控制迁移速率。手动调整leader分布时可以用preferred leader election让leader回到优先副本kafka-leader-election.sh --bootstrap-server localhost:9092 --topic orders --partition 0 --election-type preferred注意新版的命令行已经全面支持用bootstrap-server直连broker不再强制要求zookeeper地址建议统一用新写法减少对旧依赖的维护。6.2 关键监控指标速查指标含义什么时候要担心UnderReplicatedPartitions副本数量低于设定值的分区数长期大于0说明副本同步有问题OfflinePartitionsCount没有leader的分区数大于0说明读写可能中断IsrShrinksPerSec每秒ISR收缩次数频繁大于0有follower跟不上IsrExpandsPerSec每秒ISR扩容次数与收缩交替出现集群在抖动ActiveControllerCountcontroller存活标识全集群应当只有1个值为1NetworkProcessorAvgIdlePercent网络线程平均空闲率持续偏低说明broker繁忙监控指标是做不了假的。如果UnderReplicatedPartitions长期不为0不要先想着调监控阈值而是要去找那台broker为什么没有把副本同步上去。指标只是报警器真正的根因几乎都在磁盘、网络、GC和元数据压力上。7. 常见问题与排查实录7.1 新增broker后分区不均衡新加broker后老broker上的分区和副本不会自动搬过去结果新broker一直在“当观众”老的几台机器磁盘用到90%新增机器20%都没到。这种现象非常常见本质是Kafka不会主动做数据平衡需要人工介入。解决办法是用kafka-reassign-partitions.sh生成一份全量均衡方案。我的习惯是先生成一份包含所有topic的json用工具生成候选分配方案确认后执行。如果只需要挪少量分区也可以手工写json。执行过程就是滚动复制segment建议在业务低峰期操作并且加限速配置否则大量副本迁移的流量可能把生产链路拖垮。7.2 ISR频繁抖动现象是监控图里IsrShrinksPerSec和IsrExpandsPerSec像心电图一样跳个没完。这种抖动说明有follower反复地落后、被踢出ISR、再追上、再加入。最典型的根因是磁盘IO。曾有个业务大促时日志量突然暴涨单块云盘的平均写延迟从几毫秒涨到几百毫秒follower的fetch请求迟迟处理不完就被反复踢出加回。排查优先级我一般是这样先看磁盘写延迟和IO util再看broker的GC停顿再看网络丢包和跨机房带宽最后才怀疑参数配置。如果只是偶尔抖动可以适当调大replica.lag.time.max.ms给系统一些缓冲但如果是持续性的参数怎么调都没用必须解决根因。7.3 Leader选举失败分区长期处于无leader状态最常见的组合是unclean.leader.election.enablefalse而ISR里所有副本都不可用。遇到这种情况先别急着修改配置先确认原leader是宕机了还是进程假死。如果原leader进程还在但已经不响应可能是被controller误判下线需要检查网络或者看broker端的fenced状态。如果真的所有ISR副本都无法恢复决策点就回到可用性和数据安全之间。对可丢数据的业务可以临时打开unclean选举让分区先恢复可用事后再用备份链路补数对不可丢数据的业务宁可等待原leader恢复也不要强行选一个落后副本。这个决定最好提前写进运维预案不要等故障发生时再拍脑袋。7.4 消费者组rebalance风暴rebalance风暴在监控上的表现是消费延迟忽高忽低offset提交老是失败日志里大量JoinGroup和SyncGroup请求。原因多半是consumer进程频繁加入或退出导致分区被反复分配。常见根因有session.timeout.ms设得太小比如3秒consumer处理一条消息稍微慢一点协调者就判定它死亡心跳线程被业务逻辑阻塞或者客户端版本与服务端不兼容协调者每次rebalance都要做状态迁移。我的建议是把处理逻辑放到独立线程池让主消费线程只负责poll并快速提交同时确保session.timeout.ms和max.poll.interval.ms留出足够的余量避免“明明还活着却被认为死了”的尴尬。7.5 分区和副本问题速查现象可能原因优先处理动作消息消费顺序乱跨分区消费或单分区多consumer检查key分区策略和消费组分配生产端写入偶发超时ISR频繁收缩或min.insync不够看磁盘IO和ISR监控某个分区长期没leaderISR为空且禁止unclean选举判断是恢复原leader还是紧急切换新增消费者后消费变慢消费者数超过分区数减少消费者或增加分区磁盘空间暴涨副本迁移或日志保留时间过长确认reassign任务和retention配置8. 几点个人经验这一篇信息量不小最后分享几个我自己在工作里沉淀下来的习惯不算标准答案但确实帮我避过不少坑。第一不要追求“最大分区数”。我见过有人把单个topic设为几百甚至上千分区理由是并行度越高越快。结果一台broker抖动上千个分区同时做leader切换controller处理元数据变更都忙不过来集群异常恢复时间反而被拉长。分区数应该是“够用就好略有冗余”单topic控制在几十个以内是大多数场景的安全区真遇到容量问题优先加broker而不是无限加分区。第二副本因子和min.insync.replicas必须配套设置。只在创建topic时设replication.factor3没有设min.insync.replicas生产端又配acksallISR缩到只有leader一个的时候系统照样返回成功这个“高可用”其实是纸面高可用。我习惯把核心业务统一收敛到这样一组配置副本因子3min.insync.replicas2acksallunclean.leader.election.enablefalse日志类可以适当放宽。把这个写进配置模板比在代码里反复强调可靠更重要。第三分区数改动一定要提前演练。增加分区看起来是做加法但它会导致既有key的分区映射重组顺序保证被打乱消费者rebalance也要花时间。如果业务逻辑依赖同一个key的消息顺序生产环境随意调分区数等于给自己埋了一颗事故炸弹。要调之前先在测试集群跑一遍完整的消费链路验证再挑业务低峰期操作。分区和副本机制说到底是Kafka数据一致性和高可用的底座。你把ISR、HW、Leader Epoch、acks这几条主线理清楚之后很多线上问题就不再是“玄学”而是能顺着机制一步步推出来的结论。后面如果再聊生产调优和监控告警这几块内容就是最底层的地基。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。