Ceph 緩衝池配置

緩衝池原理

緩衝(Cache,爲便於讀者理解,本文直接使用 Cache)技術是爲了協調吞吐速度相差較大的設備之間數據傳送而採用的技術。

傳統上,Cache 爲了緩和 CPU 和 IO 設備速度不匹配的矛盾,提高 CPU 和 IO 設備的並行性而存在的,在現代操作系統中,幾乎所有的 IO 設備在與 CPU 交換數據時都用了 Cache。所以,在計算機組成裏,每個部件的設計都可以看到 Cache 的影子。 例如,CPU 的 L1 Cache、L2 Cache 和 L3 Cache,甚至還有 L4 Cache(IBM Power8)。文件系統會設計頁面緩存(Page Cache),而硬盤內部也會設計易失性緩存,一般容量爲 16/32/64MB。

既然提及 Cache,也需要說明一下緩衝(英文 Buffer,同理,本文直接使用 Buffer)。爲了讓大家區分 Cache 和 Buffer 概念,我們仔細分析一下。Cache 的設計原理是把讀取過的數據保存起來,如果在以後的操作中重新讀取時則命中(找到需要的數據),就不要去讀較慢的設備,若沒有命中就讀較慢的設備。Cache 的目標是把頻繁讀取的數據進行組織,並把這些內容放在最容易找到的位置,而把不再讀的內容不斷往後排,直至從 Cache 中刪除。實際上,讀者會想到,Cache 就是優先存放 “熱數據”,其性能指標是 “命中率”。

Buffer 的設計原理是把分散的寫數據內容集中進行,按照一定週期寫到目標設備。典型的應用場景是磁盤寫,通過 Buffer 機制,寫數據時候減少磁盤碎片和硬盤的反覆尋道過程,從而提高系統的性能。

我們可以暫且認爲 Cache 是針對讀優化,而 Buffer 是針對寫優化。

在本地計算機結構組成裏,相比 CPU 和內存之間的 IO 差距,內存和機械硬盤的 IO 差距較爲明顯。而固態硬盤的出現,無論 IOPS 和帶寬都勝過機械硬盤,同時內存和固態硬盤的 IO 差距較機械硬盤小。比較內存、固態硬盤和機械硬盤的每 GB 單位成本,得出的結果是內存 > 固態硬盤 > 機械硬盤。在這個成本和技術的前提下,有不少工程師提出:能否通過固態硬盤作爲機械式硬盤 Cache/Buffer 實現數據緩存策略呢? 目前有較多的開源和商業存儲領域軟件和硬件提供這種分級緩存 / 緩衝機制。例如,在軟件方面有 ZFS、LVM、Bcache、Flashcache、Enhanceio 和 Intel CAS;在硬件方面,Intel 公司和 LSI 推出新形態的 RAID 陣列卡,這類陣列卡配備板載的 SSD 作爲加速,外部通過 minSAS 連接外部硬盤。

上面介紹了緩衝技術的基礎知識及背景,下面我們來介紹 Ceph 中緩衝技術的基本實現原理。

數據都是以 object 形式存放在 Ceph 中,這些 object 數據都是存儲在資源池中(即 pool),而組成 pool 的基本單位是 OSD,因此充當 OSD 的存儲介質的性能決定了整個資源池的最終性能。存儲介質性能的差異,造成了資源池性能的最終差異性,因此使用 SSD 固態硬盤這一類的高速且價格昂貴的存儲介質組成高性能資源池,使用 SATA 機械硬盤這一類低速廉價的介質組成低速高容量資源池,Ceph 爲此提出了緩衝池技術,比較完美地平衡了性能和成本的關係。要實現緩衝池技術,首先需要將整個存儲系統按照存儲介質的性能分爲前端高速緩衝池和後端低速存儲池,使用特定算法將數據寫入和讀取流程進行適當的調整,將訪問次數比較頻繁的熱數據緩存儲在前端高速緩衝池中(對應熱數據上浮),而訪問量比較低的冷數據則存儲在後端低速存儲池中(冷數據下沉),從而實現提高讀寫性能的目的,如圖所示。介紹了基本的緩衝資源池原理之後,還需要向讀者介紹 Ceph 中提供的兩種不同類型的緩衝資源池策略模式。

1)寫回模式:

