為了測試新增 ZFS 日誌設備會對 ZFS 陣列產生什麼影響,我決定建立一個 zpool 並執行一些基準測試,然後插入 SSD 充當 ZIL。
不幸的是,每當我在創建 zpool 後插入 SSD,或在創建池後拔出 SSD(任何導致創建池後驅動器號發生更改的情況),然後重新啟動,我的池都會降級通過運行顯示sudo zpool status
pool: zpool1
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-4J
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zpool1 DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
sda ONLINE 0 0 0
1875547483567261808 UNAVAIL 0 0 0 was /dev/sdc1
我懷疑問題源於我使用驅動器號創建池的事實,如下所示:
sudo zpool create -f zpool1 mirror /dev/sdb /dev/sdc
問題
對我來說幸運的是,這只是一個測試,沒有丟失資料的風險,但如果在現實場景中發生這種情況,從這個問題中恢復的最佳方法是什麼?顯然驅動器仍然存在並且準備就緒。
有沒有更好的方法來建立 zpool 而不使用磁碟機號碼來/dev/sda
避免將來出現此問題?我注意到Ubuntu 文件指出以與我相同的方式建立 zpool。
額外資訊
- 作業系統:Ubuntu 16.04 伺服器 4.10
zfsutils-linux
從安裝套件安裝zfs
答案1
在獲得 Dexter_Kane 的幫助後1 級技術論壇,答案是/dev/disk/by-id/...
在創建池時使用路徑。
例如
sudo zpool create zpool1 mirror \
/dev/disk/by-id/ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N0PKS6S7 \
/dev/disk/by-id/ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N7VXZF6H
轉換和修復現有池
好消息是,您可以將現有的 ZFS RAID 陣列「轉換」為使用這些標籤,從而防止將來發生這種情況,如果這種情況已經發生在您身上,甚至可以解決降級的陣列。
sudo zpool export [pool name]
sudo zpool import -d /dev/disk/by-id [pool name]
您只需確保池資料集未在使用中即可。例如,不要在池內執行命令,並確保它們不會透過 NFS 等共享。
執行轉換後,輸出sudo zpool status
應類似:
pool: zpool1
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zpool1 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N0PKS6S7 ONLINE 0 0 0
ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N7VXZF6H ONLINE 0 0 0
已進行測試
我確保測試一下:
- 使用 by-id 路徑確實防止了問題的發生。
- 在池處於降級狀態時寫入一些資料後,在執行匯出/匯入後我仍然可以讀取所有文件,並且
sudo zpool status
沒有報告任何錯誤。