外观
ZFS 存储复制
在线迁移与离线迁移提到过:客户机磁盘在本地存储上,想要快速迁移或者被 HA 接管,需要先有一份"存储复制"副本。这篇讲这个机制本身。
为什么需要它
搭 Ceph、NFS 这类真正的共享存储成本不低,尤其是小规模集群。存储复制(基于 ZFS 快照)提供了一个折中方案:客户机磁盘仍然放在本地 ZFS 存储上,PVE 定期把增量快照发送到其他节点,让那些节点上有一份"够新"的副本。
存储复制不是共享存储,也不是备份
- 复制之间有时间窗口(默认最短间隔是几分钟,可调)。发生故障时,自上次同步以来写入的数据会丢失——这是本文标记为「数据丢失风险」的原因。
- 它解决的是"节点故障后能在别的节点上尽快恢复运行",不是"误删、加密、配置改崩了"这类场景。这些仍然需要真正的备份,见恢复演练和3-2-1 备份策略落地。
开始之前
| 条件 | 说明 |
|---|---|
| 存储类型 | 只支持 ZFS 本地存储(zfspool 类型),客户机磁盘要放在这类存储上 |
| 存储 ID 一致 | 目标节点上必须存在同名的 ZFS 存储,否则复制任务直接失败 |
| 网络 | 默认走迁移网络设置,没配置的话走管理网络;数据量大或多任务并发时,建议规划独立网段,方法类似corosync 冗余链路规划 |
配置一个复制任务
Web UI
在数据中心、节点或客户机层级都能找到复制任务的管理入口,新建时填:目标节点、(可选)调度计划、(可选)限速。
命令行
sh
# 给客户机 100 创建一个复制任务,目标节点 pve2,每 5 分钟同步一次,限速 10
pvesr create-local-job 100-0 pve2 --schedule "*/5" --rate 10
# 常用管理命令
pvesr disable 100-0
pvesr enable 100-0
pvesr update 100-0 --schedule '*/00'任务 ID 由 VMID 加编号组成(例如 100-0),命令行需要自己指定,Web UI 会自动生成。调度语法是 systemd calendar events 的子集,最短间隔 1 分钟,最长一周。
想给复制单独规划网络
在 数据中心 → 选项 或 /etc/datacenter.cfg 里可以指定专用网段,例如:
text
replication: secure,network=10.1.2.0/24迁移和复制的配合
- 把客户机迁移到已经有复制副本的节点,只需要传输自上次同步以来的增量,比整盘搬快得多。
- 迁移完成后,复制方向会自动反过来:比如 VM100 从 nodeA 迁到 nodeB 之后,后续会从 nodeB 向 nodeA(以及其他配置的目标)复制,而不是继续单向从 nodeA 发出。
- 迁移到一个没有复制副本的节点,会传输全部磁盘数据,之后仍然按原有配置继续向原来的目标复制。
节点故障后的手工恢复
这是应急流程,不是常规操作,按顺序谨慎执行
在存活的节点上先确认 quorum:
pvecm status。只有在确认 quorum 无法通过正常方式恢复时,才考虑用
pvecm expected 1强行让集群变为可写——这一步的风险和使用限制见安全移除节点里的说明,不要在 quorum 正常的情况下使用。把客户机的配置文件从故障节点的目录移到存活节点(虚拟机在
qemu-server/,容器在lxc/下):shmv /etc/pve/nodes/A/qemu-server/100.conf /etc/pve/nodes/B/qemu-server/100.conf用
qm start 100/pct start 200启动客户机。
影响范围:恢复出来的客户机数据只到最近一次成功复制为止,期间的写入永久丢失。前置条件:确认故障节点确实无法恢复且不会再突然上线(避免和刚移过来的资源冲突)。这不能替代真正的灾难恢复演练,建议按恢复演练的方法定期用备份验证一次完整恢复流程。
检查结果
sh
# 查看复制任务的状态和上次成功时间
pvesr status
# ZFS 层面确认快照在按预期生成
zfs list -t snapshot | grep <存储名>任务长期处于错误状态(默认每 30 分钟重试一次)通常意味着网络问题、目标存储写满,或者目标节点缺少同名存储,查看复制任务日志确认具体原因。
常见问题
复制任务显示错误,一直没恢复正常。 检查目标节点是否有同名 ZFS 存储、目标存储空间是否写满,以及两节点间的网络是否通畅。
复制目标节点上看到了客户机磁盘的快照,但配置文件不在。 属于正常现象——复制只搬运磁盘数据,不搬运客户机的 .conf 配置文件。真正的故障切换需要手工搬运配置(见上文)或者依赖 HA 自动处理。
同一个客户机能不能复制到两个目标节点? 可以复制到多个不同节点,但不能对同一个目标节点重复设置。