k8s+Flink断点续传(MySQL同步Starrocks)

flink3.4版本

K8S跑flink优势(基础设施级容错,避免 Pod / 节点故障)
复制代码
Pod 故障自动重启
1 K8s 通过 Pod 的重启策略(默认 Always,对应 Flink Deployment 的重启策略),实现 Pod 故障后的自动恢复:
当 Flink TaskManager/JobManager Pod 因内存溢出、进程崩溃、容器异常等原因退出时,K8s 会自动重启该 Pod;
2 结合 Flink 的 Checkpoint 机制,重启后的 Pod 会快速恢复作业状态,不影响数据同步的连续性;
3 你配置中的 podTemplate 无需额外修改,K8s 原生支持该能力

 节点故障自动调度
 
 当 K8s 集群中的某个节点(Node)宕机(如硬件故障、网络中断),该节点上的 Flink Pod 会被标记为异常:
1 K8s 调度器会自动将这些 Flink Pod 重新调度到集群中的其他健康节点上;
2 新调度的 Pod 会通过 S3 中的 Checkpoint 快照和 HA 元数据,恢复作业状态,实现跨节点的故障转移;
3 该能力无需额外配置,由 K8s 原生提供,仅需保证集群中有足够的空闲节点资源。

存储持久化解耦(避免本地存储丢失)

Flink CDC 作业的关键数据(Checkpoint 快照、HA 元数据、Savepoint 快照)均配置为持久化到 S3 兼容存储(RustFS),而非 Pod 本地存储:
1 本地存储(emptyDir)会随 Pod 删除而丢失,而 S3 存储是独立于 K8s 集群的持久化存储,不受 Pod / 节点故障影响;
2 这是实现作业跨 Pod、跨节点恢复的前提,对应你配置中的 state.checkpoints.dir、state.savepoints.dir、high-availability.storageDir 均指向 S3 路径。
启动你的集群
复制代码
./bin/kubernetes-session.sh \
  -Dkubernetes.cluster-id=jbk-first-flink-cluster \
  -Dkubernetes.service-account=flink-cdc \
  -Dtaskmanager.numberOfTaskSlots=4 \
  -Dkubernetes.operator.enabled=true \
  -Dkubernetes.namespace=flink
重新构建加入几个核心包放入镜像里
复制代码
flink-cdc-pipeline-connector-mysql-3.4.0.jar
flink-cdc-pipeline-connector-starrocks-3.4.0.jar
mysql-connector-java-8.0.27.jar
flink-s3-fs-hadoop-1.20.0.jar
flink-s3-fs-presto-1.20.0.jar

# ll lib/
total 400972
drwxr-xr-x 1 flink flink          43 Dec 26 02:13 ./
drwxr-xr-x 1 flink flink          67 Dec 26 02:35 ../
-rw-r--r-- 1   502 dialout  36811008 Apr 29  2025 flink-cdc-dist-3.4.0.jar
-rw-r--r-- 1 root  root     21368068 Nov 30 09:02 flink-cdc-pipeline-connector-mysql-3.4.0.jar
-rw-r--r-- 1 root  root     13026309 Nov 30 09:02 flink-cdc-pipeline-connector-starrocks-3.4.0.jar
-rw-r--r-- 1 flink flink      198366 Jan 28  2025 flink-cep-1.20.1.jar
-rw-r--r-- 1 flink flink      563658 Jan 28  2025 flink-connector-files-1.20.1.jar
-rw-r--r-- 1 flink flink      102375 Jan 28  2025 flink-csv-1.20.1.jar
-rw-r--r-- 1 flink flink   125887715 Jan 29  2025 flink-dist-1.20.1.jar
-rw-r--r-- 1 flink flink      203636 Jan 28  2025 flink-json-1.20.1.jar
-rw-r--r-- 1 root  root     31588060 Jul 25  2024 flink-s3-fs-hadoop-1.20.0.jar
-rw-r--r-- 1 root  root     97259776 Jul 25  2024 flink-s3-fs-presto-1.20.0.jar
-rw-r--r-- 1 flink flink    21060644 Jan 29  2025 flink-scala_2.12-1.20.1.jar
-rw-r--r-- 1 flink flink    15714468 Jan 29  2025 flink-table-api-java-uber-1.20.1.jar
-rw-r--r-- 1 flink flink    38425605 Jan 29  2025 flink-table-planner-loader-1.20.1.jar
-rw-r--r-- 1 flink flink     3548905 Jan 28  2025 flink-table-runtime-1.20.1.jar
-rw-r--r-- 1 flink flink      208006 Jan 18  2023 log4j-1.2-api-2.17.1.jar
-rw-r--r-- 1 flink flink      301872 Jan 18  2023 log4j-api-2.17.1.jar
-rw-r--r-- 1 flink flink     1790452 Jan 18  2023 log4j-core-2.17.1.jar
-rw-r--r-- 1 flink flink       24279 Jan 18  2023 log4j-slf4j-impl-2.17.1.jar
-rw-r--r-- 1 root  root      2475087 Nov 30 09:02 mysql-connector-java-8.0.27.jar
构建
复制代码
#https://repo1.maven.org/maven2/org/apache/flink/flink-s3-fs-presto/1.20.0/
# cat Dockerfile 
FROM jpccr.ccs.tencentyun.com/test02/cdc:3.4

