我有一台生产服务器P
和一台备用服务器S
。两者都运行 Debian buster 并且OpenZFS / ZoL2.1.0。P
仅具有内部磁盘,为操作系统、虚拟机和所有其他数据提供 ZFS 存储。S
具有相同的内部磁盘,但还有一个额外的备份磁盘,其中包含单独的 ZPOOL,可以热插拔(硬件方面),并用作定期轮换的备份磁盘。
在 上P
,只有一个池,称为rpool
。在 上S
,有两个池:(rpool
与 P 上相同),加上extpool
(在备份磁盘上)。
在 上P
,脚本会定期运行,该脚本会拍摄 ZFS 数据集的快照并将它们复制到S
通过zfs send
/ zfs receive
。在 上S
,脚本定期运行,将快照从 复制到rpool
到extpool
(也通过zfs send
/ zfs receive
)。P
和上的脚本S
尚未同步,这意味着当 上的脚本正在将快照从 传输到 的过程中时, 上的脚本P
可能会尝试将快照复制到。S
S
rpool
extpool
P
尝试发送快照时,脚本有时会失败。我相信这种情况发生在上述情况下,因此我怀疑不可能发送数据集的快照并同时接收同一数据集的较新快照。另一方面,很可能我在其他方面做错了,所以我想在这方面确定一下。换句话说,我想知道是否可以执行以下操作:
在P
:
zfs snapshot rpool/dataset1@snapshot1
zfs send -R rpool/dataset1@snapshot1 | ssh S 'zfs receive -F rpool/dataset1'
# Wait some time
zfs snapshot rpool/dataset1@snapshot2
进而同时
在S
:
zfs send -R rpool/dataset1@snapshot1 | zfs receive -F extpool/dataset1
以及P
:
zfs send -R -I rpool/dataset1@snapshot1 rpool/dataset1@snapshot2 | ssh S 'zfs receive -F rpool/dataset1'
最后要说明的是:在 上S
,涉及复制的任何数据集都不会被装载。S
这些数据集的唯一作用是从 接收新快照P
,将其存储在内部磁盘上,然后将所有快照从内部磁盘复制到外部备份磁盘。
当然,唯一的例外是紧急情况:如果P
失败,复制的数据集将手动安装S
并切换到生产操作。不过,我明确提出的问题与这种情况无关。