當用戶配置了寫回模式,所有來自客戶端的寫入請求都會在抵達前端高速緩衝池後收到 ACK 確認,之後由高速緩衝池按照一定的策略將數據寫入後端低速存儲池,完成數據的最終寫入。在這個模式下,前端高速緩衝池充當整個寫入操作的前端緩存。當客戶端需要讀取數據時,讀取請求先到達高速緩衝池,之後高速緩衝池從低速存儲池中加載相應數據,加載完畢再由高速緩衝池返回客戶端所需的數據。當客戶端請求相同的數據,則直接由高速緩衝池返回之前已經加載的數據,如果數據長時間沒有被訪問,則會從高速緩存池清除。這個模式比較適合數據經常發生變更,又需要經常被訪問的情況。

2)讀取轉發模式:

這個模式下讀寫操作都在前端高速緩衝池進行,如果客戶端需要讀取的數據不在高速緩衝池中,則讀取請求會被轉發到後端。這個模式一般用於高速緩衝池容量已經被耗盡,而又無法做擴容的情況。

緩衝池部署

自從 0.80 版本開始,Ceph 加入緩衝池技術。在當前固態硬盤每 IOPS 性價比佔優,而機械硬盤每 GB 容量更具性價比,根據業務系統數據讀寫的局部性,可以通過緩衝池技術把 SSD 存儲池作爲 HDD 存儲池的前端高速緩衝池。

緩衝池的建立與管理

假設我們通過 ceph-deploy 工具部署一個標準的 Ceph 集羣,默認所有 OSD 在 CRUSH 裏都是 Default Rule。本次實驗,我們需要自定義 Rule,對 Pool 指定使用某個 Rule,即 Pool 上承載的數據均落到該 Rule 的硬盤上。因此,我們需要定義 SATA Rule 和 SSD Rule。

定義 SATA Rule,可以使用當前已經存在的 OSD。而定義 SSD Rule 之前,需要爲每個 OSD 服務器節點添加 SSD。按照之前添加 OSD 的方法,把 “SSD”OSD 添加到 Default Rule。然後基於 “SSD”OSD 創建 SSD Rule,然後根據這個 Rule 創建 SSD Pool。這樣就具備 SATA Pool 和 SSD Pool。實驗只是邏輯示意,若考慮性能請選取 SSD 構建 SSD Pool。

下面開始配置以 ssd-pool 作爲 sata-pool 的前端高速緩衝池。

1)新建緩衝池,其中,ssd-pool 作爲 sata-pool 的前端高速緩衝池。

ceph osd tier add sata-pool ssd-pool

2)設定緩衝池讀寫策略爲寫回模式。

ceph osd tier cache-mode ssd-pool writeback

3)將客戶端訪問從 sata-pool 切換到 ssd-pool。

ceph osd tier set-overlay sata-pool ssd-pool

緩衝池的參數配置

關於緩衝池的參數配置,遵循以下格式:

ceph osd pool set {cachepool} {key} {value}

(1)使用布隆過濾器以快速查找目標數據 Ceph 在生產環境中會使用布隆過濾器(Bloom-Filter,1970 年由 Bloom 中提出。它可以用於檢索一個元素是否在一個集合中)實現在緩衝池中快速查找目標數據。

注意 Bloom Filter 是由 Bloom 在 1970 年提出的一種多 Hash 函數映射的快速查找算法。通常應用在一些需要快速判斷某個元素是否屬於集合,但是並不嚴格要求 100% 正確的場合。

設置緩衝池使用布隆過濾器

ceph osd pool set ssd-pool hit_set_type bloom

默認情況下緩衝池基於數據的修改時間來進行確定是否命中緩存,也可以設定熱度數 hit_set_count 和熱度週期 hit_set_period,以及最大緩衝數據 target_max_bytes。

ceph osd pool set ssd-pool hit_set_count 1
ceph osd pool set ssd-pool hit_set_period 3600
ceph osd pool set ssd-pool target_max_bytes 1073741824

(2)緩衝池容量的控制 在講解緩衝池大小的問題之前,先來看看緩衝池的代理層的兩大主要操作。

❑刷寫(flushing):負責把已經被修改的對象寫入到後端慢存儲,但是對象依然在緩衝池。

❑驅逐(evicting):負責在緩衝池裏銷燬那些沒有被修改的對象。

