k8s之kafka集群重启耗时太长问题
背景:k8s集群中的kafka集群运行一段时间后,数据文件过多的情况下,重启会非常困难,经常需要花费数个小时来加载log文件,这是我们不能够接受的事情。
下面通过对kafka源码的分析,快照文件的工作原理,k8s的宽限时间机制来详细说明并从根源上解决这个问题
日志加载源码调用链
1.kafka启动以后会调用LogManager来做日志文件的加载
2.LogManager的类中调用了loadLogs方法
3.loadLogs方法中会以文件夹为单位(topic分区)循环遍历,调用loadLog方法
4.loadLog方法中调用loadSegments方法加载每个topic分区的日志段
5.日志加载的执行工作是由loadSegments方法中的completeSwapOperations来执行的
全部日志加载与恢复:loadLogs
所有日志的加载与恢复的流程主要包含以下几步:
- 加载并记录日志文件夹中标志状态信息的文件(kafka_cleanshutdown、recovery-point-offset-checkpoint、recovery-point-offset-checkpoint)
- 并发对每个 tp 的日志进行加载与恢复(下一小节详解)
记录并异步处理有问题的日志文件夹
|
单 tp 日志加载与恢复
单个 tp 的日志加载与恢复是在 Log 类的静态代码块中进行的。如果该 tp 的文件夹的后缀为-delete,则认为该 tp 为待删除的,加入到 logsToBeDeleted 集合中等待定时任务对其进行清理。
Log 类的静态代码块中通过 loadSegments 加载日志
|
recoverLog 的核心代码如下:
|
completeSwapOperations核心代码:
|
recoverSegment代码段:
|
rebuildProducerState代码:
|
.snapshot文件工作原理
snapshot文件内容:记载着生产者最新的offset
1.每次日志翻滚时都会生成一个snapshot文件
2.使用kafka-server-stop.sh关闭时,会生成一个snapshot文件,是kafka重新启动时,快速加载的重要保证
3.重新启动时,kafka只会保留最近的3个snapshot文件。
k8s宽限时间概念
什么是 terminationGracePeriodSeconds?
解释这个参数之前,先来回忆一下K8S滚动升级的步骤:
1.K8S首先启动新的POD
2.K8S等待新的POD进入Ready状态
3.K8S创建Endpoint,将新的POD纳入负载均衡
4.K8S移除与老POD相关的Endpoint,并且将老POD状态设置为Terminating,此时将不会有新的请求到达老POD
5.同时 K8S 会给老POD发送SIGTERM信号,并且等待 terminationGracePeriodSeconds 这么长的时间。(默认为30秒)
6.超过terminationGracePeriodSeconds等待时间后, K8S 会强制结束老POD
看到这里,我想大家应该明白了,terminationGracePeriodSeconds 就是K8S给你程序留的最后的缓冲时间,来处理关闭之前的操作。
总结:宽限时间(terminationGracePeriodSeconds )可以定义优雅关闭的宽限期,即在收到停止请求后,
有多少时间来进行资源释放或者做其它操作,如果到了最大时间还没有停止,会被强制结束。
示例:
|
如何完美解决k8s中kafka重启日志加载慢的问题
通过对上面三块内容的了解,kafka重启日志加载慢问题的根本原因已经展现出来了。那就是如果kafka没有能在默认宽限时间内生成snapshot文件,启动时就会挨个加载所有的日志段(segment),这是我们不能够接受的事情。那么我们如何设置宽限时间terminationGracePeriodSeconds的大小呢?
K8S 会给老POD发送SIGTERM信号,并且等待 terminationGracePeriodSeconds 这么长的时间(默认为30秒)。也就是说如果kafka程序在宽限时间以内结束了,还没有达到30秒的时候,kafka退出了,pod也是能够自动退出的。terminationGracePeriodSeconds 只是保证pod强制退出,减少僵尸pod的保障,那么我们只要将terminationGracePeriodSeconds 设置成为我们能够接受的最大值即可
k8s之kafka集群重启耗时太长问题相关推荐
- k8s部署kafka集群
前言 环境:centos 7.9 k8s集群.zookeeper集群 本篇将在k8s中部署kafka集群,kafka依赖zookeeper集群,zookeeper集群我们已经搭建好了,可以参考http ...
- kafka集群重启后启动报错ERROR Error while creating ephemeral at /brokers/ids/3,, node already exists and owner
ERROR Error while creating ephemeral at /brokers/ids/3,, node already exists and owner '193744291469 ...
- k8s 中部署kafka集群
由于开发过程中使用到了kafka,又不想自己部署kafka,索性采用k8s 部署kafka集群,以求做到随时插拔. 创建命名空间 apiVersion: v1 kind: Namespace meta ...
- k8s kafka集群 连接不上_图解 K8s 核心概念和术语
我第一次接触容器编排调度工具是 Docker 自家的 Docker Swarm,主要解决当时公司内部业务项目部署繁琐的问题,我记得当时项目实现容器化之后,花在项目部署运维的时间大大减少了,当时觉得这玩 ...
- 备份k8s_树莓派k8s集群安装kafka集群及监控
安装准备 树莓派k8s集群 root@pi4-master01:~# kubectl get nodes -o wideNAME STATUS ROLES AGE VERSION INTERNAL-I ...
- k8s部署zookeeper,kafka集群(李作强)
采用网上镜像:mirrorgooglecontainers/kubernetes-zookeeper:1.0-3.4.10 准备共享存储:nfs,glusterfs,seaweed或其他,并在node ...
- Kafka系列之:不重启kafka集群设置kafka topic数据保留时间
Kafka系列之:不重启kafka集群设置kafka topic数据保留时间 一.kafka topic数据保留3天的bash命令 二.查看kafka删除数据日志 三.批量设置上千个topic保留3天 ...
- 白话Elasticsearch66-针对集群重启时的shard恢复耗时过长问题定制的重要参数
文章目录 概述 集群重启时的无意义shard重分配问题 shard recovery配置 概述 继续跟中华石杉老师学习ES,第66篇 课程地址: https://www.roncoo.com/view ...
- 【K8S】 基于Kubernetes部署Kafka集群
主要参考了https://stackoverflow.com/questions/44651219/kafka-deployment-on-minikube和https://github.com/ra ...
最新文章
- js query复习
- 计算机视觉未来走向:视频理解等5大趋势详解
- 小程序 获取用户信息
- java contions_Java数据结构与算法
- iOS H264,H265视频编码(Video encode)
- Python--第4次平时作业
- (16)Verilog模块例化-基本语法(四)(第4天)
- Python包管理工具小结
- 动视暴雪消费产品集团首次亮相2018年中国授权展
- 51单片机复习:红外通信
- 数据结构——什么是数据结构?
- 【Hive】如何在 Hive 中创建外部表映射 Hbase 中已存在的表
- 教你快速爬取哔哩哔哩整部番剧的视频弹幕
- 完美解决:STM32CubeMX生成MDK项目报错
- 计算机辅助电路小结,电子电路计算机辅助设计实训报告.doc
- 算法设计与分析——算法学基础(三):渐进记号
- 国产CPU产业链的逻辑架构
- 移民去欧洲,选哪个国家好呢?
- LCL 滤波器的特性分析
- 自适应均衡matlab仿真,对比RLS,LMS以及NLMS的均衡前后星座图效果,调制采用4QAM,16QAM,64QAM
热门文章
- WordPress主题CorePress
- SAP MB5B报表ALV显示
- Matlab中使用psychtoolbox编写刺激界面
- 发布“智能化、平台化、全程电子化”的新OA系统——e-cology9.0
- Android加密之全盘加密(FDE)
- 使用jasypt加密配置的时候,报错:DecryptionException: Unable to decrypt
- 厦门大学计算机考研经验分享,【图片】一战厦大计算机上岸,经验帖。慢更【考研吧】_百度贴吧...
- 前端性能自动化执行机服务开发
- Vue中components几个组件
- 利用Cadence软件中的Model Editor工具和元器件的模型文本文件创建Spice模型