尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
隨著雲計算業務的快速發展,國內外雲計算企業的專利之爭也愈發激烈。在雲計算這樣的技術領域,專利儲備往往代表著企業最新的技術實力。華雲數據本期「智匯華雲」專欄將針對「Ceph的正確玩法之SSD作為HDD的緩存池」技術,與大家共同分享雲計算領域的最新技術與解決方案。
該文章為本系列的第四篇文章,我們將在之後繼續推出本系列的其他文章,敬請關注!
本期講解人
二進制-程序猿
擅長操作系統、集群、OpenStack、網路、虛擬化等。在華雲CloudUltra產品技術中心架構組負責部署架構、部分非功能性指標、容量規劃、ci/cd等日常工作
一、緩存池原理
緩存分層特性也是在Ceph的Firefly版中正式發布的,這也是Ceph的Firefly版本中被談論最多的一個特性。緩存分層是在更快的磁盤(通常是SSD),上創建一個Ceph池。這個緩存池應放置在一個常規的復制池或erasure池的前端,這樣所有的客戶端I/O操作都首先由緩存池處理。之後,再將數據寫回到現有的數據池中。客戶端能夠在緩存池上享受高性能,而它們的數據顯而易見最終是被寫入到常規池中的。
一般來說,緩存層構建在昂貴/速度更快的SSD磁盤上,這樣才能為客戶提供更好的I/O性能。在緩存池後端通常是存儲層,它由復制或者erasure類型的HDD組成。在這種類型的設置中,客戶端將I/O請求提交到緩存池,不管它是一個讀或寫操作,它的請求都能夠立即獲得響應。速度更快的緩存層為客戶端請求提供服務。一段時間後,緩存層將所有數據寫回備用的存儲層,以便它可以緩存來自客戶端的新請求。在緩存層和存儲層之間的數據遷移都是自動觸發且對客戶端是透明的。緩存分層能以兩種模式進行配置。
writeback模式:當Ceph的緩存分層配置為writeback模式時,Ceph客戶端將數據寫到緩存層類型的池,也就是速度更快的池,因此能夠立即接收寫入確認。基於你為緩存層設置的flushing/evicting策略,數據將從緩存層遷移到存儲層,並最終由緩存分層代理將其從緩存層中刪除。處理來自客戶端的讀操作時,首先由緩存分層代理將數據從存儲層遷移到緩存層,然後再把它提供給客戶。直到數據變得不再活躍或成為冷數據,否則它將一直保留在緩存層中。
read-only模式:當Ceph的緩存分層配置為read-only模式時,它只適用於處理客戶端的讀操作。客戶端的寫操作不涉及緩存分層,所有的客戶端寫都在存儲層上完成。在處理來自客戶端的讀操作時,緩存分層代理將請求的數據從存儲層復制到緩存層。基於你為緩存層配置的策略,不活躍的對象將會從緩存層中刪除。這種方法非常適合多個客戶端需要讀取大量類似數據的場景。
緩存層是在速度更快的物理磁盤(通常是SSD)上做到的,它在使用HDD構建的速度較慢的常規池前部署一個快速的緩存層。在本節中,我們將創建兩個獨立的池(一個緩存池和一個常規),分別用作緩存層和存儲層。
網上找了一篇一篇牛人寫的存儲分層在OpenStack的一個應用,將ssd池做cinder、nova、glance的緩沖。
二、理論與實踐相結合
1、下面開始配置以cache作為sata-pool的前端高速緩沖池。
1)新建緩沖池,其中,cache作為sata-pool的前端高速緩沖池。
# ceph osd pool create storage 64
pool ‘storage’ created
# ceph osd pool create cache 64
pool ‘cache’ created
2)設定緩沖池讀寫策略為寫回模式。
ceph osd tier cache-mode cache writeback
3)把緩存層掛接到後端存儲池上
# ceph osd tier add storage cache
pool ‘cache’ is now (or already was) a tierof ‘storage’
4)將客戶端流量指向到緩存存儲池
# ceph osd tier set-overlay storage cache
overlay for ‘storage’ is now (or alreadywas) ‘cache’
2、調整Cache tier配置
1)設置緩存層hit_set_type使用bloom過濾器
# ceph osd pool set cache hit_set_typebloom
set pool 27 hit_set_type to bloom
命令格式如下:
ceph osd pool set {cachepool} {key} {value}
關於Bloom-Filte算法原理可參見:
https://blog.csdn.net/jiaomeng/article/details/1495500
2)設置hit_set_count、hit_set_period
# ceph osd pool set cache hit_set_count 1
set pool 27 hit_set_count to 1
# ceph osd pool set cache hit_set_period3600
set pool 27 hit_set_period to 3600
# ceph osd pool set cache target_max_bytes1000000000000
set pool 27 target_max_bytes to1000000000000
默認情況下緩沖池基於數據的修改時間來進行確定是否命中緩存,也可以設定熱度數hit_set_count和熱度周期hit_set_period,以及最大緩沖數據target_max_bytes。
hit_set_count 和 hit_set_period 選項分別定義了 HitSet 覆蓋的時間區間、以及保留多少個這樣的 HitSet,保留一段時間以來的訪問記錄,這樣 Ceph 就能判斷一客戶端在一段時間內訪問了某對象一次、還是多次(存活期與熱度)。
3)設置min_read_recency_for_promote、min_write_recency_for_promote
# ceph osd pool set cachemin_read_recency_for_promote 1
set pool 27 min_read_recency_for_promote to1
# ceph osd pool set cachemin_write_recency_for_promote 1
set pool 27 min_write_recency_for_promote to 1
緩存池容量控制
先講解個概念緩存池代理層兩大主要操作
·刷寫(flushing):負責把已經被修改的對象寫入到後端慢存儲,但是對象依然在緩沖池。
·驅逐(evicting):負責在緩沖池里銷毀那些沒有被修改的對象。
緩沖池代理層進行刷寫和驅逐的操作,主要和緩沖池本身的容量有關。在緩沖池里,如果被修改的數據達到一個閾值(容量百分比),緩沖池代理就開始把這些數據刷寫到後端慢存儲。當緩沖池里被修改的數據達到40%時,則觸發刷寫動作。
# ceph osd pool set cachecache_target_dirty_ratio 0.4
當被修改的數據達到一個確定的閾值(容量百分比),刷寫動作將會以高速運作。例如,當緩沖池里被修改數據達到60%時候,則高速刷寫。
# ceph osd pool set cachecache_target_dirty_high_ratio 0.6
緩沖池的代理將會觸發驅逐操作,目的是釋放緩沖區空間。例如,當緩沖池里的容量使用達到80%時候,則觸發驅逐操作。
# ceph osd pool set cachecache_target_full_ratio 0.8
除了上面提及基於緩沖池的百分比來判斷是否觸發刷寫和驅逐,還可以指定確定的數據對象數量或者確定的數據容量。對緩沖池設定最大的數據容量,來強制觸發刷寫和驅逐操作。
# ceph osd pool set cache target_max_bytes1073741824
同時,也可以對緩沖池設定最大的對象數量。在默認情況下,RBD的默認對象大小為4MB,1GB容量包含256個4MB的對象,則可以設定:
# ceph osd pool set cache target_max_objects 256
4)緩沖池的數據刷新問題在緩沖池里,對象有最短的刷寫周期。若被修改的對象在緩沖池里超過最短周期,將會被刷寫到慢存儲池。
# ceph osd pool set cachecache_min_flush_age 600
注意:單位是分鐘
設定對象最短的驅逐周期。
# ceph osd pool set cachecache_min_evict_age 1800
3、刪除緩存層
刪除readonly緩存
1)把緩存模式改為 none 即可禁用。
ceph osd tier cache-mode {cachepool} none
2)去除後端存儲池的緩存池。
ceph osd tier remove {storagepool}{cachepool}
刪除writeback緩存
1)把緩存模式改為 forward ,這樣新的和更改過的對象將直接刷回到後端存儲池
# ceph osd tier cache-mode cache forward–yes-i-really-mean-it
set cache-mode for pool ‘cache’ to forward
2)確保緩存池已刷回,可能要等數分鐘
# rados ls -p cache
可以通過以下命令進行手動刷回
# rados -p cache cache-flush-evict-all
3)取消流量指向緩存池
# ceph osd tier remove-overlay storage
there is now (or already was) no overlayfor ‘storage’
4)剝離緩存池
# ceph osd tier remove storage cache
pool ‘cache’ is now (or already was) not atier of ‘storage’