3、异步迁移核心概念:检查点、恢复、预拷贝、后拷贝原理
容器异步迁移的核心在于将运行中的容器状态从源节点传输到目标节点,而无需停止服务。这一过程依赖四个关键技术概念:检查点(Checkpoint)、恢复(Restore)、预拷贝(Pre-copy)和后拷贝(Post-copy)。理解这些概念是掌握容器热迁移的基础。
3.1 检查点(Checkpoint)与恢复(Restore)
检查点与恢复是容器迁移的原子操作,分别负责冻结并保存状态与重建并恢复运行。
| 概念 | 定义 | 关键操作 | 输出产物 |
|---|---|---|---|
| 检查点(Checkpoint) | 在某一时刻冻结容器,将内存、CPU寄存器、网络连接、文件描述符等完整状态序列化到磁盘。 | 使用 criu dump 或 docker checkpoint create |
检查点镜像目录(包含内存页、进程树、文件系统状态等) |
| 恢复(Restore) | 从检查点镜像中重建进程,恢复内存映射、网络连接和文件描述符,使容器从冻结点继续运行。 | 使用 criu restore 或 docker start --checkpoint |
运行中的容器实例 |
技术要点:检查点操作依赖 CRIU(Checkpoint/Restore In Userspace)内核特性。Docker 自 1.13 版本起内置了对 CRIU 的支持,但需要宿主机内核开启
CONFIG_CHECKPOINT_RESTORE 和 CONFIG_MEMCG 等选项。
3.2 预拷贝(Pre-copy)原理
预拷贝是一种迭代推送策略,在容器保持运行的状态下,分多轮将内存页从源节点传输到目标节点,最后执行短暂的停机拷贝完成最终同步。
预拷贝迁移流程
- 初始推送:将容器全部内存页从源节点传输到目标节点。
- 迭代收敛:反复传输上一轮迭代中被修改的脏页(dirty pages),直到满足收敛条件(脏页量小于阈值或达到最大迭代次数)。
- 停机拷贝:暂停容器,传输最后一轮脏页和CPU状态(检查点),然后恢复容器。
| 阶段 | 操作 | 容器状态 | 传输数据量 |
|---|---|---|---|
| 第1轮 | 全量内存页传输 | 运行中 | 最大(全部内存) |
| 第2轮 | 传输第1轮产生的脏页 | 运行中 | 中等 |
| 第N轮 | 传输第N-1轮产生的脏页 | 运行中 | 逐渐减小 |
| 停机阶段 | 检查点 + 传输最后一轮脏页 | 暂停 | 最小(收敛后脏页) |
预拷贝优势:停机时间极短(通常毫秒级),适用于对服务中断敏感的场景。
预拷贝劣势:总迁移时间可能较长,且对写密集型容器(脏页生成速度快于传输速度)可能无法收敛。
预拷贝劣势:总迁移时间可能较长,且对写密集型容器(脏页生成速度快于传输速度)可能无法收敛。
3.3 后拷贝(Post-copy)原理
后拷贝是一种按需拉取策略,先快速迁移最小必要状态(CPU寄存器、进程树等),在目标节点恢复容器运行,然后按需从源节点拉取缺失的内存页。
后拷贝迁移流程
- 预推送:在源节点创建检查点,仅传输进程核心状态(不含内存页)。
- 快速恢复:在目标节点立即恢复容器运行。
- 按需拉取:当容器访问尚未传输的内存页时,触发缺页中断,从源节点拉取对应页面。
- 后台预取:后台线程持续拉取剩余内存页,减少后续缺页中断。
| 阶段 | 操作 | 容器状态 | 传输数据量 |
|---|---|---|---|
| 预推送 | 传输进程核心状态(不含内存) | 暂停 | 极小(KB级) |
| 快速恢复 | 在目标节点恢复容器 | 运行中 | — |
| 按需拉取 | 缺页中断触发页面拉取 | 运行中(可能卡顿) | 按需 |
| 后台预取 | 主动拉取剩余页面 | 运行中 | 剩余全部 |
后拷贝风险:如果源节点在迁移完成前故障,容器将丢失未传输的内存页,导致进程崩溃。因此后拷贝通常需要配合源节点页面缓存或复制备份机制。
3.4 预拷贝与后拷贝选型对比
在实际容器云平台中,选择预拷贝还是后拷贝需要根据工作负载特征和网络条件综合判断。
| 选型维度 | 推荐策略 | 原因 |
|---|---|---|
| 写密集型容器 | 后拷贝 | 预拷贝可能无法收敛(脏页生成速度 > 传输速度) |
| 读密集型容器 | 预拷贝 | 脏页少,迭代收敛快,停机时间短 |
| 大内存容器(>16GB) | 后拷贝 | 避免全量内存多次传输,减少网络带宽占用 |
| 低延迟网络(<1ms) | 后拷贝 | 缺页中断响应快,按需拉取延迟可接受 |
| 高可用要求(无状态) | 预拷贝 | 迁移完成后源节点可立即释放,降低故障域 |
| 源节点不稳定 | 预拷贝 | 后拷贝依赖源节点持续在线,存在数据丢失风险 |
实践建议:大多数容器云平台(如 Kubernetes + CRIU 集成方案)默认采用预拷贝策略,并通过配置脏页收敛阈值(如
--page-server 参数)和最大迭代次数来平衡迁移时间与停机时间。后拷贝通常作为备选方案,用于预拷贝无法收敛的特殊场景。
3.5 核心概念关系总结
四个核心概念构成了容器异步迁移的完整技术栈:
- 检查点(Checkpoint)和恢复(Restore)是迁移的基础操作,负责状态保存与重建。
- 预拷贝(Pre-copy)和后拷贝(Post-copy)是迁移的高级策略,决定状态传输的时机和方式。
- 预拷贝采用先传后停(先迭代传输脏页,最后停机拷贝),追求极短停机时间。
- 后拷贝采用先停后传(先快速恢复,再按需拉取页面),追求极短迁移总时间。
关键结论:没有绝对最优的迁移策略,只有最适合当前工作负载的策略。理解预拷贝和后拷贝的原理,能够帮助运维人员在容器云平台中针对不同业务场景进行精细化调优,实现零感知或低感知的容器迁移体验。