Deploy Ceph cache tier & erasure code
Tags: Storage, Ceph

Deploy Ceph cache tier & erasure code 黃馨平 Follow Jul 10 · 7 min read

本篇文章主要紀錄的是如何應用 cache tier 與 erasure code 在 Cephfs 當中。

本篇文章將會分 4 個部分撰寫：

1. 建立 cache pool，撰寫 crush map rule 將 SSD 與 HDD 分開。

2. 將 cephfs pool 建立 ，並使用 erasure code 與 HDD rule.

3. 將 cache tier 與 cephfs pool 合併。

4. 刪除 cache tier 與 cephfs 。

Step 1.

撰寫 crush map 將 SSD 與 HDD 分開

Check SDD 與 HDD 的 OSD.ID 編號

ceph osd tree | grep hdd

ceph osd tree | grep ssd

先將 crush map decode

ceph osd getcrushmap -o crushmapdump

crushtool -d crushmapdump -o crushmapdump-decompiled

vim crushmapdump-decompiled 開始撰寫 rule。

第一步區分 SSD block 跟 HDD block

第二步撰寫 tier 所需要的 rule。

Crush map 都寫完以後 encode 然後 set 到 system 中.

crushtool -c crushmapdump-decompiled -o crushmapdump-compiled

ceph osd setcrushmap -i crushmapdump-compiled

第三步建立 cache-pool

# create cache-pool

ceph osd pool create cache-pool 32 32 # 將 cache-pool set 成剛剛定義的 crush_rule ssd-pool rule

ceph osd pool set cache-pool crush_rule ssd-pool

Step 2.

將 cephfs pool 建立 ，並使用 erasure code 與 HDD rule.

# 建立 cold storage 的 pool，若不需要 erasure 可以刪除，但在 crush map 也需要更改。

ceph osd pool create cephfs_data 1024 1024 erasure # 將 cephfs_data set 成剛剛定義的 crush_rule sata-pool rule

ceph osd pool set cephfs_data crush_rule sata-pool

Step 3.

將 cache tier 與 cephfs pool 合併。

# 將兩個 pool 合併，cephfs_data 為 cold storage，cache-pool 為 hot storage。

ceph osd tier add cephfs_data cache-pool # 設定 cache-pool 的模式為 writeback 模式(其實還有readonly 但不推)。

ceph osd tier cache-mode cache-pool writeback # 設定 overlay，讓所有資料都會透過 cache-tier 的方法使用。

ceph osd tier set-overlay cephfs_data cache-pool

因為本篇應用的方法是使用 cephfs 所以接著建立 cephfs。

# cephfs 還是需要 metadata 的 pool(雖然用不到)

ceph osd pool create cephfs_metadata 1024 1024 # 建立 cephfs 取名為 cephfs

ceph fs new cephfs --force cephfs_metadata cephfs_data

完成 !!

有興趣的可以玩一下，當中也有很多 cache-tier 調優的方法。

ceph osd pool set cache-pool hit_set_type bloom

ceph osd pool set cache-pool hit_set_count 1

ceph osd pool set cache-pool hit_set_period 3000

ceph osd pool set cache-pool target_max_bytes 161061273600

ceph osd pool set cache-pool target_max_objects 1000000

ceph osd pool set cache-pool cache_min_flush_age 600

ceph osd pool set cache-pool cache_min_evict_age 1800

ceph osd pool set cache-pool cache_target_dirty_ratio .6

ceph osd pool set cache-pool cache_target_dirty_high_ratio .7

ceph osd pool set cache-pool cache_target_full_ratio .8

另外小 tips 可以透過指令觀察 cache tier 的變化。

watch -n1 ceph df

Step 4.

刪除 cache-tier 與 cephfs。

在做這個步驟時必須十分警慎，不然處理起來會複雜很多，自己實測按照下面的步驟可以減少很多冤枉路。

# Check cache-pool 中有沒有 dirty object

ceph df detail # 如果有 dirty object 請使用，若沒有可忽略，會花一段時間。

rados -p cache-pool cache-flush-evict-all # 將 writeback 模式先設定成 readproxy，再改成 none 模式，它無法像 readonly 一樣可以直接改成 none 模式。

# ceph osd tier cache-mod cache-pool forward(研究中)

ceph osd tier cache-mode cache-pool readproxy

ceph osd tier cache-mode cache-pool none # 將 cache-pool 從 tier 中移除

ceph osd tier remove-overlay cache-pool

刪除 cephfs ，因為個人實測無法直接在 tier 刪除 cephfs_data pool 必須先移除 cephfs 才能解除 cache-tier 的相依性。

# 關閉 mds

systemctl stop ceph-mds@ceph-007 # 關閉 cephfs

ceph fs fail cephfs # 刪除 cephfs

ceph fs rm cephfs --yes-i-really-mean-it

移除 cache tier 的 cold-storage 以及 cache tier

ceph osd tier remove-overlay cephfs_data

ceph osd tier remove cephfs_data cache-pool

結束了 !!

現在大家都回復自由之身了， cold storge pool 的內容都還保存，沒有問題。

大致上就結束了，有任何問題歡迎討論。

參考資料 :