一次因为kafka分区的leader不为优先副本导致的消费堆积问题的原因排查及问题解决方法(代码片段)

worldchinalee worldchinalee     2022-12-02     133

关键词:

一次因为kafka分区的leader不为优先副本导致的消费堆积问题的原因排查及问题解决方法

问题描述

首先,收到了消息堆积的报警,查看监控发现延迟如下:

接下来用kafka客户端脚本工具,查看具体延迟信息:

发现延迟发生在2个partition(12,13)上,且消费者为同一台机器10.42.112.228

问题排查过程

消费端问题?

因为延迟partition的消费者在同一台机器,所以开始怀疑是否消费端存在问题?

 

因此,基本断定partition12、13所在的kafka服务端存在问题。

 

  1. 查看该消费端机器10.42.112.228的cpu、内存、磁盘等状态,未发现明显异常

  2. 重启该消费任务,发现2个延迟严重的partition被分配到了其他机器,且继续观察后发现,消费延迟在继续增大,进一步确认大概率非客户端问题(下图)

  3. 重新启动一个消费任务,从topic的最早消息开始消费,任务启动后,发现partition12、13的消费速度明显慢于其他分区(下图):

kafka服务端问题

 

查看kafka服务端日志未发现明显异常

查看partition12、13所在节点的机器监控,也未发现异常:

查看topic的状态:

直接使用上面的脚本,会把集群中所有topic的所有分区都执行一遍重新平衡,如果集群中需要重平衡的副本较多,则会对客户端带来一定的影响,所以一般生产环境中在使用脚本kafka-perferred-replica-election.sh 的时候会加参数path-to-json-file来指定一个json文件,以对部分分区进行leader重平衡。

我们只对topic video_features的分区12、13进行优先副本选举,需要编写一个json文件test1.json:

发现,partition13的优先副本是3(AR集合列表为Replicas: 3,2),但是实际leader为2,如此一来,节点2的负载变高,节点3的负载变低,原本均衡的负载就失衡了,可能会直接导致消费延迟。

解决方法

Kafka 中 kafka-perferred-replica-election.sh 脚本提供了对分区 leader 副本进行重平衡的功能。
优先副本的选举过程是一个安全的过程,Kafka 客户端可以自动感知分区 leader 副本的变更。

直接使用上面的脚本,会把集群中所有topic的所有分区都执行一遍重新平衡,如果集群中需要重平衡的副本较多,则会对客户端带来一定的影响,所以一般生产环境中在使用脚本kafka-perferred-replica-election.sh 的时候会加参数path-to-json-file来指定一个json文件,以对部分分区进行leader重平衡。

我们只对topic video_features的分区12、13进行优先副本选举,需要编写一个json文件test1.json:


    "partitions":[
        
            "partition":12,
            "topic":"video_features"
        ,
        
            "partition":13,
            "topic":"video_features"
        
    ]

执行脚本:

[tiangx@10-42-7-27 ~]$ /opt/kafka211/bin/kafka-preferred-replica-election.sh --zookeeper  10.19.23.215:2181 --path-to-json-file test1.json 
Created preferred replica election path with video_features-12,video_features-13
Successfully started preferred replica election for partitions Set(video_features-12, video_features-13)

重新查看topic状态,发现partition13的leader已经变为优先副本3了:

附:

几个常用kafka集群问题排查命令:

# realtime-wh

## 查看leader分区是否为优先分区
/opt/kafka211/bin/kafka-topics.sh --zookeeper 10.19.23.215:2181 --describe --topic applog_raw

## 修复leader分区不是优先分区
 /opt/kafka211/bin/kafka-preferred-replica-election.sh --zookeeper  10.19.23.215:2181 --path-to-json-file applog_e.json 
 
 其中:applog_e.json内容
 
    "partitions":[
        
            "partition":9,
            "topic":"applog_e"
        ,
        
            "partition":10,
            "topic":"applog_e"
        
    ]

文件位置:
10.42.7.27/data/tiangx/applog_e.json
10.42.7.27/data/tiangx/applog_raw.json

 

kafka的分区机制

参考技术AKafka在⼀定数量的服务器上对主题分区进⾏复制。当集群中的⼀个broker宕机后系统可以⾃动故障转移到其他可⽤的副本上,不会造成数据丢失。--replication-factor31leader+2followerFollower分区像普通的Kafka消... 查看详情

如何保证kafka生产者发送消息的可靠性

...结,生产者Producers按照主题topic把消息发给kafka集群的主分区,其他分区从主分区同步该消息。具体来看kafka的分布特性性:kafka消息的分区分布在Kafka集群的某些服务器上,每个分区都有一个服务器充当leader,有0个或多个充当foll... 查看详情

聊聊kafka:kafka如何保证一致性

...你就清晰了:高水位的作用:这里我们不讨论Kafka事务,因为事务机制会影响消费者所能看到的消息的范围,它不只是简单依赖高水位来判断。它依靠一个名为LSO(LogStableOffset)的位移值来判断事务型消费者的可见性。日志末端... 查看详情