COPY  flink-s3-fs-hadoop-1.20.0.jar /opt/flink/lib/flink-s3-fs-hadoop-1.20.0.jar
COPY flink-s3-fs-presto-1.20.0.jar /opt/flink/lib/flink-s3-fs-presto-1.20.0.jar
公网镜像带有S3包
复制代码
#公网镜像
jpccr.ccs.tencentyun.com/test02/cdc:ss3-3.40

yaml模版

js 复制代码
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  name: flink-cdc-pipeline-job
spec:
  flinkConfiguration:
    execution.checkpointing.interval: 600000
    execution.checkpointing.mode: EXACTLY_ONCE
    execution.checkpointing.timeout: 600000
    execution.checkpointing.tolerable-failed-checkpoints: 100
    state.backend: rocksdb
    state.backend.incremental: true
    state.checkpoints.dir: s3://jbl/checkpoints/
    s3.ssl.enabled: "false"
    s3.access-key: rustfsadmin
    s3.secret-key: rustfsadmin
    s3.endpoint: http://rustfs-service:9000
    s3.path.style.access: true 
    classloader.resolve-order: parent-first
    state.checkpoints.dir: 's3://jbl2/checkpoints/'
    state.savepoints.dir: 's3://jbl3/savepoints/'
    high-availability: org.apache.flink.kubernetes.highavailability.KubernetesHaServicesFactory
    high-availability.storageDir: s3://jbl4/flink-ha/
  flinkVersion: v1_20
  #image: 'jpccr.ccs.tencentyun.com/test02/cdc:3.4'
  image: 'jpccr.ccs.tencentyun.com/test02/cdc:ss3-3.40'
  imagePullPolicy: Always
  job:
    args:
      - '--use-mini-cluster'
      - /opt/flink/flink-cdc-3.4.0/conf/mysql-to-starrocks.yaml
    entryClass: org.apache.flink.cdc.cli.CliFrontend
    jarURI: 'local:///opt/flink/lib/flink-cdc-dist-3.4.0.jar'
    parallelism: 1
    state: running
    upgradeMode: savepoint
  jobManager:
    replicas: 1
    resource:
      cpu: 1
      memory: 2024m
  podTemplate:
    apiVersion: v1
    kind: Pod
    spec:
      containers:
        - name: flink-main-container
          volumeMounts:
            - mountPath: /opt/flink/flink-cdc-3.4.0/conf
              name: flink-cdc-pipeline-config
      volumes:
        - configMap:
            name: flink-cdc-pipeline-configmap
          name: flink-cdc-pipeline-config
  restartNonce: 0
  serviceAccount: flink-cdc
  taskManager:
    resource:
      cpu: 2
      memory: 2024m
参数说明
js 复制代码
    "execution.checkpointing.interval": "600000", // 每10分钟触发一次检查点
     "execution.checkpointing.mode": "EXACTLY_ONCE", // 检查点模式为精确一次
     "execution.checkpointing.timeout": "600000", // 检查点超时时间为10分钟
     "execution.checkpointing.tolerable-failed-checkpoints": "100", // 允许100次检查点失败
     "state.backend": "rocksdb", // 使用RocksDB作为状态后端
     "state.backend.incremental": "true", // 启用增量检查点
     "state.checkpoints.dir": "s3://jbl/checkpoints/", // 检查点存储路径
     "s3.ssl.enabled": "false", // 禁用S3 SSL
     "s3.access-key": "rustfsadmin", // S3访问密钥
     "s3.secret-key": "rustfsadmin", // S3秘密密钥
     "s3.endpoint": "http://rustfs-service:9000", // S3端点
     "s3.path.style.access": "true", // 使用路径样式访问
     "classloader.resolve-order": "parent-first", // 类加载器解析顺序为父优先
     "state.checkpoints.dir": "s3://jbl2/checkpoints/", // 重复的检查点存储路径
     "state.savepoints.dir": "s3://jbl3/savepoints/", // 保存点存储路径
     "high-availability": "org.apache.flink.kubernetes.highavailability.KubernetesHaServicesFactory", // 高可用性服务工厂
     "high-availability.storageDir": "s3://jbl4/flink-ha/" // 高可用性存储路径
