FreeNAS:利用Replication任务备份ZFS快照

2015-3-17 0:01 Herald 6752 FreeNASZFS

Replication (复制)任务,主要用来将ZFS快照同步到其他设备,使用这项功能可以帮助我们为FreeNAS 主机的 ZFS 数据集或存储池建立额外的备份副本,多一个备份,就多一份安全。

原理拆解

Replication 复制任务的原理非常简单,即借助Rsync工具,使用Rsync的SSH同步模式,将ZFS快照在两台主机的ZFS文件系统之间进行实时同步。我们提取一下要点:

  1. Replication复制任务使用Rsync工具同步;
  2. 以Rsync SSH模式进行同步,可以查阅《多台FreeNAS数据冗余:配置Rsync同步》对Rsync SSH模式做进一步了解;
  3. 同步任务两端的主机必须都是ZFS文件系统,这是同步ZFS快照的大前提,在笔者看来,应该没有哪种方式比两台FreeNAS主机之间做Replication复制任务更方便了;

FreeNAS使用Rsync来同步ZFS数据集是非常明智的,因为Rsync采用的是增量同步原理,首次同步完整的数据,以后再同步的时候就只同步两个主机之间发生变化的部分,加之ZFS快照也是类似的原理,快照同步的效率会非常高。

既然使用Rsync实现Replication复制任务,就一定要指定“服务端”和“客户端”,说来也简单,生成ZFS快照的那台主机自然是客户端(发送数据),而接收ZFS快照的主机就是服务端(接收数据)。

阅读过Rsync同步教程的朋友应该还记得,教程中介绍的Rsync SSH同步模式操作起来有些复杂,想到这里笔者也曾有过一些顾虑,好在FreeNAS为Replication复制任务提供了非常友好的设置界面,服务端和客户端的配置在WebGUI中就可以完成。

准备工作

创建Replication复制任务,必须满足以下条件:

  • 服务端和客户端必须都有ZFS存储池,这主要是针对服务端(接收ZFS快照)主机来说的,服务端也用FreeNAS系统就直接满足条件了,设置起来也最简便;
  • 客户端(生成ZFS快照)上必须至少创建一个定期快照任务,且必须至少已有一个ZFS快照;
  • 服务端(接收ZFS快照)主机必须开启SSH服务;

Replication复制任务所需的秘钥(Key):

  • /data/ssh/replication.pub:RSA类型公钥,用来验证客户端(生成ZFS快照)主机身份。该秘钥需要复制到服务端(接收ZFS快照)主机对应用户账户上;
  • /etc/ssh/ssh_host_rsa_key.pub:服务端(接收ZFS快照)主机的RSA类型公钥,主要用于防止中间人攻击。此秘钥需要复制到客户端(生成ZFS快照)主机的Replication复制任务中;

为了更好的演示如何创建Replication复制任务,我们准备了以下两台FreeNAS 9.3主机:

主机A (客户端,生成ZFS快照)

  • IP:192.168.1.102
  • 主机名:FreeNAS
  • 数据集:storA

主机B (服务端,备份主机A的ZFS快照)

  • IP:192.168.1.105
  • 主机名:nasB
  • 数据集:backup

配置服务端(接收ZFS快照)主机

首先要做的是提取客户端的RSA公钥,复制到服务端。注意,打开主机A(客户端)的WebGUI,依次点击 “存储” → “Replication 任务” → “显示公钥”,如下图,全选并复制窗口文本框中的秘钥文本。

20150316205901

接下来回到主机B(服务端),将秘钥复制到执行Replication复制任务的用户账户中(通常以root用户执行复制任务),依次点击 “账户” → “所有用户” → “root”,编辑root用户,如下图,将秘钥粘贴到 SSH Public Key 这一项的文本框中(如果文本框中已存在秘钥,则在原有秘钥下方另起一行,粘贴新秘钥)。

20150316210319

最后,启用主机B(服务端)的SSH服务,打开服务管理器,如下图,启用SSH服务。

20150316210727

配置客户端(生成ZFS快照)主机

前面已经提到,创建Replication复制任务必须保证客户端主机已经为需要备份的数据集创建了“定期快照任务”,且必须至少已创建了一个快照。关于ZFS快照的详细内容,请您查阅《FreeNAS ZFS 快照的使用与管理》,在此我们点到即止。

如下图,我们在主机A上为数据集storA创建了一个定期快照任务,计划周一至周五,每天9:00 ~ 18:00开始,每隔10分钟对 storA 数据集创建一个快照,且快照保存时间为2个星期(系统会自动删除超过两个星期的快照)。

