
Ceph 儲存糾刪碼常見問題 (FAQ)
最近有客戶詢問多項問題,包括 Ceph 儲存如何運用糾刪碼(Erasure Code)來保護資料、在硬體故障時如何避免資料毀損、資料復原所需時間、如何選擇 K+M 參數,以及部署 Ceph 所需的最少伺服器數量。我們相信,對傳統儲存系統較為熟悉的 IT 專業人員,會對這類新一代軟體定義儲存的特性特別感興趣。本文將與大家分享客戶常見的幾個問題。
Ceph 在發生磁碟故障後,需要多久才能完成復原?
從儲存設備故障中復原資料所需的時間,取決於以下條件 :
- 資料復原所需時間與硬碟容量無關,而是與該磁碟上已存放的資料量成正比。Ceph 只需還原受損的資料;受損資料越少,修復越快。Ceph 不會像 RAID 控制器那樣重建整顆硬碟。
- Ceph 會將資料修復到叢集中的健康磁碟上。叢集內的磁碟與主機越多,復原就越快。
- 可透過軟體參數調整復原速度。設定的復原速度越高,復原就越快。但加速復原會占用更多 CPU 與網路硬體資源。
- CPU 效能與網路頻寬也會影響復原速度。
- 副本池 (Replicated Pool) 的復原速度會比糾刪碼池 (Erasure Code Pool) 更快。
- 通常,系統管理員可以降低復原速度,以減少伺服器資源的使用。
參考復原時間:
- NVMe SSD 可能需要幾個小時。
- HDD 可能需要約一天的時間。
如何選擇糾刪碼 (Erasure Code) 的 K 與 M 參數?
糾刪碼如何運作
Ceph 的糾刪碼 (Erasure Code) 參數 K 與 M,涉及可用容量效率以及對硬體故障的冗餘能力。K 代表資料區塊 (data chunks) 的數量,M 代表編碼區塊 (coding chunks) 的數量。當用戶端將資料物件寫入 Ceph 儲存叢集時,該資料物件會被切成 K 個等大小的資料區塊。Ceph 會以這些資料區塊為基礎,產生 M 個編碼區塊;當硬體發生故障時,這些編碼區塊可用來計算並還原遺失的資料區塊。資料區塊與編碼區塊會依照 K+M 設定分散儲存在指定的故障域 (failure domain) 中。可容許遺失的資料區塊上限,為 M 個故障域。可用的故障域取決於實體基礎設施中儲存伺服器的配置方式。對小型 Ceph 叢集而言,故障可能發生在磁碟或伺服器主機層級;而在較大型的叢集,故障域則可能擴大至機架 (server racks) 、機房 (server rooms) 甚至資料中心等。當用戶端讀取資料時,系統會由這些資料區塊重建原始資料物件。
儲存效能
相較於 Ceph 的資料複寫演算法,糾刪碼通常具有更好的可用空間效率。由於糾刪碼在完成資料 I/O 時需要進行更多磁碟 I/O 操作,對於 IOPS 需求高的工作負載較不友善。K 與 M 的總和 (K+M) 越大,所消耗的磁碟 IOPS 資源就越多。當採用較大的 K、較小的 M 時,在 Ceph 叢集網路上傳輸的資料位元組總量會減少,這有助於提升大型資料物件的 I/O 吞吐量效能。
儲存空間效率
糾刪碼儲存池的可用空間效率 = K/(K+M)。例如 K=4、M=2 的糾刪碼儲存池,空間效率為 4/6 = 66.7%。在相同硬體冗餘等級下,這種效率是 3 副本 (replica 3) 儲存池的兩倍;而 3
副本儲存池則能提供更高的 IOPS
效能。
考量到可用空間效率,合理的 K 值應大於 M 值。在糾刪碼配置中,K 與 M 的差值 (K-M) 越大,其空間效率就越好。
伺服器主機數量
K+M 的總和也決定了叢集所需的主機數量或更大的故障域數量。
- 標準的糾刪碼儲存池至少需要 K+M 台伺服器主機,才能有效地分散儲存所有糾刪碼區塊 (EC chunks) 。
- 進階的糾刪碼設定允許在單一故障域內儲存多個 EC 區塊,藉此降低分散 EC 區塊所需的伺服器數量。
糾刪碼 K 與 M 參數的影響總結 :
- M 決定可容忍的故障域數量。
- K+M 越大,會降低用戶端對小型資料物件的 IOPS 效能,但可提升對大型資料物件的吞吐量。
- 儲存空間效率 = K/(K+M)
- 所需的最少伺服器數量。
使用糾刪碼 (Erasure Code) 儲存池,至少需要幾台 Ceph OSD 主機?
實踐 Ceph 儲存的最佳方法,是將儲存池的故障域設定為大於「主機 (host) 」的層級。使用主機作為故障域的資料池,會指示 Ceph 將資料區塊分散寫入到不同的主機,以確保當一台主機故障時,資料可以從其他健康主機上的區塊中復原。使用者也可以將故障域配置為「磁碟 (disk drive) 」,此作法著重於防護磁碟層級的故障,類似傳統磁碟陣列。
以下是使用糾刪碼儲存池的最低主機數量建議。
最佳配置 : 伺服器數量 ≧ K + M +1
- 這種配置使 Ceph 能夠將每個糾刪碼區塊 (EC chunk) 分散到 K+M 台主機上。
- 當其中一台主機故障時,仍有足夠的主機可用來還原遺失的區塊。
次佳配置 : 伺服器數量 = K + M
- 這種配置允許每個糾刪碼區塊 (EC chunk) 分散到 K+M 台主機上。
- 當一台主機故障時,您將沒有其他備用主機來復原遺失的糾刪碼區塊。因此,必須立即修復故障主機,以儘快使系統恢復到健康狀態。
預算有限的配置 : 伺服器數量 ≧ (K + M) / M
這種配置會指示 Ceph 將多個糾刪碼區塊分散儲存到指定數量的主機上。當一台主機故障時,一個物件最多將會遺失 M 個區塊。
這種配置允許
- 單一主機中,任何數量的硬碟都可能同時發生故障。
- 或者,叢集最多可承受一台主機故障。
- 或者,在 M 台主機中,每台主機同時最多只能有一顆磁碟故障。
以 K+M = 4+2 為例,所需的最少主機數量是 6/2 = 3。在這種配置下,您只能容許一台主機故障,因為叢集中將沒有足夠的健康主機來復原遺失的區塊。
如何計算 Ceph 叢集的可用容量?
Ceph 中的可用空間,取決於幾個重要的因素。
1. 由多台伺服器組成的 Ceph 叢集,其最大原始容量 (Raw Capacity) 等於各伺服器磁碟空間的總和。
如果叢集包含多種類型的儲存設備 (如 HDD、SSD 或 NVMe) ,您應該分別計算每種設備類型的原始磁碟空間總量。Ceph 能夠辨識每個儲存池所使用的指定設備類別 (device class) 。
2. 每個 Ceph 儲存池所套用的資料保護機制,決定了它的可用空間。
- 副本保護 (Replicated protection) : 可用空間 = 原始容量 / 副本數
- 糾刪碼資料保護 (Erasure Code data protection) : 可用空間 = 原始容量 × (K / (K + M))
3. Ceph 在中繼資料與系統作業上會有額外開銷。這些開銷所佔用的空間約為總容量的 10% ~ 20%,具體取決於您的配置與使用情況。所有硬碟空間在所有的副本池與糾刪碼池之間是共享的。。
所有硬碟空間在所有的副本池與糾刪碼池之間是共享的。
- 儲存池可以選擇設定或不設定配額。所有配額皆採 精簡配置 (thin provisioning) ,不會預先保留實體空間。
- 由於 Ceph 的可用空間採用精簡配置 (Thin Provisioning) ,儲存空間只在有資料寫入時才會被分配,而非預先配置所有所需空間。這項特性有助於提高儲存利用率並降低儲存成本。
- 建議在運作期間,預留總容量的 1/n 作為資料復原空間,以應對硬體故障,其中 n 為伺服器的數量。
- 系統預設了使用率警告,分別為85% 的接近滿載 (near-full) 與 95% 的滿載 (full) 。