前言
這篇文章解決了什么問(wèn)題:
系統(tǒng)的開(kāi)始使用一個(gè) ceph 集群构订。
整體介紹:
本文將系統(tǒng)的介紹如何使用一個(gè) ceph 集群冕茅。
涉及:crush、osd店茶、pool蜕便、cache
環(huán)境
ceph 版本:nautilus
ceph-deploy 版本:2.0.1
正文
在基本使用需求下,一般需要存儲(chǔ)集群提供高性能存儲(chǔ)(SSD)和普通存儲(chǔ)(hdd)贩幻。
在 ceph 中轿腺,具體表現(xiàn)為某些池使用高性能存儲(chǔ),某些池使用普通存儲(chǔ)丛楚。而這種需求在 ceph 中由 crush 規(guī)則實(shí)現(xiàn)族壳。
ceph 提供了緩存的概念。在普通的存儲(chǔ)池之上架設(shè)一層高性能的緩存池趣些,外部訪問(wèn)首先到達(dá)緩存池仿荆,如果發(fā)生未命中等情況再去訪問(wèn)存儲(chǔ)池。這里需要提一點(diǎn)坏平,并不是任何情況都需要緩存拢操。
針對(duì)不同的場(chǎng)景,ceph 的使用方式多種多樣舶替,這里的介紹只能一切從簡(jiǎn)令境,但是會(huì)盡量全面。
一個(gè)標(biāo)準(zhǔn)的場(chǎng)景:一個(gè)存儲(chǔ)池加一個(gè)緩存池顾瞪,存儲(chǔ)池使用普通設(shè)備舔庶,緩存池使用高性能設(shè)備。
構(gòu)建一個(gè)帶緩存的存儲(chǔ)池
首先添加一塊高性能硬盤(pán)(我這里是虛擬環(huán)境陈醒,只能用普通硬盤(pán)充數(shù))
然后需要利用 crush 讓不同池使用不同的存儲(chǔ)設(shè)備
向集群添加兩塊高性能硬盤(pán)
這里只能拿普通的虛擬硬盤(pán)來(lái)做測(cè)試惕橙。
在 ceph02 虛擬機(jī)上增加一塊 30G 的虛擬硬盤(pán)。
在 ceph03 虛擬機(jī)上增加一塊 30G 的虛擬硬盤(pán)钉跷。
現(xiàn)在到部署節(jié)點(diǎn)進(jìn)行操作:
ceph-deploy osd create --data /dev/sdd ceph02
ceph-deploy osd create --data /dev/sdd ceph03
如圖 ceph02 出現(xiàn)了 osd.6弥鹦,ceph03 出現(xiàn)了 osd.7。
這里涉及到 root (根)的概念尘应,在文章末尾【擴(kuò)展】中會(huì)介紹惶凝。這里可以直接先使用。
將 osd.6 osd.7 加入名稱(chēng)為 cache 的根中(根名稱(chēng)會(huì)自動(dòng)創(chuàng)建犬钢,注意苍鲜,由于默認(rèn)情況下 osd 在啟動(dòng)時(shí)讀取的是 hostname,因此該方法只是臨時(shí)生效玷犹,在文章末尾【擴(kuò)展】中會(huì)介紹永久生效辦法)
# 權(quán)重為 1.0
ceph osd crush set 6 1.0 root=cache host=ceph02-cache
ceph osd crush set 7 1.0 root=cache host=ceph03-cache
“高性能”存儲(chǔ)盤(pán)現(xiàn)在已經(jīng)有了混滔,并且將其置于 cache 根下,這么做的意義在下一步中有體現(xiàn)。
現(xiàn)在可以進(jìn)行下一步了坯屿。
crush 使用
當(dāng)前環(huán)境下已經(jīng)有一個(gè)默認(rèn)的 crush 規(guī)則油湖。
# 查看 crush 規(guī)則列表:
ceph osd crush rule ls
# 列出 crush 規(guī)則詳情:
ceph osd crush rule dump
具體屬性解釋參考:
https://docs.ceph.com/docs/mimic/rados/operations/crush-map-edits/#crush-map-rules
如上圖劃線處,當(dāng)前規(guī)則只會(huì)使用 default 根的 osd领跛。
前面創(chuàng)建高性能設(shè)備時(shí)乏德,將其設(shè)置根為 cache。我們現(xiàn)在就可以創(chuàng)建一個(gè)只使用 cache 根中的 osd 的規(guī)則吠昭,從而實(shí)現(xiàn)緩存池和存儲(chǔ)池使用不同的設(shè)備喊括。
創(chuàng)建緩存池使用的規(guī)則:
ceph osd crush rule create-replicated replicated_cache cache host
其中:
replicated_cache 指該規(guī)則的名字。
cache 指該規(guī)則使用的根矢棚。
host 指故障域級(jí)別郑什。
再次查看所有規(guī)則:
ceph osd crush rule dump
現(xiàn)在我們有了一個(gè)只使用高性能存儲(chǔ)設(shè)備的規(guī)則了。接下來(lái)就可以開(kāi)始創(chuàng)建使用不同規(guī)則的池了蒲肋。
創(chuàng)建存儲(chǔ)池
創(chuàng)建存儲(chǔ)池:
# 創(chuàng)建存儲(chǔ)池 pg 為 80蘑拯,規(guī)則指定為 replicated_rule
ceph osd pool create test_storage 80 replicated_rule
# 初始化這個(gè)池為 rgw 使用的池
ceph osd pool application enable test_storage rgw
查看池:
ceph osd lspools
查看該池的規(guī)則:
ceph osd pool get test_storage crush_rule
存儲(chǔ)池至此已經(jīng)好了。
創(chuàng)建緩存池
緩存池在 ceph 中常以 hot 標(biāo)識(shí)兜粘。
普通存儲(chǔ)池在 ceph 中常以 cold 標(biāo)識(shí)申窘。
緩存有多種形式(官方文檔列出以下幾種,實(shí)際更多):
- writeback :回寫(xiě)模式孔轴,這是 ceph 中最常用的一種模式偶洋。寫(xiě)入操作到達(dá)緩存盤(pán)時(shí)立即返回,隨后異步的將緩存盤(pán)中的內(nèi)容同步到存儲(chǔ)盤(pán)中距糖,過(guò)一段時(shí)間這條數(shù)據(jù)會(huì)自動(dòng)的從緩存池中清除。當(dāng)讀取數(shù)據(jù)時(shí)牵寺,緩存代理首先將數(shù)據(jù)從存儲(chǔ)池復(fù)制到緩存池中悍引,然后返回給客戶(hù)端,下一次直接從緩存池中讀取該條數(shù)據(jù)帽氓,同樣的趣斤,這條數(shù)據(jù)在一段時(shí)間內(nèi)沒(méi)被再次讀取會(huì)從緩存池中清除掉。
- readproxy :讀代理模式黎休,只會(huì)使用在緩存中已存在的對(duì)象浓领,常用于禁用 writeback 模式時(shí)的一個(gè)過(guò)渡階段。
- readonly :只讀模式势腮,讀取對(duì)象時(shí)首先讀取緩存池联贩,如果不存在再去訪問(wèn)存儲(chǔ)池。該模式常用于對(duì)一致性要求不高的環(huán)境捎拯,因?yàn)樗⑿戮彺娉刂械膶?duì)象有一定的滯后性泪幌。
- none :無(wú),指禁用緩存。
緩存參考:
https://docs.ceph.com/docs/master/rados/operations/cache-tiering/
創(chuàng)建緩存池
# 創(chuàng)建緩存池 pg 為 80祸泪,規(guī)則指定為 replicated_cache
ceph osd pool create test_cache 80 replicated_cache
# 目前用于緩存的主機(jī)只有2臺(tái)吗浩,所以將緩存池的副本數(shù)調(diào)為2
ceph osd pool set test_cache size 2
ceph osd pool set test_cache min_size 2
# 初始化這個(gè)池為 rgw 使用的池
ceph osd pool application enable test_cache rgw
緩存池創(chuàng)建好以后,要將這個(gè)緩存池與對(duì)應(yīng)存儲(chǔ)池聯(lián)系起來(lái)没隘。這個(gè)聯(lián)系的概念叫做 cache tiering懂扼,可以稱(chēng)之為緩存層,緩存代理右蒲。
參考:
https://docs.ceph.com/docs/master/rados/operations/cache-tiering/
- 創(chuàng)建緩存代理
ceph osd tier add test_storage test_cache
- 設(shè)置緩存模式
ceph osd tier cache-mode test_cache writeback
- 重定向流量到緩存池
ceph osd tier set-overlay test_storage test_cache
- 簡(jiǎn)單配置緩存池(基礎(chǔ)使用不具體介紹)
# 以下兩條命令配置緩存池的絕對(duì)大小
# 這兩條配置十分重要阀湿,影響 crush 什么時(shí)候清洗數(shù)據(jù)
# 一條配置緩存池的空間大小,一條配置緩存池的對(duì)象數(shù)量品嚣。
# 當(dāng)擁有多個(gè)緩存池時(shí)炕倘,注意緩存池的總大小不能超過(guò)物理大小。緩存池也有副本的概念翰撑。
ceph osd pool set test_cache target_max_bytes 26843545600
ceph osd pool set test_cache target_max_objects 1000000
ceph osd pool set test_cache hit_set_type bloom
ceph osd pool set test_cache hit_set_count 12
ceph osd pool set test_cache hit_set_period 14400
ceph osd pool set test_cache cache_target_dirty_ratio 0.4
ceph osd pool set test_cache cache_target_dirty_high_ratio 0.6
ceph osd pool set test_cache cache_target_full_ratio 0.8
ceph osd pool set test_cache cache_min_flush_age 600
ceph osd pool set test_cache cache_min_evict_age 1800
測(cè)試緩存
對(duì)于 test_storage 池罩旋,我們有一個(gè)只讀的緩存池了。只要我們讀取 test_storage 中的某個(gè)對(duì)象眶诈,這個(gè)對(duì)象就應(yīng)該自動(dòng)的置于緩存池中一段時(shí)間涨醋。
- 上傳對(duì)象到緩存池(不再贅述,在部署文檔中有寫(xiě))
echo 1234 > /tmp/testfile.txt
rados put obj1 /tmp/testfile.txt --pool=test_cache
- 查看存儲(chǔ)池
rados ls -p test_storage
可以發(fā)現(xiàn)逝撬,將對(duì)象上傳回寫(xiě)模式的緩存池浴骂,存儲(chǔ)池中也出現(xiàn)了對(duì)應(yīng)的數(shù)據(jù)。
擴(kuò)展
關(guān)于權(quán)重
osd 的大小可能不相同宪潮,因此其上的數(shù)據(jù)量也不應(yīng)該相同溯警,因此引入權(quán)重來(lái)影響數(shù)據(jù)分布。
比如100G的 osd 權(quán)重為1狡相,則200G的 osd 權(quán)重就應(yīng)設(shè)置為2梯轻。
關(guān)于 osd 存儲(chǔ)結(jié)構(gòu)
ceph osd tree
命令可以看到存儲(chǔ)結(jié)構(gòu)【∽兀可以結(jié)合自己機(jī)器執(zhí)行的結(jié)果往下閱讀喳挑。
一張官方圖:
這是描述 ceph 存儲(chǔ)結(jié)構(gòu)的一張圖。
首先這是一個(gè)樹(shù)形結(jié)構(gòu)滔悉。
其中最上層的 root default :root 是根的意思伊诵,default 就是這個(gè)根的名字。
中間 host foo:host 是主機(jī)的意思回官,foo 就是這個(gè)主機(jī)的名字曹宴。這里的主機(jī)名僅僅是個(gè)別稱(chēng),不代表實(shí)際的主機(jī)孙乖,可以隨意更改浙炼。
最下面的就是葉子節(jié)點(diǎn)了份氧,具體指向 osd。
劃分這三層結(jié)構(gòu)的意義(不完全):
- 影響數(shù)據(jù)的分布弯屈,比如故障域的概念蜗帜,讓數(shù)據(jù)分布在不同的 osd 上,或者讓數(shù)據(jù)分布在不同的 host 上资厉,或者讓數(shù)據(jù)分布在不同的 root 上厅缺。(一般故障域級(jí)別為 host)
- 影響 pool 的數(shù)據(jù)分布,pool 可以指定在哪個(gè) root 上宴偿。根據(jù)這個(gè)特性湘捎,可能讓緩存池使用高性能設(shè)備,普通池使用普通設(shè)備窄刘。
關(guān)于添加 osd
本文使用 ceph-deploy 添加 osd 時(shí)窥妇,并沒(méi)有直接將其設(shè)置到最終根下,后續(xù)還需要手動(dòng)配置娩践。這么操作是不合理的活翩,暫時(shí)未找到 ceph-deploy 指定根的參數(shù)。
關(guān)于緩存
當(dāng)前文章配置的緩存池是2副本的翻伺。
某些時(shí)候材泄,緩存數(shù)據(jù)是允許丟失的,比如只讀的緩存吨岭。這種緩存池單副本即可拉宗,但是經(jīng)測(cè)試,單副本池在 ceph 中似乎困難重重辣辫。
關(guān)于 osd 在重啟后 hostname 重置的解決方案
1. 當(dāng)一個(gè)機(jī)器中的 osd 的 host 名稱(chēng)都為同一個(gè):
可以通過(guò)修改該機(jī)器的 hostname 旦事,一勞永逸
2. 當(dāng)一個(gè)機(jī)器中的 osd 的 host 名稱(chēng)不相同:
這個(gè)時(shí)候,當(dāng)機(jī)器重啟后急灭,該機(jī)器的所有 osd 的 host 名稱(chēng)都一樣了族檬,導(dǎo)致 osd tree 混亂。這個(gè)時(shí)候可以在 ceph.conf 中具體配置某塊盤(pán)的信息化戳。
當(dāng)前環(huán)境配置參考:
- 編寫(xiě)配置
去部署節(jié)點(diǎn)上:
cd /opt/ceph-deploy
vim ceph.conf
增加如下內(nèi)容:
[osd.6]
host = ceph02-cache
[osd.7]
host = ceph03-cache
- 同步配置
ceph-deploy --overwrite-conf admin ceph01 ceph02 ceph03
重啟后,一切正常埋凯。
通用解決方案
在 osd 的啟動(dòng)上做文章点楼。
比如,配置 osd 的啟動(dòng)方式白对,容器化 osd掠廓,容器會(huì)記住某些信息,因此可以實(shí)現(xiàn)永久生效 hostname甩恼。
常見(jiàn)問(wèn)題
1. 創(chuàng)建池時(shí)提示 pg 數(shù)過(guò)多
osd 上的 pg 數(shù)量會(huì)對(duì)整體集群性能造成影響蟀瞧,并不是越多越好沉颂,也不是越少越好。
由于池有副本的概念悦污,因此產(chǎn)生了如下的計(jì)算方式:
池的 pg 數(shù) * 該池副本數(shù) = 該池使用的 pg 數(shù)
官方建議每個(gè) osd 上的 pg 數(shù)為 100铸屉。實(shí)際測(cè)試每個(gè) osd 上的 pg 數(shù)到達(dá) 250 時(shí)開(kāi)始告警,因此該集群的總 pg 數(shù)不應(yīng)超過(guò):
總 pg 數(shù) = 總 osd 數(shù)量 * 250
因此出現(xiàn)此問(wèn)題的原因:
所有池的 pg 數(shù)加起來(lái)超過(guò)了設(shè)定的 總 pg 數(shù) 切端。但集群依然可正常使用彻坛,因此只是一個(gè)警告。
解決該問(wèn)題的手段:
- 增加總 pg 數(shù):一般通過(guò)加 osd 的方式踏枣。(盡量不要試圖去修改閾值昌屉,除非你知道結(jié)果是什么)
- 削減當(dāng)前集群使用的 pg 數(shù):降低池的副本數(shù)(不要降到單副本),降低池的 pg 數(shù)(不建議)茵瀑。
2. 單副本间驮,導(dǎo)致 pg 狀態(tài) unknown
目前個(gè)人經(jīng)驗(yàn)來(lái)說(shuō),不要使用單副本马昨。
參考
crush 規(guī)則參考:
https://docs.ceph.com/docs/master/rados/operations/crush-map/