kafka之副本信息leader选举流程故障处理细节分区副本分配手动调整分区副本存储leaderpartition负载平衡增加副本文件存储机制文件清理策略高效读写数据(代码片段)

...    然后Follower找Leader进行同步数据。(4)Kafka分区中的所有副本统称为AR(AssignedRepllicas)。     AR=ISR+OSRISR,表示和Leader保持同步的Follower集合。如果Follower长时间未向Leader发送通信请求或同步数据&... 查看详情

kafka动态增加topic的副本(代码片段)

一需求描述一个分区可以有多个副本,这些副本保存在不同的broker上,可实现kafka高可用。每个分区的副本中都会有一个作为Leader。当一个broker失败时,Leader在这台broker上的分区都会变得不可用,kafka会自动移除Lea... 查看详情

kafka动态增加topic的副本(代码片段)

一需求描述一个分区可以有多个副本,这些副本保存在不同的broker上,可实现kafka高可用。每个分区的副本中都会有一个作为Leader。当一个broker失败时,Leader在这台broker上的分区都会变得不可用,kafka会自动移除Lea... 查看详情

kafka分区分布

参考技术A查看topic的分区情况bin/kafka-topics.sh--zookeeper192.168.1.6:2181--describe--topictestpartiton:partionid,由于此处只有一个partition,因此partitionid为0leader:负责处理消息的读和写,当前负责读写的leadbrokerid,leader是从所有节点中随机选... 查看详情

kafka容错及高可用原理|运维进阶

Kakfa中topic的基本组成在kafka中以分区作为复制单元。每个topic由一个或多个分区组成,每个分区都包含一个leader副本及0个或多个follower副本。当你在创建topic时,需要指定分区数及复制因子。通常情况下一个复制因子是3的... 查看详情

kafka中副本机制的设计和原理(代码片段)

...》中已经对副本进行了介绍。我们先回顾下,Kafka中一个分区可以拥有多个副本,副本可分布于多台机器上。而在多个副本中,只会有一个Leader副本与客户端交互,也就是读写数据。其他则作为Follower副本,负责同步Leader的数据... 查看详情

服务端技术实战系列——kafka篇

...e):消息是kafka通信的基本单位。[if!supportLists]3. [endif]分区(partition):一组消息对应一个主题,一个主题对应一个或多个分区。每个分区为一系列有序消息组成的有序队列;每个分区在物理上对应一个文件夹。[if!supportLists]4.... 查看详情

kafka容错及高可用原理|运维进阶

Kakfa中topic的基本组成在kafka中以分区作为复制单元。每个topic由一个或多个分区组成,每个分区都包含一个leader副本及0个或多个follower副本。当你在创建topic时,需要指定分区数及复制因子。通常情况下一个复制因子是3的... 查看详情

kafka容错及高可用原理|运维进阶

Kakfa中topic的基本组成在kafka中以分区作为复制单元。每个topic由一个或多个分区组成,每个分区都包含一个leader副本及0个或多个follower副本。当你在创建topic时,需要指定分区数及复制因子。通常情况下一个复制因子是3的... 查看详情

kafka中arisrosr以及hwleo的区别

kafka中AR、ISR、OSR以及HW、LEO的关系Kafka为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力。同一分区的不同副本中保存的是相同的消息(在同一时刻,副本之间并非完全一样)副本之... 查看详情

kafka副本机制之数据可靠性

...,增加副本机制后,每个副本可以有多个副本,针对每个分区,都会从副本集(AssignedReplica,AR)中,选取一个副本作为Leader副本,所有读写请求都由Leader副本处理,其余的副本被称为Follwer副本,其会从Leader副本拉取消息更新到... 查看详情

kafka副本的概念(代码片段)

副本的概念在创建主题时,除了指明了主题的分区数以外,还指明了副本数,那么副本是⼀个什么概念呢?副本是对分区的备份。在集群中,不同的副本会被部署在不同的broker上。下⾯例⼦:创建1个主题&#... 查看详情

kafka常见面试题

...  冗余  健壮性  异步通信2、kafka的分区与消费者关系分区(partition)kafka中的topic可以细分为不同的partition,一个topic可以将消息存放在不同的partion中。leader和follower每个partition可以设置一个leader和多个follow... 查看详情

kafka和rabbitmq比较之基础知识部分

...息。7.发送的消息又有几个重要概念,Topic主题,Partition分区。8.Topic主题,一个逻辑概念,每条消息必须有且只有一个主题。9.Partition分区:在同一个主题下,可以设置一个或者多个分区,来增加消息处理的并发度。另外注意一... 查看详情

kafka参数关于副本的一次线上调优

线上kafka出现频繁的分区leader重新选举,spark程序中加的重试参数好像又没生效,导致流程异常,后来进行一些参数调优之后恢复正常。()内为默认值zookeeper.session.timeout.ms=30s(6s)replica.fetch.max.bytes=5M(1M)replica.lag.time... 查看详情