緩衝池代理層進行刷寫和驅逐的操作,主要和緩衝池本身的容量有關。在緩衝池裏,如果被修改的數據達到一個閾值(容量百分比),緩衝池代理就開始把這些數據刷寫到後端慢存儲。例如,當緩衝池裏被修改的數據達到 40% 時,則觸發刷寫動作。

ceph osd pool set ssd-pool cache_target_dirty_ratio 0.4

當被修改的數據達到一個確定的閾值(容量百分比),刷寫動作將會以高速運作。例如,當緩衝池裏被修改數據達到 60% 時候,則高速刷寫。

ceph osd pool set ssd-pool cache_target_dirty_high_ratio 0.6

當緩衝區的使用率達到一個確定的閾值(容量百分比),緩衝池的代理將會觸發驅逐操作,目的是釋放緩衝區空間。例如,當緩衝池裏的容量使用達到 80% 時候,則觸發驅逐操作。

ceph osd pool set ssd-pool cache_target_full_ratio 0.8

除了上面提及基於緩衝池的百分比來判斷是否觸發刷寫和驅逐,還可以指定確定的數據對象數量或者確定的數據容量。 例如,對緩衝池設定最大的數據容量,來強制觸發刷寫和驅逐操作。

ceph osd pool set ssd-pool target_max_bytes 1073741824

上述數值單位爲字節,1073 741824 B = 1 GB。 同時,也可以對緩衝池設定最大的對象數量。在默認情況下,RBD 的默認對象大小爲 4MB,1GB 容量包含 256 個 4MB 的對象,則可以設定:

ceph osd pool set ssd-pool target_max_objects 256

在 RBD 創建鏡像時候,可以指定每個對象的大小。而在文件存儲和對象存儲,每個對象的大小也不一樣,所以 target_max_objects 的數值需要根據業務場景進行設置。

注意,如果 target_max_bytes 和 target_max_objects 都設定了,會以 “最近達到閾值” 的機制觸發刷寫和驅逐動作。

(3)緩衝池的數據刷新問題 在緩衝池裏,對象有最短的刷寫週期。若被修改的對象在緩衝池裏超過最短週期,將會被刷寫到慢存儲池。例如,設定最短刷寫週期爲 10 分鐘。

ceph osd pool set ssd-pool cache_min_flush_age 600

同時,也可以設定對象最短的驅逐週期。例如,設定最短驅逐週期爲 30 分鐘。

ceph osd pool set ssd-pool cache_min_evict_age 1800

緩衝池的關閉

1)刪除緩衝池。 刪除一個只讀緩衝池。因爲只讀緩衝池沒有包含修改的數據內容,所以可以直接關閉並移除。2)改變緩衝池讀寫模式爲 none,即關閉緩衝池。

ceph osd tier cache-mode ssd-pool none

3)移除緩衝池。

ceph osd tier remove sata-pool ssd-pool

刪除一個讀寫緩衝池。因爲讀寫緩衝池包含修改的數據內容,爲了不丟失數據,應進行如下操作。1)把緩衝池讀寫模式變爲 forward,目的是讓修改過的數據刷寫到慢存儲。

ceph osd tier cache-mode ssd-pool forward

2)等待數分鐘,確保 ssd-pool 的修改數據刷寫到慢存儲。

rados -p ssd-pool ls

3)如果 ssd-pool 仍然存在數據,可以強制刷寫和驅逐。

rados -p ssd-pool cache-flush-evict-all

4)卸載慢存儲的緩衝池。

ceph osd tier remove-overlay sata-pool

5)刪除慢存儲的緩衝池。

ceph osd tier remove sata-pool ssd-pool

至此,完成整個緩衝池的刪除操作,讀者根據實際情況選擇是否刪除對應的 ssd-pool。 本節介紹了緩衝池技術的基本原理和基礎操作,需要注意的是:目前緩衝池技術在一些應用場景下還存在性能和穩定性問題,特別是 Ceph 官方強烈建議不要在 RBD 塊存儲一類對讀寫操作頻繁且性能要求也比較高的場景下使用緩衝池技術,只建議在 RGW 對象存儲之類場景下使用該技術。

公衆號:運維開發故事

github:https://github.com/orgs/sunsharing-note/dashboard

博客**:https://www.devopstory.cn**

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/RIs32p3N0ZPnzJrw4A7nKA