前言

由於手賤多買了一台伺服器,現在家裡一共有三台 Server 在跑,於是決定將三台組成 Ceph,提供更彈性的磁碟使用方法和更高的容錯備援。

安裝

系統規劃如下:

  • 三台都是 Proxmox VE
  • 使用 cephadm 而不是 PVE 內建的 ceph
  • 有兩台必須用 USB 開機引導至 SSD,有一台則可以原生 SSD 開機
    • 舊一點的機器不支援 PCIe / NVMe 開機
    • 兩台機器都有 Internal USB Port,我猜就是拿來這樣用的

轉移流程:

  • 將原先兩台 PVE 的 CT 和 VM 備份到兩顆硬碟中
  • 關機、整線、上新機器
  • 補 RAM、插 10G 網卡、補 SSD、插網路線
    • 因為只有三台,所以決定買有雙口的 10G 網卡組成環。
  • 補硬碟
  • 刷 HBA
    • 將原本只有 RAID 模式的 RAID 卡刷成 HBA 模式
  • 裝系統
  • 處理引導
  • 裝 cephadm
  • 將硬碟加入 ceph
  • 蓋 Pool
  • 還原 ct 和 vm
  • 將還原用的硬碟 Wipe 掉以加入 ceph
  • 等重新平衡完成

systemd-boot

裝系統處理引導 這兩個步驟時,我們卡了好幾個小時 –

因為要使 Proxmox 能用 USB 開機,我們得使用 systemd-boot 的引導方式。

而 systemd-boot 不喜歡 lvm – 這會使得傳統的 ext4 安裝 PVE 無法使用 systemd-boot,就算將引導安裝好了,開機的時候他也會找不到 pool 因此無法開機。

解決方法是安裝在一個 Single Disk 的 ZFS(RAID0) 上。

詳細的安裝流程我有寫在 gist 上,有興趣的同學可以參閱。

NAS

目的

由於原先 NAS 是安裝在 VM 裡的 Xpenology,硬碟部分是直接通了一個 10T 的 Block,在轉移到 Ceph 的 RBD 上時花了相當多的時間。

確認資料都還在之後,就一直在考慮要不要把裡面的資料轉到 rgw 或是 CephFS 上之類的再掛進 NAS,這樣以後要重裝或是資料轉移的時候就不用處理整個 Block Device,應該會省事很多。

希望不受影響的功能

  • Download Station
    • RSS 下載
      • 會自動幫我載 BT,然後放進指定的資料夾裡面
  • Cloud Sync
    • 會自動幫我把資料 1:1 複製到 Cloud 上
  • SMB
    • 區網要用
  • NFS

方案

方案 1

首選的方案規劃是:

  • Ceph 蓋一個 NAS CephFS
  • NFS Export
  • NAS 掛 NFS
  • 將資料轉移至 NFS 上

不過在實作這個方案時遇到了一些問題:

1. Ceph 只支援 NFSv4.1+ 的 Export

DSM 只支援掛載 NFSv3 和 NFSv4,並不支援 NFSv4.1。
雖然嘗試過更改型號、系統升級、手動使用 mount 指令等等,不過都無功而返,掛不起來。

另外,也嘗試過令 Ceph 強迫 export NFSv3,確實掛的起來,不過寫入一陣子 NFS Server 就會死掉,非常不穩定。

2. NFS 的 Mount 並不支援 inotify 類的通知,因此 Cloud Sync 有高機率無法使用

由於通過網路掛載的磁碟系統寫入等的不一定會通過 kernel,因此 inotify 並不可靠,可以預想到 Cloud Sync 會無法使用。

因此此方案無法使用。

方案 2

方案 2 的規劃:

  • Ceph 蓋一個 NAS CephFS
  • 在 Proxmox VE 上 Mount 起來
  • 使用 VirtFS (p9 folder sharing via VirtIO) 將 Folder share 給 DSM
  • 在 DSM 內掛起來
  • 將資料轉移至 Folder 上

不過在實作這個方案時也遇到了一些問題:

1. 在 DSM 內 p9 的 mount 有些問題

在確認過 DSM 有 p9 需要的相關 Kernel Module 後 (因為 vDSM 有需要,所以他們有內建)便開始實施這個計畫。
雖然成功將 Folder share 給 DSM 了,不過在 Mount 之後發現 Folder 有很奇怪的現象發生:

  • 在 DSM 內可以看到 Folder 被 Mount 了,不過無法 ls,會出現 no such device or address 的錯誤。
  • 也無法讀取檔案內容 (cat),或是寫入檔案內容 echo > file
  • touchmkdir 等指令也會出錯
    • 不過可以在 host 確認確實有這個檔案/資料夾被新增,只是沒有內容。
  • 但可以確認到在檔案被建立後,在 DSM 內 ls -d file 是可以確認到檔案的存在的

懷疑過是 CephFS 本身的鍋,因此改掛 NFS 並同樣 Share 給 VM,問題依舊。
也懷疑過是 Share 的 permission 問題,因此嘗試了 passthroughmappednone 等各種屬性,結果還是一樣。

這個問題試了一兩天都無法解決,因此此方案無法實現,否則這個方案應該是蠻漂亮的,可惜了。

方案 3

方案 3 的規劃:

  • 棄用 DSM,改用 NextCloud
  • NextCloud 用 External Storage 掛 S3
    • Ceph 蓋一個 rgw export 給 NextCloud
  • 將資料轉移到 NextCloud 上

原先的服務:

  • Download Station
    • 改用 NCDownloader (Aria2 + yt-dlp)
    • RSS 下載使用 FlexGet 實現
  • Cloud Sync
    • 似乎無法達成
    • 有想過在一個 VM 內掛 s3fs 並使用 inotify 之類的監聽,rclone 到 remote
      • 不過老問題,這種遠端掛載的 fs 都不支援 inotify,何況 s3fs 並不是完整的檔案系統。
  • SMB
    • 蓋一個 Samba VM,掛 s3fs 後 export
    • 或是直接用 Nextcloud App
  • NFS
    • 由 Ceph Export

這個方案除了 Cloud Sync 不能用以外,應該還算堪用,因此我有先將一個 Nextcloud 架起來。

不過目前資料還沒搬上去,還在猶豫中,因為 Cloud Sync 不能用了真的很傷。

方案 4

方案 4 的規劃:

  • 繼續用 DSM
  • Download Station 的 Temp 用同一個 Block Device 太笨了
    • Replica 3/2,寫入放大會很嚴重
    • 改建 EC(k=2, m=1) 的 CephFS,用作 Download Station 的 Temp Dir

目前已經實裝完成,沒有甚麼大麻煩,不過問題還是沒解決,只舒緩了一點寫入放大的副作用而已。

目前還是希望有更好的方案出現,方案 3 有點笨。

一些失敗的方向

DSM 掛 s3fs

不行,s3fs-fuse 裝不起來。

DSM 掛 NFSv4.1

不知道問題出在哪,因為他有 NFSv4.1 的 Server ,不知道為什麼 NFS Client 沒有支援。

DSM 跑的是一個精簡的 debian,但我找不到問題在哪,也不敢亂裝東西。

不想嘗試的方向

rclone 掛 s3fs

感覺太不穩了

希望能找到解決 9p mount 的方法,不過上網查了很久沒有看到有人有相關的錯誤,一點頭緒都沒有。

有空的話應該會另外開一台 VM 來試到底是 export 有問題還是 DSM 的 mount 有問題。

後記

這篇文章本來沒打算打那麼長的,但一不小心就打了三千六百字,應該是第一篇分享那麼長的系統建置文章,好累。