kafka服务端之分区管理

文章目录

概述

本篇主要介绍与分区相关的知识和操作,包括优先副本的选举、分区重分配、复制限流、修改副本因子等内容。

优先副本选举

分区使用多副本机制来提升可靠性,但只有leader副本对外提供读写服务,而follower副本只负责在内部进行消息的同步。如果一个分区的leader副本不可用,那么就意味着整个分区变得不可用,此时就需要Kafka从剩余的follower副本中挑选一个新的leader副本来继续对外提供服务 。虽然不够严谨,但从某种程度上说,brokerr节点中leader副本个数的多少决定了这个节点负载的高低

在创建主题的时候,该主题的分区及副本会尽可能均匀地分布到Kafka集群的各个broker节点上,对应的leader副本的分配也比较均匀。针对同一个分区而言,同一个broker节点中不可能出现它的多个副本,即Kafka集群的一个broker中最多只能有它的一个副本,我们可以将leader副本所在的broker节点叫作分区的leader节点,而follower副本所在的broker节点叫作分区的follower节点。

为何要有优先副本

随着时间的更替,Kafka集群的broker节点不可避免地会遇到岩机或崩溃的问题,当分区的leader节点发生故障时,其中一个follower节点就会成为新的leader节点,这样就会导致集群的负载不均衡,从而影响整体的健壮性和稳定性。当原来的leader节点恢复之后重新加入集群时,它只能成为一个新的follower节点而不再对外提供服务。

为了能够有效地治理负载失衡的情况,Kafka引入了优先副本(preferredreplica)的概念。所谓的优先副本是指在AR集合列表中的第一个副本。比如主题topic-partitions 中分区的AR集合列表(Replicas)为[1,2,0],那么分区0的优先副本即为1。理想情况下,优先副本就是该分区的leader副本,所以也可以称之为preferredleader。Kafka要确保所有主题的优先副本在Kafka集群中均匀分布,这样就保证了所有分区的leader均衡分布。如果leader分布过于集中,就会造成集群负载不均衡。

所谓的优先副本的选举是指通过一定的方式促使优先副本选举为leader副本,以此来促进集群的负载均衡,这一行为也可以称为"分区平衡"

需要注意的是,分区平衡并不意味着Kafka集群的负载均衡,因为还要考虑集群中的分区分配是否均衡。更进一步,每个分区的leader副本的负载也是各不相同的,有些leader副本的负载很高,比如需要承载TPS为30000的负荷,而有些leader副本只需承载个位数的负荷。也就是说,就算集群中的分区分配均衡、leader分配均衡,也并不能确保整个集群的负载就是均衡的,还需要其他一些硬性的指标来做进一步的衡量。

Kafka中可以提供分区自动平衡的功能 ,与此对应的broker端参数是auto.leader.rebalance.enable,此参数的默认值为true,即默认情况下此功能是开启的。如果开启分区自动平衡的功能,则Kafka的控制器会启动一个定时任务,这个定时任务会轮询所有的broker节点,计算每个broker节点的分区不平衡率(broker中的不平衡率=非优先副本的leader个数/分区总数)是否超过leader.imbalance.per.broker.percentage参数配置的比值,默认值为10%,如果超过设定的比值则会自动执行优先副本的选举动作以求分区平衡。执行周期由参数leader.imbalance.check.interval.seconds控制,默认值为300秒,即5分钟。

优先副本选举弊端

不过在生产环境中不建议将auto.leader.rebalance.enable设置为默认的true,因为这可能引起负面的性能问题,也有可能引起客户端一定时间的阻塞。因为执行的时间无法自主掌控,如果在关键时期(比如电商大促波峰期)执行关键任务的关卡上执行优先副本的自动选举操作,势必会有业务阻塞、频繁超时之类的风险。前面也分析过,分区及副本的均衡也不能完全确保集群整体的均衡,并且集群中一定程度上的不均衡也是可以忍受的,为防止出现关健时期"掉链子"的行为,笔者建议还是将掌控权把控在自己的手中,可以针对此类相关的埋点指标设置相应的告警,在合适的时机执行合适的操作,而这个"合适的操作"就是指手动执行分区平衡。

如何开启优先副本选举

Kafka中kafka-perferred-replica-election.sh脚本提供了对分区leader副本进行重新平衡的功能,该命令一旦执行会对kafka集群内的所有主题分区进行优先副本选举。优先副本的选举过程是一个安全的过程,Kafka客户端可以自动感知分区leader副本的变更。

leader副本的转移也是一项高成本的工作,如果要执行的分区数很多,那么必然会对客户端造成一定的影响。如果集群中包含大量的分区,那么上面的这种使用方式有可能会失效。在优先副本的选举过程中,具体的元数据信息会被存入ZooKeeper的/admin/preferred_replica_election节点,如果这些数据超过了ZooKeeper节点所允许的大小,那么选举就会失败。默认情况下ZooKeeper所允许的节点数据大小为1MB。

如何开启部分优先副本选举

kafka-perferred-replica-election.sh脚本中还提供了path-to-json-file参数来小批量地对部分分区执行优先副本的选举操作。通过path-to-json-file参数来指定一个JSON文件,这个JSON文件里保存需要执行优先副本选举的分区清单。

如何正确使用优先副本选举

在实际生产环境中,一般使用path-to-json-file参数来分批、手动地执行优先副本的选举操作。尤其是在应对大规模的Kafka集群时,理应杜绝采用非path-to-json-file参数的选举操作方式。同时,优先副本的选举操作也要注意避开业务高峰期,以免带来性能方面的负面影响。

