Flink生产问题排障-作业重启异常

0 阅读2分钟

一、背景

Flink版本为1.14.6,采用Flink on native k8s模式部署,以Application方式提交运行作业;另外,有一个Flink作业调度管理平台,每次作业停止操作都会在调度管理平台调用Flink的stop-with-savepoint脚本。

二、问题现象

一个Flink作业重启后,运行快速失败

三、问题排查

  • 查看暂停日志
    • JM发起3次savepoint_suspend的cp均失败(failed to complete checkpoint)
    • Flink作业被强制停止(JM日志报cannot found deployment xxxx)
  • 查看启动日志
    • JM从sp恢复拉起作业,作业报错恢复失败(状态kakfa-offset数据过期)
  • 查看作业的cp/sp
    • cp状态丢失,sp仅有一个半年前的状态

四、问题分析

  • 现有调度平台Flink作业暂停逻辑分析
    • 1.使用flink stop-with-savepoint暂停作业(包含3次重试)
    • 2.检测作业状态,若未停止,则执行k8s的kubectl delete命令强制删除
  • Flink1.14.6原生停止脚本逻辑分析
    • 1.执行sp操作
    • 2.删除cp数据
    • 3.优雅停止作业
    • 过程中存在异步操作,同时没有事务管理,初步评估在执行sp失败且删除cp成功的场景下有丢失最近的cp/sp概率
  • CP失败常见原因
    • 1.资源不足:内存、磁盘、cpu/线程竞争
    • 2.背压:barrier无法及时传递,超时失败
    • 3.状态过大
    • 4.外部依赖故障:上下游组件异常阻塞
    • 5.配置不合理:cp太频繁、超时太短
    • 6.网络问题:网络长时间抖动延迟

五、问题结论

  • 原生Flink1.14.6停止脚本存在小概率丢状态风险

六、解决方案

  • 完善Flink作业暂停的处理逻辑,保障有最近可用的cp/sp
      1. 调用flink stop脚本前,先将最近成功的cp备份
      1. 判断作业停止状态增加JM-deployment与TM-pod状态检测
  • 加强Flink作业运行异常指标告警
      1. cp连续失败告警
      1. 作业重启次数告警
      1. 数据消费延迟告警

七、总结

我们在使用开源组件技术的过程中,系统功能设计上尽量将组件作为可用的工具,多考虑整体的健壮性与鲁棒性。