坑边闲话:存储是数字资产的基石,没有可靠的存储,就没有可靠的服务。基于 ZFS 文件系统的 TrueNAS SCALE 具有强大的数据复制能力。本文详细介绍 TrueNAS SCALE 的备份功能。

1. TrueNAS Replication 功能介绍·

Replication 指的是「复制」,在 TrueNAS 语境里指的是 zfs sendzfs recv 过程,即直接复制 ZFS 数据集。这里的复制并非是 rsync 的文件级别复制,而是 LUN 级别的复制

TrueNAS SCALE 的 Data Protection 面板集成了所有可用的备份服务,以 24.04 为例:

  • Scrub Tasks
  • Cloud Sync Tasks
  • Periodic Snapshot Tasks
  • Rsync Tasks
  • Replication Tasks
  • Periodic S.M.A.R.T. Tests

2. 创建 SSH 机密和 SSH 连接·

TrueNAS 或者其他的系统,实时远程备份均依赖网络。既然有了网络,就需要考虑认证问题。本节介绍 TrueNAS Replication 所依赖的 SSH 认证。

2.1 创建连接使用的 SSH 机密·

图 1. 建立 Replication 连接时需要先创建认证密钥。或许是认证仅仅为 Replication 及其他备份服务所用,所以这里的机密直接被叫做 Backup Credentials.

在创建密钥时要注意,SSH-Keypairs:这里指的是一套 SSH 私钥、公钥密码,该密钥对存储在 NAS 上。注意,尽管仅填写公钥也可以保存,但是后续步骤将出现问题。务必至少将私钥均填写完整,毕竟公钥可以通过私钥计算出来

2.2 创建 SSH 连接信息·

SSH-Connections 指的是建立 SSH 连接所需要的配置,其中包括选择要使用的

  • 用户名、密钥对;
  • 远程主机的 IP 地址和 SSH 服务端口等。

最后,单击 Discover Remote Host Key 即可自动获得远端机器指纹。

图 2. SSH 配置界面。

3. 创建 Replication 任务·

3.1 选择合适的传输模型·

如图 3 所示,创建 Replication 任务时需要调用此前创建的 SSH 连接配置文件。随后,需要指定 Transport 模式。为了更高的性能,笔者选择使用 SSH+NETCAT.

在创建 Replication 任务时,需要选择 ZFS 数据集的传输模式,目前 TrueNAS SCALE 24.04 支持以下四种模式:

  • SSH 连接:大多数系统都支持 SSH。它需要在「Credentials > Backup Credentials”中预先创建连接。
  • SSH+NETCAT 连接:使用 SSH 建立与目的地系统的连接,然后使用 Netcat 开一个隧道传输未加密的数据流,以实现更高的传输速度。这种方式仅在复制到安装了 py-libzfs 的 TrueNAS 或其他 Linux 系统时有效。
  • LOCAL 模式高效地将快照复制到同一系统上的另一个数据集,无需使用网络。
  • LEGACY 使用 FreeNAS 11.2 及更早版本的传统复制引擎。

用户在选择传输模型时,要考虑以下事项:

  • 系统版本:老旧的版本可选择 LEGACY 模式;
  • 是否需要加密:由于 SSH+NETCAT 可以实现更高性能,因此更适合内网备份,但在不可信环境里,最好使用加密的 SSH 模式。

什么是 py-libzfs

根据官方 GitHub 仓库介绍,py-libzfs 是 ZFS 的一套 Python binding. 什么是 bingding 呢?一般来说,可以高度自动化的系统是支持编程的,而编程无外乎顺序、选择、循环三种简单的逻辑。如果某个可编程系统如 ZFS 提供了一套接口,则可以将这套接口接入 Python,此后直接在 Python 代码中控制这个可编程系统,如此即可享受到 Python 简单明了的语言优势。

严格意义上来说,py-libzfs 是 ZFS 库 libzfs 的一套 Python 接口,它支持使用 Python 语言访问 ZFS 的

  • 存储池
    • 组成存储池的磁盘
  • 数据集
    • 快照
    • 属性

Debian 12 可以通过下列命令安装 py-libzfs.

1
sudo apt install python3-libzfs

其他参数可参考以下内容设置:

  • Number of retries for failed replications 指的是任务执行失败时的重试次数,建议保持默认;
  • Netcat active side 指的是 Netcat 主动方。建立连接要求连接的两端中的一个必须拥有开放的 TCP 端口。该选项指定选择哪个系统(本地或远程)开放端口。一般来说两边都可以,但是在严格的网络环境中,或许需要咨询安全运维工程师才可以。笔者选择 Remote 远端开启端口。
  • 其他信息可参考笔者的截图进行配置。

图 3. TrueNAS SCALE Replication 的通用和传输配置

3.2 选择数据集的备份路径·

通过 WebUI 的路径选取器可方便地选择源数据集和目标数据集。原则上 TrueNAS 可以直接对存储池进行备份,但笔者的备份设备存储空间比较小,于是选择了非递归模式的数据集备份。

图 4. TrueNAS SCALE Replication 的数据集选择。

如图 4 所示,建议勾选 Include Dataset Properties,保证数据集属性也复制过去。

最后,由于 zfs send 基于快照,因此要对 Replication 任务指定对应的周期性快照计划,毕竟 zfs send 的时候所需要的快照名参数要符合快照计划的命名规则。不过这也告诉我们,手动创建的快照可能不被复制,因为这种快照的名字一般不符合自动快照计划的命名规则。如果需要更进一步对指定快照名格式的快照进行复制,需要在 Also Include Naming Schema 列表里写入命名规则,此处不做进一步展开。

3.3 创建 Replication 计划·

只需要勾选 Run Automatically,即可将复制计划设置为在关联的定期快照任务完成后立即启动。

图 5. Replication 的计划任务。默认情况下推荐使用自动模式,即快照创建完立即同步。

此外,如果不希望快照执行完立即传输,则可另行设计 Schedule 周期任务。

4. Replication 性能分析·

经过实测,在 EPYC 7302 TrueNAS SCALE 系统上,使用 NVIDIA ConnectX-6 100G 网卡非 RDMA 模式时,SSH+NETCAT 模式的性能是 SSH 模式的四倍左右,接收方阵列写入速率最高可以达到 1.25GB/s. 此数据仅作参考,因为 SSH 模式时笔者启用了流压缩,所以传输性能损耗更高一些。

总结·

本文简要介绍了 TrueNAS SCALE 的 Replication 功能,至此存储篇章的基本脉络已经讲完,其中包括了

  • 卷管理和数据集设置;
  • 读写性能优化;
  • 异地备份与灾后重建;

通过更改 Replication 的方向,即在 Pull 和 Push 之间切换,即可实现双向同步。