分区重分配

为何需要分区重分配

当集群中的一个节点突然岩机下线时,如果节点上的分区是单副本的,那么这些分区就变得不可用了,在节点恢复前,相应的数据也就处于丢失状态;如果节点上的分区是多副本的,那么位于这个节点上的leader副本的角色会转交到集群的其他follower副本中。总而言之,这个节点上的分区副本都已经处于功能失效的状态,Kafka并不会将这些失效的分区副本自动地迁移到集群中剩余的可用broker节点上,如果放任不管,则不仅会影响整个集群的均衡负载,还会影响整体服务的可用性和可靠性。

当要对集群中的一个节点进行有计划的下线操作时,为了保证分区及副本的合理分配,我们也希望通过某种方式能够将该节点上的分区副本迁移到其他的可用节点上。

当集群中新增broker节点时,只有新创建的主题分区才有可能被分配到这个节点上,而之前的主题分区并不会自动分配到新加入的节点中,因为在它们被创建时还没有这个新节点,这样新节点的负载和原先节点的负载之间严重不均衡。

为了解决上述问题,需要让分区副本再次进行合理的分配,也就是所谓的分区重分配Kafka提供了kafka-reassign-partitions.sh 月脚本来执行分区分配的工作,它可以在集群扩容、broker节点失效的场景下对分区进行迁移。

kafka-reassign-partitions.sh脚本的使用分为3个步骤:首先创建需要一个包含主题清单的JSON文件,其次根据主题清单和broker节点清单生成一份重分配方案,最后根据这份方案执行具体的重分配动作。

分区重分配工作原理

分区重分配的基本原理是先通过控制器为每个分区添加新副本(增加副本因子),新的副本将从分区的leader副本那里复制所有的数据。根据分区的大小不同,复制过程可能需要花一些时间,因为数据是通过网络复制到新副本上的。在复制完成之后,控制器将旧副本从副本清单里移除(恢复为原先的副本因子数)。注意在重分配的过程中要确保有足够的空间。

分区重分配弊端及其如何正确使用

分区重分配对集群的性能有很大的影响,需要占用额外的资源,比如网络和磁盘。在实际操作中,我们将降低重分配的粒度,分成多个小批次来执行,以此来将负面的影响降到最低,这一点和优先副本的选举有异曲同工之妙

还需要注意的是,如果要将某个broker下线,那么在执行分区重分配动作之前最好先关闭或重启broker。这样这个broker就不再是任何分区的leader节点了,它的分区就可以被分配给集群中的其他broker。这样可以减少broker间的流量复制,以此提升重分配的性能,以及减少对集群的影响。

复制限流

为何需要复制限流

分区重分配本质在于数据复制,先增加新的副本,然后进行数据同步,最后删除旧的副本来达到最终的目的。数据复制会占用额外的资源,如果重分配的量太大

必然会严重影响整体的性能,无其是处于业务高峰期的时候。减小重分配的粒度,以小批次的方式来操作是一种可行的解决思路。如果集群中某个主题或某个分区的流量在某段时间内特别大,那么只靠减小粒度是不足以应对的,这时就需要有一个限流的机制,可以对副本间的复制流量加以限制来保证重分配期间整体服务不会受太大的影响。

如何进行复制限流

副本间的复制限流有两种实现方式:kafka-config.sh脚本和kafka-reassign-partitions.sh脚本。

kafka-config.sh脚本主要以动态配置的方式来达到限流的目的,在broker级另两个与复制限流相关的配置参数:follower.replication.throttled.rate和leader.replication.chrottled.rate,前者用于设置follower副本复制的速度,后者用于设置leader副本传输的速度,它们的单位都是B/s。通常情况下,两者的配置值是相同的。

kafa-reassign-paritions.sh脚本本身也提供了限流的功能,只需一个throttle参数即可,使用这种方式的限流同样需要显式地执行某些操作以使在重分配完成之后可以删除限流的设置。

修改副本因子

为何需要修改副本因子

创建主题之后我们还可以修改分区的个数, 同样可以修改副本因子(副本数)。 修改副本因子的使用场景也很多, 比如在创建主题时填写了错误的副本因子数而需要修改, 再比如运行一段时间之后想要通过增加副本因子数来提高容错性和可靠性。

如何修改副本因子

修改副本因子的功能也是通过重分配所使用的kafka-reassign-parition.sh 脚本实现。

与修改分区数不同的是, 副本数还可以减少, 这个其实很好理解, 最直接的方式是关闭 一些broker, 不过这种手法不太正规。 这里我们同样可以通过kata-reassign-partition.sh脚本来减少分区 的副本因子。

相关推荐
Tong_Hao6 小时前
优惠券平台(十五):实现兑换/秒杀优惠券功能(2)
java·数据库·分布式·缓存
kikyo哎哟喂7 小时前
ZooKeeper相关知识点
linux·分布式·zookeeper
m0_7482468716 小时前
分布式推理框架 xDit
分布式
斯普信专业组16 小时前
RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)
分布式·rabbitmq
斯普信专业组16 小时前
RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)
分布式·rabbitmq
java1234_小锋16 小时前
Zookeeper是如何解决脑裂问题的?
分布式·zookeeper·云原生
斯普信专业组17 小时前
RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)
分布式·rabbitmq
大饼酥21 小时前
保姆级教程Docker部署KRaft模式的Kafka官方镜像
docker·容器·kafka
爱学习的白杨树21 小时前
什么是Kafka?
分布式·kafka