Linux Longhorn 的分布式块存储与快照备份策略

1次阅读

longhorn快照非备份,仅存本地增量;必须执行backup操作才能上传至s3/nfs等远程存储;snapshot与backup是独立对象,backup依赖snapshot但可单独保留;recurringjobs需用标准utc cron且注意时区换算。

Linux Longhorn 的分布式块存储与快照备份策略

Longhorn 卷的快照不是备份,snapshot create 只存增量差量

很多人在 longhorn-ui 点完 Create Snapshot 就以为数据“已备份”,结果节点宕机后发现快照全丢了。因为 Longhorn 的快照默认只存在本地磁盘(对应 volume 所在节点的 /var/lib/longhorn/replicas/),不跨节点复制,也不上传到任何外部存储。

实操建议:

  • 快照必须配合 backup 操作才真正落盘到 S3/NFS 等远程后端;单独调用 longhorn backup create 或在 UI 点 “Create Backup” 才会触发上传
  • snapshotbackup 是两个独立对象:一个在内存+本地磁盘,一个在远程存储;backup 依赖某次 snapshot 作为源,但删掉 snapshot 不一定删 backup(取决于是否启用 backupStorePollInterval 自动清理)
  • 注意 backupTarget 配置路径末尾必须带 /,比如 s3://longhorn-backup@cn-north-1/,少斜杠会导致静默失败,日志里只报 failed to list backups

设置 recurrentBackup 时,cron 格式不支持秒级,且时区是 UTC

想每 5 分钟自动备份?写成 */5 * * * * 是对的;但写成 */5 * * * *0 */5 * * *(想每 5 小时)就完全不会触发——Longhorn 的 cron 解析器只兼容标准 vixie-cron,不支持秒字段,也不识别 0 */5 这种写法(它会当成 0 分、每 5 小时一次,实际是每天 0:00、5:00、10:00…)。

实操建议:

  • 所有 recurrentBackup 的时间都按 UTC 解析,和集群节点本地时区无关;如果集群在东八区,想每天凌晨 2 点备份,得设成 0 2 * * *(UTC 时间 2 点 = 北京时间 10 点),所以应填 0 18 * * *
  • 通过 kubectl edit volumes.longhorn.io <vol-name></vol-name> 直接改 recurringJobs 字段最可靠;UI 上编辑容易丢参数,尤其当同时配 retention 和 labels 时
  • Retention 数值设为 0 不代表“保留全部”,而是“不清理”,长期运行会导致 backup 对象积,S3 费用和 list 延迟上升

从 backup 恢复 volume 时,restore 不等于 clone,不能直接替换原 volume

看到 backup 列表里有个可用的 backup-xxx,就想点 “Restore” 回原 volume?不行。Longhorn 的 restore 操作本质是创建一个全新 volume(名字带 -restore- 后缀),并把 backup 数据拉取回来;它不会覆盖、卸载或停用原 volume,也不会自动绑定 PVC。

实操建议:

  • 恢复前先确认目标 backup 的 stateCompleted,且 messages 为空;FailedDeleting 状态下 restore 会卡住或报 backup is not ready
  • 恢复后的 volume 默认是 detached 状态,需手动 attach;如果原 PVC 还绑着旧 volume,kubernetes 不会自动切换,得先 kubectl delete pvc 再重建,或用 clone 方式新建 PVC 指向新 volume
  • 跨集群 restore 要求目标集群的 Longhorn 版本 ≥ 源集群版本,否则可能因 backupConfig 字段不兼容而报 cannot restore from backup created by newer version

使用 NFS 作 backup target 时,mountOptions 必须含 nfsvers=4.1,且服务端要开 rpcbind

很多用户用 NAS 挂 NFS 当 backup target,配置完却一直卡在 Connecting to backup target...longhorn-manager 日志反复刷 failed to ping backup target。根本原因常是 NFS 协议协商失败:Longhorn 3.x+ 默认要求 NFSv4.1+,而多数 NAS 默认开的是 v3 或 v4.0。

实操建议:

  • 在 Longhorn Settings 里设 backupTargetnfs://192.168.1.100:/longhorn-backup/,再额外加 backupTargetCredentialSecret(哪怕空 secret,用来触发 mount)
  • 必须在 Settings → General → backup-target-credential-secret 下挂一个 Secret,内容至少含 mountOptions: nfsvers=4.1,hard,intr,rsize=1048576,wsize=1048576;缺 nfsvers=4.1 就连不上
  • NAS 服务端除了共享目录,还要确保 rpcbind 服务运行(NFSv4.1 仍依赖它做初始端口映射),centos/RHEL 上执行 systemctl enable --now rpcbind

快照链深度、backup target 权限、跨节点网络 MTU —— 这些地方不出错时没人提,一出就是恢复不了。盯紧 longhorn-backup 这个 Namespace 里的 pod 日志,比看 UI 红绿灯管用。

text=ZqhQzanResources