我想将活动池的数据移动到新池,淘汰旧池并让新池代替旧池运行,而无需停机。我想象它会像这样:
- 创建新池
- 上线期间临时将新池与旧池进行镜像
- 从镜像中删除旧池,留下新池
这有标准的工作流程吗?
系统操作系统:Linux,CentOS
“旧池”:5x 1 TB 驱动器(条带化、零冗余、5 TB 可用)
“新池”:4x 2 TB 驱动器(raid 5、冗余、6 TB 可用)
为了清楚起见:
“旧池”包含数据。
“Old Pool” 正在文件服务器中实时运行。
“New Pool” 尚未上线。
目标1:用“新池”替换“旧池”。
目标 1a:使新池活跃起来。
目标 1b:“新池”包含最初在“旧池”上的数据。
目标2:退役“旧池”。
要求:零停机时间。
答案1
(更新。)
你想要的是不可能的,因为无法从包含 RAIDZ vdev 的池中删除 vdev。如果你忘记了 RAIDZ,无论如何,这是一个更好的选择。
来自 ZFS 手册页:
zpool 删除 [-np] 池设备...
从池中移除指定设备。此命令支持移除热备用、缓存、日志以及镜像和非冗余主顶层 vdev,包括重复数据删除和特殊 vdev。当主池存储包含顶层 raidz vdev 时,只能移除热备用、缓存和日志设备。
因此,如果您确实想要 RAIDZ,那么您无法实现零停机时间的想法。您需要创建一个新池,使用zfs send
并zfs receive
复制数据,然后切换池。
如果您不使用 RAIDZ,则您可以将新设备(无论是否镜像)添加到现有池中,然后删除旧设备,这样就不会导致停机。
但请注意,您一次只能删除一个设备/vdev。如果池正在使用中,则删除设备可能会非常慢。删除设备时使用池也可能会非常慢。