kafka的controlled shutdown请求

2023-10-08 20:20

本文主要是介绍kafka的controlled shutdown请求,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是我的第101篇原创文章

【背景】

kafka基于k8s容器化部署后,对容器设置了存活探针,即检测监听端口是否存在。然而一次kill kafka进程的操作,服务的重启时间(supervisor会自动再拉起kafka进程)超过了存活探针的监测时间,导致pod重启。本文就该问题展开进行分析。

【kill背后的逻辑】

对于以SIGTERM信号(不带参数的默认发送信号)进行的kill操作,kafka broker会捕获该信号,进行服务停止的相关处理动作,其中比较重要的两个动作为:

1)controlledShutdown

这一步的具体流程包括:

a. 待停止的broker节点向zk(2.8.0以前版本)获取controller节点的信息

b. 向controller建立连接并发送controlledShutdown请求,

c. controller收到请求后,对leader位于该broker上的分区进行必要的迁移动作,即分区副本数大于1,且有存活的其他broker节点中选出新的leader,然后发送请求通知被选中的broker成为新的分区leader;对待停止的broker上处于follower状态的分区以rpc请求形式告知停止进行fetch动作。

d. 最后controller给待停止的broker节点进行controlledShutdown请求响应。

之所以要这么做,是可以将分区不可服务的时间缩短为毫秒级别。否则,zk需要一段时间才能感知到该节点的离线,而controller的broker监听了对应znode目录的变化,因此感知broker的离线后才触发进行相应的处理动作,在controller未感知到其他节点离线的这段时间内,leader位于停止的broker节点上的分区是不可服务的,因此不可服务时间基本上就取决于kafka与zk之间连接的超时时长。

2)关闭所有打开的日志文件,并创建相关文件以标记文件是正常关闭。

关闭所有打开的文件,并在目录中写入".kafka_cleanshutdown"文件。在启动后,加载segment时,会判断是否存在".kafka_cleanshutdown"文件,从而决定是否需要进行日志的恢复动作(这里暂不展开)。

这种关闭服务的方式被称之为优雅的关闭服务,而不是kill -9强行结束。在官方文档中,也有相关的介绍。

cd0d894a74d553f5f6a9898fea2c4152.png

另外,"kafka-server-stop.sh"脚本本质上也是这么操作的。

SIGNAL=${SIGNAL:-TERM}
PIDS=$(ps ax | grep -i 'kafka\.Kafka' | grep java | grep -v grep | awk '{print $1}')if [ -z "$PIDS" ]; thenecho "No kafka server to stop"exit 1
elsekill -s $SIGNAL $PIDS
fi

正常情况下, controlledShutdown这个操作都是非常快的。但是由于该操作细化后的各个步骤都会涉及网络的交互,那么,在一些异常情况下,比如与zk的tcp连接异常、与controller的网络连接异常、controller触发的分区leader重新选举异常等,这都会导致controlledShutdown请求的重试,直到请求成功或者达到最大重试次数才结束,这时,controlledShutdown请求的整体耗时可能会超过30s,甚至更长。这也是我们业务中导致pod重启的原因。

[2023-04-10 14:18:03,597] INFO [KafkaServer id=1] shutting down (kafka.server.KafkaServer)
[2023-04-10 14:18:03,599] INFO [KafkaServer id=1] Starting controlled shutdown (kafka.server.KafkaServer)
[2023-04-10 14:18:11,010] WARN [KafkaServer id=1] Retrying controlled shutdown after the previous attempt failed... (kafka.server.KafkaServer)
[2023-04-10 14:18:16,049] WARN [KafkaServer id=1] Retrying controlled shutdown after the previous attempt failed... (kafka.server.KafkaServer)
[2023-04-10 14:18:21,081] WARN [KafkaServer id=1] Retrying controlled shutdown after the previous attempt failed... (kafka.server.KafkaServer)
[2023-04-10 14:18:21,084] WARN [KafkaServer id=1] Proceeding to do an unclean shutdown as all the controlled shutdown attempts failed (kafka.server.KafkaServer)
[2023-04-10 14:18:27,279] INFO [KafkaServer id=1] shut down completed (kafka.server.KafkaServer)

实际上,controlledShutdown这个请求操作是可选进行的(由配置参数进行控制)。也就是说,在关闭时可以控制不进行controlledShutdown请求。这样,可以一定程度上加速服务的重启,甚至可能在zk感知到broker节点离线前,就已经完成了重启流程。

涉及的相关配置包括:

// 与controller的socket超时时间, 默认为30000, 即30秒
controller.socket.timeout.ms
// controlled shutdown请求的最大重试次数, 默认3次
controlled.shutdown.max.retries
// controlled shutdown请求的重试间隔, 默认5000, 即5s
controlled.shutdown.retry.backoff.ms
// 是否启用 controlled shutdown, 默认为true
controlled.shutdown.enable

【总结】

本文通过一个重启耗时较长的问题,讲述了一个简单的知识点:kafka优雅关闭时的controlledShutdown请求操作。当然是否要禁用该请求,需要结合实际业务的可用性、zk连接超时时长等因素一并考虑。

另外,重启过程中的另外一个耗时操作,日志的加载与恢复,这里没有展开讲解,下篇文章我们再来聊聊该内容。

好了,这就是本文的全部内容,如果觉得本文对您有帮助,请点赞+转发,如果觉得有不正确的地方,也可以拍砖指点,最后,欢迎加我微信交流~

这篇关于kafka的controlled shutdown请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167752

相关文章

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.