20150316211309

定期快照任务一经创建,会立即为 storA 数据集创建第一个快照,如下图。

20150316211753

基本条件都已经满足了,现在开始创建Replication复制任务。如下图所示,在主机A的WebGUI依次点击 “存储” → “Replication 任务” → “添加复制”,此时会弹出Replication复制任务的创建窗口。

20150316212557

创建Replication复制任务有以下选项:

  • 卷/数据集:选择ZFS快照所在的数据集(即需要备份的数据集),如果没有ZFS快照,则下拉列表是空的;
  • 远程 ZFS 卷/数据集:输入服务端用来接收(备份)ZFS快照的数据集,特别提示,只需要输入“存储池/数据集”这种格式的名称,不要使用带有 /mnt/ 的绝对路径。本例中,我们准备的数据集绝对路径为 /mnt/mySync/backup,则只需要填写 mySync/backup 即可
  • 递归复制和删除远程端上的陈旧快照:选中此项,若所选数据集包含子数据集,则同时复制子数据集快照到服务端,且会覆盖服务端上的旧版快照;
  • 初始化远程端(可能导致远程端上的数据丢失!):如果Replication任务卡壳了,可以选中此项,这项操作会销毁服务端上所有已复制的快照,小心使用;
  • Replication 流压缩:选择一种压缩算法,可以节省传输带宽,lz4 (最快, 推荐),pigz (多面手),plzip (最大压缩),Off (不压缩);
  • 限制(kB/s):限制Replication任务的传输速度,0为不限制;
  • 开始:选择可以执行Replication任务的起始时间,在所选时间之前不执行;
  • 结束:选择可以执行Replication任务的截止时间,在所选时间之后不执行;:保持默认设置代表全天24小时均可执行Replication任务;
  • 启用:取消选中可以停止当前Replication任务,但不会删除此任务;
  • 远程主机名:服务端的IP地址或DNS名称;
  • 远程端口:必须与服务端SSH服务端口号相同,默认22;
  • 启用专用用户:如果你希望使用其他用户身份执行Replication任务可以选中此项,如不选,则默认使用root用户;
  • 专用用户:如果选中了“启用专用用户”,则会显示此项,在此选择希望执行Replication任务的用户;
  • Encryption Cipher:可选“标准”、“快速”或“禁用”,通常来说,选择“禁用”可以大大缩减首次执行Replication复制任务的时间;
  • 远程主机密钥:使用“SSH Key 扫描”按钮自动获取服务端的主机公钥;

如下图,本例Replication复制任务设置了以下几项(其他设置保持默认):

  • 卷/数据集:myStor/storA
  • 远程 ZFS 卷/数据集:mySync/backup
  • 远程主机名:192.168.1.105
  • 远程主机密钥:点击“SSH Key 扫描”按钮获取

20150316220219
20150316220241

检查Replication复制任务是否生效

默认情况下,Replication复制任务将在客户端(生成ZFS快照的主机)创建新快照时开始执行同步。

在本例中,我们为数据集 storA 设置的定期快照每10分钟执行一次,因此,Replication复制任务创建以后,会在 storA 下一次创建快照时开始,第一次同步ZFS快照可能比较耗费时间,主要取决于ZFS快照所在数据集的大小以及网络速度,数据集越大,网络越慢,初次同步的时间就会越长。

如果执行Replication复制任务的数据集很大,首次执行同步任务时可以禁用“Encryption Cipher”加密选项,在完成首次同步后再启用此项,这样可以在一定程度上加快首次同步的速度。

每次Replication复制任务执行完成,在客户端(生成ZFS快照的主机)的Replication任务列表中可以看到最近一次同步的信息,如下图。

0150316234455

与此同时,当首次Replication复制任务执行完成,在服务端(接收ZFS快照的主机)的存储管理器卷列表中,能够看到设置用于存储接收到的ZFS快照的数据集下面自动创建了一个新的子数据集,该数据集名称与客户端上设置的ZFS快照数据集相同,其权限设置集成服务端父数据集权限,该数据集是客户端数据集的完整副本。

20150316234709

在服务端(接收ZFS快照的主机)的快照列表中,可以看到从客户端同步过来的所有快照,如下图。

20150316235253

{{ headers["x-wp-total"] }} 条评论

{{ post_id = '1327' }}

回复 {{ reply_to }}