docker部署flink实现状态持久化需确保重启不丢状态、故障可恢复、升级可回滚:一是构建含配置与依赖的自定义镜像并正确设置rocksdb后端及s3/hdfs检查点路径;二是用docker-compose编排多节点集群,通过rest api或cli提交作业,并验证checkpoint/savepoint真实落盘及故障恢复能力。

用 Docker 部署 Flink 并实现状态持久化,关键不在“能不能跑起来”,而在于“重启不丢状态、故障能恢复、升级可回滚”。核心是两件事:一是容器环境要稳(网络、镜像、启动方式),二是状态必须落盘到外部存储,不能留在容器里。
构建带配置和依赖的自定义镜像
别直接用官方 flink:1.18.1 镜像跑生产任务。它缺配置、少连接器、没持久化路径预设。
- 基于官方镜像
FROM flink:1.18.1-scala_2.12,覆盖/opt/flink/conf/flink-conf.yaml - 必设项:
jobmanager.rpc.address: jobmanager(服务名,非 IP)、state.backend: rocksdb、state.checkpoints.dir: s3a://my-bucket/checkpoints/、state.savepoints.dir: s3a://my-bucket/savepoints/ - 把 MySQL CDC、Elasticsearch、S3 文件系统插件等 JAR 包复制进
/opt/flink/lib/ - 若用 S3,确保添加
hadoop-aws和aws-java-sdk-bundle;若用 HDFS,需挂载 core-site.xml/hdfs-site.xml 或打包进镜像
用 docker-compose 编排多节点集群
不用 docker run 手动启容器,避免硬编码 IP 和网络混乱。用 docker-compose.yml 声明服务关系:
- JobManager 服务暴露
8081端口,设置JOB_MANAGER_RPC_ADDRESS=jobmanager - TaskManager 服务通过
depends_on: jobmanager保证启动顺序,并同样设JOB_MANAGER_RPC_ADDRESS=jobmanager - 所有服务共用自定义网络(如
flink-network),Docker DNS 自动解析服务名 - 为 checkpoint 目录挂载卷——不是挂容器内路径,而是挂到外部存储:比如用
minio容器做 S3 兼容服务,或宿主机映射./checkpoints:/tmp/checkpoints(仅测试)
提交作业并触发可靠 checkpoint
Web UI 上传 JAR 容易超时且无日志反馈,不推荐用于生产。
- 用 REST API 提交:
curl -X POST http://localhost:8081/v1/jars/{jar_id}/run?parallelism=4,支持传参和并行度 - 或用本地 Flink CLI:
./bin/flink run -t remote -m localhost:8081 -c com.MyJob ./job.jar,注意 CLI 版本必须与集群一致 - 作业启动后,检查 Web UI 的 Checkpointing 标签页:确认
Latest completed有时间戳,State size非零,且Directory显示的是你配置的s3a://...或hdfs://...路径 - 手动触发 savepoint:
curl -X POST "http://localhost:8081/v1/jobs/{jobid}/savepoints?targetDirectory=file:///tmp/savepoints",用于版本升级前备份
验证持久化是否真正生效
别只看“checkpoint 成功”,要模拟真实故障场景验证。
- 停掉整个集群:
docker-compose down,再up -d重起,观察 TaskManager 是否重新注册,且作业自动从最近 checkpoint 恢复(Web UI 显示 Restoring from checkpoint) - 删掉一个 TaskManager 容器:
docker rm -f flink-taskmanager-1,看它是否被自动拉起并加入集群 - 登录 JobManager 容器:
docker exec -it flink-jobmanager bash,执行ls -l /tmp/checkpoints(若挂宿主机)或aws s3 ls s3://my-bucket/checkpoints/(若用 S3),确认文件真实存在 - 检查日志是否有
Completed checkpoint和Successfully uploaded state to字样,而非Failed to persist checkpoint