js 复制代码
全量快照(首次启动)
作业启动后,CDC 连接器会先连接 MySQL 数据库,执行一次全量数据扫描,把 MySQL 中指定表的现有数据全部读取出来,同步到 StarRocks。
这一步是为了保证 "存量数据不丢失",相当于同步的 "起点"。

增量日志同步(持续运行)
全量快照完成后,CDC 连接器会切换到 binlog 监听模式:实时读取 MySQL 的 binlog 日志(记录了数据库的增删改操作)。
连接器会解析 binlog 中的操作事件(比如 insert/update/delete),转换成 Flink 能处理的数据流。
Flink 把这些增量数据事件,通过内置的算子(比如数据清洗、转换),最终写入 StarRocks 对应的表中。

并行度与数据分发
你的配置中 parallelism: 1 表示只有 1 个并行任务处理数据。如果改成 parallelism: 4,Flink 会把 MySQL 表的数据按分片规则(比如主键范围)分给 4 个任务并行处理,大幅提升同步速度。
容错保障原理(核心是 Checkpoint + HA)
js 复制代码
 Checkpoint 快照:保证 "精确一次" 语义
execution.checkpointing.mode: EXACTLY_ONCE 是 CDC 作业的核心保障,它的工作流程是:

1 定期生成快照:按照 execution.checkpointing.interval: 600000(10 分钟)的间隔,JobManager 会触发一次 Checkpoint。
2  增量状态存储:因为配置了 state.backend: rocksdb 和 state.backend.incremental: true,TaskManager 不会全量保存状态,而是只保存与上一次 Checkpoint 的差异数据(比如新增的 binlog 位点、未写入 StarRocks 的数据)。
3 持久化到 S3:生成的 Checkpoint 快照会被上传到 state.checkpoints.dir 指定的 S3 桶(jbl2/checkpoints/),而不是存在本地磁盘。
4 故障恢复:如果 TaskManager 或 JobManager 挂了,Flink 重启后会从 S3 中拉取最新的 Checkpoint 快照,恢复到故障前的状态,从快照的 "位点" 继续同步 binlog,保证数据只处理一次,不会重复或丢失。
高可用(HA):保证集群不宕机
js 复制代码
high-availability 配置是为了应对 JobManager 单点故障,原理是:

1 HA 元数据存储:JobManager 的集群状态、选举信息会被持久化到 high-availability.storageDir 指定的 S3 桶(jbl4/flink-ha/)。
2 自动故障转移:如果当前的 JobManager 挂了,Flink Operator 会基于 S3 中存储的 HA 元数据,快速启动一个新的 JobManager 节点,并自动接管集群的调度工作,整个过程对 CDC 作业是透明的,不需要人工干预
3 当你需要升级 CDC 版本或修改配置时,Flink 会先触发一次 Savepoint(手动 Checkpoint),保存当前状态,升级后基于 Savepoint 重启,避免全量重新同步

验证


复制代码
进入桶内的 checkpoints 目录,会看到以「作业 ID」命名的子目录(作业 ID 可从 Flink Web UI 中获取)

1该目录下存在 _metadata 文件(Checkpoint 元数据文件,核心标识)和 data 文件夹(状态数据文件);

2 随着时间推移,会生成新的 Checkpoint 子目录(按 Checkpoint ID 递增),说明快照正在持续持久化到 RustFS,即使 Pod 故障,快照也不会丢失。

3 若目录为空或无 _metadata 文件,说明 Checkpoint 未成功上传,需排查 S3 连接配置(如密钥、端点是否正确)。
相关推荐
VermiliEiz2 小时前
二进制文件方式部署k8s(3)
云原生·容器·kubernetes·containerd
企鹅侠客13 小时前
使用k8s集群调度GPU
云原生·容器·kubernetes
Hello.Reader13 小时前
Flink Process Table Functions(PTF)实战详解:把 SQL 变成“可编程算子”,状态、时间、定时器一把梭
网络·sql·flink
zcz160712782115 小时前
k8s重新部署的配置过程
云原生·容器·kubernetes
IsPrisoner15 小时前
从 Docker 到 Kubernetes:一次“工程视角”的 K8s 核心概念深度梳理
docker·容器·kubernetes
liuxuzxx16 小时前
containerd的CPU过高的问题排查
容器·性能优化·kubernetes
忙里偷闲学python18 小时前
ceph介绍和安装
linux·ceph·kubernetes
Apache Flink18 小时前
Flink + Fluss 实战: Delta Join 原理解析与操作指南
大数据·数据库·flink
忍冬行者20 小时前
kubeadm安装的k8s集群涉及etcd数据库的参数优化
数据库·kubernetes·etcd