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

相关文章

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.

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt