Debian

zfs - 熱備用、替換、分離:資源正忙

  • March 21, 2017

我對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 的池)


所以這是我的問題:

  1. 為什麼更換C盤不足以重建一個完整的池?正如在 oracle 部落格這裡所解釋的那樣,我期望我不必為 zfs 分離磁碟來正確重建池(為了維護方便,最好保留拔出磁碟的 zpool 狀態跟踪)
  2. 為什麼 zpool 一直告訴我備用磁碟“忙”(實際上不是)?
  3. 見下文:如何自動取回備用磁碟?

**編輯:**問題 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(而不是分離它)。僅在更換池磁碟並且您沒有自動管理(除了特定的池佈局和管理情況外,在我看來這沒有任何意義)時,備用磁碟才需要分離步驟。

引用自:https://serverfault.com/questions/838880