一個大磁碟上的 ZFS 鏡像和兩個小磁碟的 RAID0
您有:兩個 X 大小的磁碟和一個 2X 大小的磁碟。
您想要:具有 2X 大小的鏡像冗餘的 zpool
使用 ZFS 連接兩個 X 驅動器很簡單。但是我發現無法使用 ZFS 的內部方法將生成的 vdev(大小 2X)與另一個 2X 磁碟鏡像。
我想到了這些(或多或少不雅的)解決方案:
- 使用作業系統工具(Linux 的 mdadm,FreeBSD 的 gstripe)將兩個 X 驅動器連接到一個可以與 2X 鏡像的物理設備。但我對 ZFS 的額外複雜性、平台依賴性和失去裸機優勢感到不安。
- 將 2X 驅動器細分為兩個分區,並創建一個具有四個成員的 RAID10,
zpool create tank mirror /dev/Xone /dev/2Xpart1 mirror /dev/Xtwo /dev/2Xpart2
其中條帶分區分散在物理上連續的硬體上。
ZFS 真的不支持你想做的事情。有可能讓它做你想做的事,但你一直在與預期的用途作鬥爭。
值得牢記的是,ZFS 是一種企業文件系統和捲管理器解決方案。在企業環境中,無論採用哪種方式,您所描述的增加的複雜性都會使購買相同大小的驅動器的成本相形見絀。
考慮到您可能確實擁有的最乾淨的解決方案是將較大的驅動器分成兩半,然後設置一個包含兩個 vdev 的池,每個 vdev 具有一個較小的磁碟和一半的較大磁碟。然後,ZFS 將在兩個 vdev 之間對數據進行條帶化,為您提供兩個寬條帶集的雙向鏡像:在標準 RAID 術語中,兩個 RAID 1 中的一個 RAID 0 各有兩個設備,其中每個 RAID 上的一個設備1 實際上是單個設備的一部分。像這樣(物理設備標有 *):
_ small1* / _ raid0left ----< _ largeleft / \ / pool ---< >---- large* ----< \ / \ ` raid0right ---< ` largeright \ ` small2*
看看它看起來有多脆弱?一方面,無論出於何種原因失去那個大驅動器,你都會失去所有的冗餘,極大地限制了 ZFS 從錯誤中恢復的能力。
這樣做將迫使較大的磁碟瘋狂地尋找以滿足 I/O 請求,因為 ZFS 會將其視為兩個獨立的設備,而實際上它只是一個,並且很可能會關閉 ZFS 的許多優化,因為 ZFS 不能再假設它控制著整個更大的驅動器。如果它是一個旋轉驅動器,那麼單靠尋找就會給它帶來巨大的壓力。
它也幾乎會將您鎖定在此設置中,因為至少我上次查看過,vdevs 只能添加到池中,而不能刪除。您可以替換 vdev 中的設備,但您不能對 vdev 本身做任何事情而不破壞和重新創建整個池。還要記住,池中的每個 vdev 至少需要
DEGRADED
池才能正常工作。因此,即使在最好的情況下,您也不會獲得比簡單鏡像配置更高的可靠性,因為即使沒有任何其他故障,一個物理設備的故障也會降低條帶化的兩側。在這種情況下,最好希望這兩個小型驅動器能夠承受 resilver 的嚴酷考驗。如果您無論如何都嘗試這樣做,除非較大的磁碟是 SSD,在我看來,單獨的尋軌活動對池的性能絕對是毀滅性的,絕對是 IOPS 和吞吐量方面。
如果是我,我會得到第二個與較大的驅動器相同大小的驅動器,並設置一個簡單的雙向鏡像。