阅读有关 ZFS 的 Ubuntu Wiki 页面(https://wiki.ubuntu.com/ZFS)我发现 ZFS 声称具备某些功能,但我找不到相关文档。如果这些声称确实可行,我很想知道如何实现它们
Ari 有一个单磁盘工作站。她买了一个新磁盘并插入。ZFS 会自动将新磁盘空间添加到池中。她的主目录已镜像,而她的操作系统和临时空间则在后台自动条带化。
Jack 有三块大小不同的磁盘。配置合理的分区和 RAID 设置完全是反复试验。ZFS 将这三块磁盘抽象为一个空间池,并实现性能和安全性的最佳平衡。Jack 声明某些媒体目录不需要容错,ZFS 会透明地将它们条带化到所有磁盘上。
这两个引言似乎都表明,在一个池中混合使用容错区域和高性能区域是可能的。从我读过的每一篇文档来看,这是不可能的……还有人知道怎么做吗?
答案1
这些段落具有误导性和错误信息。
Ari 有一个单磁盘工作站。她购买了一块新磁盘并将其插入。ZFS 会自动将新磁盘空间添加到池中。
ZFS 不会自动将新插入的磁盘添加到池中。您必须运行命令zpool
来告知您想要如何使用磁盘。
她的主目录被镜像
只有 Ari 要求时才会有镜像,但根据句子的其余部分,情况并非如此。
而她的操作系统和临时空间则在后台自动划分。
如果选择了镜像,则不能进行条带化。如果选择了条带化,则不能进行镜像。在后一种情况下,ZFS 不会进行“后台条带化”或“配置后条带化”。条带化在写入时进行一次。
Jack 有三块不同大小的磁盘。配置合理的分区和 RAID 设置完全是靠反复试验。
也许吧,但比传统的卷管理更容易。
ZFS 将三个磁盘抽象为一个空间池,并提供了性能和安全性的最佳平衡。
三重镜像将提供最佳的读取性能和最佳的安全性。
Jack 声明某些媒体目录不需要容错,ZFS 将它们透明地分布在所有磁盘上。
您无法设置目录的属性,但可以对数据集(例如文件系统)和池进行设置。不过,使用 ZFS 创建多个文件系统是一项轻量级操作。
总结一下:
您不能在单个池中同时拥有镜像文件系统和条带文件系统。属于一个池的所有数据集共享相同的底层池 RAID 配置。
假设使用相同的块(例如zfs set copies=2 dataset
)来提供容错能力,ZFS 将尽力而为,但不能 100% 保证所有块对最终都会到达不同的磁盘。
即使所有 ditto 块都物理位于不同的磁盘上,池也无法承受整个磁盘故障(或者更准确地说,整个磁盘故障后无法重启)。ZFS 副本可防止有限的介质错误(参见 Andreas 段落),但不能防止整个磁盘不可用。将 Ari 配置称为“镜像”具有误导性。
我永远不会建议这样的配置。如果您只有一个磁盘但仍希望对部分介质故障(坏块)进行一定程度的保护,或者在非冗余池上使用重复数据删除,那么 Ditto 块是一项很棒的功能。否则,不应将期望值设得太高,镜像或 raidz 是多磁盘池的最佳选择。
请注意,通过创建多个基于分区的池,可以使用 ZFS 实现镜像、raidz 和条带化三种不同大小磁盘的组合。例如,假设您有 4TB、3TB 和 2TB 磁盘。您可以将所有磁盘分成 1TB 分区,创建一个具有 1+1+1 个分区的 2 TB raidz,一个具有 1+1+1 个分区的 3 TB 条带,一个具有 1+1+1 个分区的 1 TB 镜像,以及一个具有剩余分区的 1 TB 单设备池。不过,不要指望这种混合 raid 设置会带来出色的性能,并努力使应用程序不要同时访问各个池。
答案2
他们在这里暗示的是一种配置,您只需将所有磁盘添加到池中(无需父级mirror
或raidz
组控制磁盘)。
在这种配置中,放置文件的设备数量由属性决定copies
,而属性又由命令控制zfs set
- 因此池中的某些数据(通过 ZFS 文件系统)将比其他数据具有更高的容错能力,并允许跨混合大小的设备进行容错。