zfs - 熱備用、替換、分離:資源正忙
我對zfsonlinux很陌生。我剛剛成功建立了一個全新的伺服器,在 ZFS 上使用了 Debian ROOT。一切正常,但我遇到了熱備用和更換磁碟的問題。
這是我的游泳池:
NAME STATE READ WRITE CKSUM mpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-ST1XXXXXXXXXXA-part1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXB-part1 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXC-part1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXD-part1 ONLINE 0 0 0 spares ata-ST1XXXXXXXXXXE-part1 AVAIL ata-ST1XXXXXXXXXXF-part1 AVAIL
現在,我可以開始真正的樂趣了。拉盤!我現在正在拔掉磁碟 C。我有一個工作池,但是 DEGRADED(如預期的那樣):
NAME STATE READ WRITE CKSUM mpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-ST1XXXXXXXXXXA-part1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXB-part1 ONLINE 0 0 0 mirror-1 DEGRADED 0 0 0 ata-ST1XXXXXXXXXXC-part1 UNAVAIL 0 0 0 ata-ST1XXXXXXXXXXD-part1 ONLINE 0 0 0 spares ata-ST1XXXXXXXXXXE-part1 AVAIL ata-ST1XXXXXXXXXXF-part1 AVAIL
到現在為止還挺好。但是,當我嘗試用磁碟 E 替換磁碟 C 時,無論如何我都會遇到 DEGRADED 池。
# zpool replace mpool ata-ST1XXXXXXXXXXC-part1 ata-ST1XXXXXXXXXXE-part1 cannot open '/dev/disk/by-id/ata-ST1XXXXXXXXXXE-part1': Device or ressource busy (and after a few sec) Make sure to wait until resilver is done before rebooting.
所以我正在等待幾秒鐘讓重新同步(有 0 個錯誤),然後我得到了:
NAME STATE READ WRITE CKSUM mpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-ST1XXXXXXXXXXA-part1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXB-part1 ONLINE 0 0 0 mirror-1 DEGRADED 0 0 0 spare-0 UNAVAIL ata-ST1XXXXXXXXXXC-part1 UNAVAIL 0 0 0 ata-ST1XXXXXXXXXXE-part1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXD-part1 ONLINE 0 0 0 spares ata-ST1XXXXXXXXXXE-part1 INUSE currently in use ata-ST1XXXXXXXXXXF-part1 AVAIL
然後,如果我
zpool detach
使用 C 盤(如此處所述),我的池將再次聯機,並且一切正常(只有 5 個 HDD 的池)所以這是我的問題:
- 為什麼更換C盤不足以重建一個完整的池?正如在 oracle 部落格和這裡所解釋的那樣,我期望我不必為 zfs 分離磁碟來正確重建池(為了維護方便,最好保留拔出磁碟的 zpool 狀態跟踪)
- 為什麼 zpool 一直告訴我備用磁碟“忙”(實際上不是)?
- 見下文:如何自動取回備用磁碟?
**編輯:**問題 1 更糟糕 => 當我重新插入磁碟 C 時,zfs 無法管理我的備用備份!所以我只剩下一張磁碟了
NAME STATE READ WRITE CKSUM mpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-ST1XXXXXXXXXXA-part1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXB-part1 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXE-part1 ONLINE 0 0 0 ata-ST1XXXXXXXXXXD-part1 ONLINE 0 0 0 spares ata-ST1XXXXXXXXXXF-part1 AVAIL
簡潔版本:
您必須以相反的方式執行此操作:替換發生故障的池磁碟(使用新磁碟或自身),然後從池中分離備用磁碟(以便所有 vdev 都可以使用它)。我假設備用磁碟很忙,只要它用來替換的磁碟本身沒有被替換。分離這個磁碟或另一個磁碟只會讓情況變得更糟。
另外,我記得 ZoL 沒有根據事件自動附加/分離備件,您必須編寫自己的腳本或使用ZFS 事件守護程序之類的東西。
長版:
關於您的後續評論
如果 C 盤出現故障,好的,讓我們更換它然後拆下它。但是它把我的池子弄壞了,因為 zpool 不記得我曾經在 mirror-1 中有一個 C 盤:/
這取決於你如何看待它。如果從鏡像中分離磁碟,則不再相關。它可能有缺陷,可能會在其他系統上使用,可能會在製造商保修期內更換。無論用它做什麼,你的游泳池都不在乎。
如果你只是分離磁碟,那麼它會降級;如果您改為提供另一個磁碟(來自自動備用、手動備用或完全手動替換),該磁碟將承擔舊磁碟的角色(因此術語
replace
,新磁碟在其位置和職責中完全替換舊磁碟)。如果需要,您可以將分離的磁碟添加回池中,例如作為備用磁碟(因此初始情況相反)。
備件在 ZFS 系統上的工作原理
備件只有在自動啟動時才真正有意義。Sun 設計的 ZFS 儲存陣列有許多類似的磁碟,18 到 48 個磁碟的數量並不少見。它們由多個 vdev 組成,例如 4 x RAID Z2 用於 24 個磁碟系統。此外,它們由專門的管理員管理,但沒有人可以 24/7 全天候工作。因此他們需要一些東西作為第一響應,並且它必須在所有 vdev 上工作,因為任何磁碟都可能隨時發生故障。
因此,如果深夜第二個 vdev 中的磁碟發生故障,系統會自動獲取兩個配置的備用磁碟之一併替換故障磁碟,以便池照常工作(對於使用在其上執行數據庫的網站的客戶,性能相同, 例如)。早上,管理員閱讀故障報告並排查原因:
- 如果磁碟已經死了,他可能會用同一托盤中的替換磁碟替換它,讓它重新同步,然後熱備盤會自動退出備用任務,觀察另一個死盤,它可以在其中進行第一響應。
- 如果沒有可用的替換磁碟,他甚至可以將備用磁碟作為新的數據磁碟,將備用磁碟的數量暫時減少 1(直到另一個替換磁碟被運送,它將成為新的備用磁碟)。
- 如果只是控制器錯誤丟棄磁碟,他甚至可能用自己替換它,觸發與第一種情況相同的備用更新。
如果您按照工程師為最常見的預期使用場景設計的方式來考慮它,它會更有意義。這並不意味著您必須完全按照描述進行操作,這可能是該行為的一個原因。
回答您的問題
為什麼更換C盤不足以重建一個完整的池?正如在 oracle 部落格和這裡所解釋的那樣,我期望我不必為 zfs 分離磁碟來正確重建池(為了維護方便,最好保留拔出磁碟的 zpool 狀態跟踪)
如上所示,您可以用另一個或本身替換池磁碟(備用將是空閒的並繼續作為備用),或者您可以分離池磁碟,而備用將永久承擔池磁碟的角色並且您必須手動添加另一個備用
zpool add poolname spare diskname
磁碟(可以是分離的磁碟或新磁碟)。為什麼 zpool 一直告訴我備用磁碟“忙”(實際上不是)?
我認為這是因為出色的 IO。這可以解釋為什麼只需要一點時間就可以完成操作。
見下文:如何自動取回備用磁碟?
- 啟用自動備用替換(Solaris/illumos 上的預設設置,Linux 上有點麻煩)
- 更換有故障的池磁碟
zpool replace
(而不是分離它)。僅在更換池磁碟並且您沒有自動管理(除了特定的池佈局和管理情況外,在我看來這沒有任何意義)時,備用磁碟才需要分離步驟。