OpenStack使用Ceph的正確方式
使用ceph作為存儲(chǔ)的openstack,看到一篇非常非常有價(jià)值的文章,這篇文章整理了openstack結(jié)合ceph的最佳方式,包括了一些openstack使用ceph后的參數(shù)優(yōu)化,以及SSD OSD磁盤的使用方式建議,一些pool池的使用建議,解答了相當(dāng)一部分的疑惑。
Ceph和OpenStack是一個(gè)非常有用和非常受歡迎的組合。 不過,部署Ceph / OpenStack經(jīng)常會(huì)有一些容易避免的缺點(diǎn) - 我們將幫助你解決它們。
使用 show_image_direct_url and the Glance v2 API
使用ceph的RBD(RADOS Block Device),你可以創(chuàng)建克隆,你可以將克隆理解為可寫的快照(快照通常是只讀的)??寺≈粫?huì)為相對(duì)于父快照變化的部分創(chuàng)建對(duì)象,這意味著:
可以節(jié)省空間。這是顯而易見的,但是這并不能很有說服力,畢竟存儲(chǔ)是分布式系統(tǒng)當(dāng)中最便宜的部分
克隆中沒有修改的部分還是由原始卷提供。這很重要,因?yàn)楹苋菀酌邢嗤腞ADOS 對(duì)象,相同的osd,不論是用的哪個(gè)克隆。而且這意味著,這些對(duì)象是從OSD的頁(yè)面緩存進(jìn)行響應(yīng),換句話說,是RAM提供。RAM比任何存儲(chǔ)訪問方式速度都快,所以從內(nèi)存當(dāng)中提供大量的讀取是很好的。正因?yàn)檫@樣,從克隆的卷提供數(shù)據(jù)讀取,要比相同數(shù)據(jù)全拷貝的情況下速度要快一些
Cinder(當(dāng)從image創(chuàng)建一個(gè)卷)和Nova(從ceph提供臨時(shí)磁盤)都能夠使用ceph的后端的RBD image的克隆,并且是自動(dòng)的,但這個(gè)只有在glance-api.conf中設(shè)置了show_image_direct_url=true 才會(huì)使用,并且配置使用 Glance v2 API進(jìn)行連接Glance。
設(shè)置 libvirt/images_type = rbd on Nova compute nodes
在NOVA中(使用libvirt的KVM計(jì)算驅(qū)動(dòng)),有幾個(gè)存儲(chǔ)臨時(shí)鏡像的配置,不從Cinder卷啟動(dòng)的情況。你可以設(shè)置 nova?compute.conf 的[libvirt]當(dāng)中的images_type:
- [libvirt]
- images_type = <type>
默認(rèn)的類型是磁盤,這意味著你啟動(dòng)一個(gè)新的vm的時(shí)候,將會(huì)發(fā)生下面的事:
nova-compute在你的虛擬機(jī)管理節(jié)點(diǎn)上鏈接到Glance API,查找所需要的image,下載這個(gè)image到你的計(jì)算節(jié)點(diǎn),默認(rèn)在/var/lib/nova/instances/_base路徑下
然后會(huì)創(chuàng)建一個(gè)qcow2文件,使用下載的這個(gè)image做它的backing file
這個(gè)過程在計(jì)算節(jié)點(diǎn)上會(huì)占用大量的空間,并且會(huì)一旦這個(gè)鏡像沒有提前在計(jì)算節(jié)點(diǎn)上下載好,就會(huì)需要等很久才能啟動(dòng)虛擬機(jī),這也使得這樣的vm不可能實(shí)時(shí)的遷移到另外一臺(tái)主機(jī)而不產(chǎn)生宕機(jī)時(shí)間
將images_types設(shè)置為rbd后意味著disk是存儲(chǔ)在rbd的后端的,是原始鏡像的克隆,并且是立即創(chuàng)建的,沒有延時(shí)啟動(dòng),沒有浪費(fèi)空間,可以獲得所有克隆的好處,參考文檔
在Nova計(jì)算節(jié)點(diǎn)上啟用RBD緩存
librbd是支持Qemu / KVM RBD存儲(chǔ)驅(qū)動(dòng)程序的ceph的庫(kù),可以使用虛擬化主機(jī)的RAM進(jìn)行磁盤的緩存。你應(yīng)該使用這個(gè)。
是的,它是一個(gè)可以安全使用的緩存。 一方面,virtio-blk與Qemu RBD 驅(qū)動(dòng)程序的組合將正確地實(shí)現(xiàn)磁盤刷新。 也就是說,當(dāng)虛擬機(jī)中的應(yīng)用程序顯示“我現(xiàn)在想在磁盤上存儲(chǔ)此數(shù)據(jù)”時(shí),virtio-blk,Qemu和Ceph將一起工作,只有在寫入完成時(shí)才會(huì)報(bào)告
- 寫入主OSD
- 復(fù)制到可用的副本OSD
- 只是寫入所有的osd journal才會(huì)acknowledged
此外,Ceph RBD具有一個(gè)智能保護(hù):即使它被配置為write-back緩存,它也將拒絕這樣做(這意味著它將 write-through模式操作),直到它接收到用戶的第一次flush請(qǐng)求。 因此,如果你運(yùn)行一個(gè)永遠(yuǎn)不會(huì)這樣做的虛擬機(jī),因?yàn)樗诲e(cuò)誤配置或者它的客戶操作系統(tǒng)很老的,那么RBD將固執(zhí)地拒絕緩存任何寫入。 相應(yīng)的RBD選項(xiàng)稱為 rbd cache writethrough until flush,它默認(rèn)為true,你不應(yīng)該禁用它。
你可以通過修改nova-compute 配置文件的下面選項(xiàng)開啟writeback caching
- [libvirt]
- images_type = rbd
- ...
- disk_cachemodes="network=writeback"
你應(yīng)該這樣去做
為images, volumes, and ephemeral disks使用單獨(dú)的池
現(xiàn)在你已經(jīng)在Glance開啟了enabled show_image_direct_url=true,配置Cinder and nova-compute與Glance交互 的時(shí)候使用 v2 API, 配置 nova-compute使用 libvirt/images_type=rbd,所有的VMs和volumes都使用rbd克隆,克隆可以跨存儲(chǔ)進(jìn)行,意味著你可以創(chuàng)建RBD image(已經(jīng)快照)在一個(gè)存儲(chǔ)池,然后它的克隆在另外一個(gè)存儲(chǔ)池
你應(yīng)該這樣做,有幾個(gè)原因:
單獨(dú)的池意味著您可以分別控制對(duì)這些池的訪問。 這只是一個(gè)標(biāo)準(zhǔn)的緩解危險(xiǎn)方法:如果您的nova-compute節(jié)點(diǎn)被攻破,并且攻擊者可以損壞或刪除臨時(shí)磁盤,那么這是壞的 - 但如果他們也可能損壞您的Glance圖像那將會(huì)更糟。
單獨(dú)池也意味著您可以有不同的池設(shè)置,例如size或pg_num的設(shè)置。
最重要的是,單獨(dú)的池可以使用單獨(dú)的crush_ruleset設(shè)置。 下面我們會(huì)做介紹
通常有三個(gè)不同的池:一個(gè)用于Glance圖像(通常命名為glance或圖像),一個(gè)用于Cinder卷(cinder或卷),一個(gè)用于VM(nova-compute或vms)。
不需要使用SSD作為你的Ceph OSD journal
在這篇文章的建議中,這一個(gè)可能是最令人感覺到奇怪和不認(rèn)可的。 當(dāng)然,傳統(tǒng)的情況下都會(huì)認(rèn)為,你應(yīng)該總是把你的OSD journal在更快的設(shè)備上,并且你應(yīng)該以1:4到1:6的比例部署ssd和普通磁盤,對(duì)吧?
讓我們來看看。 假設(shè)你是按1:6的配比方法,你的SATA轉(zhuǎn)盤能夠以100 MB/s的速度寫。 6個(gè)OSD,每個(gè)OSD使用企業(yè)SSD分區(qū)上的分區(qū)作為。進(jìn)一步假設(shè)SSD能夠以500MB/s寫入。
恭喜你,在那種情況下,你剛剛使你的SSD成為瓶頸。雖然你的OSDs聚合帶寬支持600 MB / s,你的SSD限制你大約83%的性能。
在這種情況下,你實(shí)際上可以用1:4的比例,但使你的聚合帶寬只快了一點(diǎn)點(diǎn),SSD的沒有很大的優(yōu)勢(shì)
現(xiàn)在,當(dāng)然,考慮另一種選擇:如果你把你的journal放在OSD相同的設(shè)備上,那么你只能有效地使用一半的驅(qū)動(dòng)器的標(biāo)稱帶寬,平均來說,因?yàn)槟銓憙纱蔚酵辉O(shè)備。 所以這意味著沒有SSD,你的有效單個(gè)osd帶寬只有大約50 MB/s,所以你從6個(gè)驅(qū)動(dòng)器中得到的總帶寬更像是300 MB/s,對(duì)此,500MB/ s仍然是一個(gè)實(shí)質(zhì)性的改進(jìn)。
所以你需要將自己的配比匹配到上面的計(jì)算當(dāng)中,并對(duì)價(jià)格和性能進(jìn)行自己的評(píng)估。 只是不要認(rèn)為SSD journal將是萬靈藥,也許使用ssd算是一個(gè)好主意,關(guān)鍵在于比較
使用all-flash OSDs
有一件事要注意,你的SSD journal不會(huì)提高讀。 那么,怎樣利用SSD的提高讀取呢?
使用ssd做OSD。 也就是說,不是OSD journal,而是具有文件存儲(chǔ)和journal的OSD。 這樣的ssd的OSD不僅僅是寫入速度快,而且讀取也會(huì)快。
將 all-flash OSDs 放入獨(dú)立的CRUSH root
假設(shè)你不是在全閃存硬件上運(yùn)行,而是運(yùn)行一個(gè)經(jīng)濟(jì)高效的混合集群,其中一些OSD是普通的,而其他是SSD(或NVMe設(shè)備或其他),你顯然需要單獨(dú)處理這些OSD。 最簡(jiǎn)單和容易的方法就是,除了正常配置的默認(rèn)根之外再創(chuàng)建一個(gè)單獨(dú)的CRUSH根。
例如,您可以按如下所示設(shè)置CRUSH層次結(jié)構(gòu):
- ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
- -
- -1 4.85994 root default
- -2 1.61998 host elk
- 0 0.53999 osd.0 up 1.00000 1.00000
- 1 0.53999 osd.1 up 1.00000 1.00000
- 2 0.53999 osd.2 up 1.00000 1.00000
- -3 1.61998 host moose
- 3 0.53999 osd.3 up 1.00000 1.00000
- 4 0.53999 osd.4 up 1.00000 1.00000
- 5 0.53999 osd.5 up 1.00000 1.00000
- -4 1.61998 host reindeer
- 6 0.53999 osd.6 up 1.00000 1.00000
- 7 0.53999 osd.7 up 1.00000 1.00000
- 8 0.53999 osd.8 up 1.00000 1.00000
- -5 4.85994 root highperf
- -6 1.61998 host elk-ssd
- 9 0.53999 osd.9 up 1.00000 1.00000
- 10 0.53999 osd.10 up 1.00000 1.00000
- 11 0.53999 osd.11 up 1.00000 1.00000
- -7 1.61998 host moose-ssd
- 12 0.53999 osd.12 up 1.00000 1.00000
- 13 0.53999 osd.13 up 1.00000 1.00000
- 14 0.53999 osd.14 up 1.00000 1.00000
- -8 1.61998 host reindeer-ssd
- 15 0.53999 osd.15 up 1.00000 1.00000
- 16 0.53999 osd.16 up 1.00000 1.00000
- 17 0.53999 osd.17 up 1.00000 1.00000
在上面的示例中,OSDs 0-8分配到默認(rèn)根,而OSDs 9-17(我們的SSD)屬于根highperf。 我們現(xiàn)在可以創(chuàng)建兩個(gè)單獨(dú)的CRUSH rule:
- rule replicated_ruleset {
- ruleset 0
- type replicated
- min_size 1
- max_size 10
- step take default
- step chooseleaf firstn 0 type host
- step emit
- }
- rule highperf_ruleset {
- ruleset 1
- type replicated
- min_size 1
- max_size 10
- step take highperf
- step chooseleaf firstn 0 type host
- step emit
- }
默認(rèn)crush rule 是replicated_ruleset,從默認(rèn)根選擇OSD,而step take highperf在highperf_ruleset當(dāng)中意味著它只會(huì)選擇在highperf根的OSD。
為存儲(chǔ)池池指定all-flash rule
將單個(gè)池分配給新的CRUSH crule(并因此分配給不同的OSD集),使用一個(gè)命令:
- ceph osd pool set <name> crush_ruleset <number>
…其中是池的名稱,是您的CRUSH RULE的ID。 你可以在線執(zhí)行此操作,而客戶端正在訪問其數(shù)據(jù) - 當(dāng)然會(huì)有很多remapped和backfill,因此您的整體性能會(huì)受到一些影響。
現(xiàn)在,假設(shè)你的環(huán)境普通存儲(chǔ)比SSD存儲(chǔ)更多。 因此,您將需要為all-flash OSD選擇單獨(dú)的池。 這里有一些池可以先遷移到 all-flash。 您可以將以下列表解釋為優(yōu)先級(jí)列表:在向群集添加更多SSD容量時(shí),可以逐個(gè)將池移動(dòng)到全閃存存儲(chǔ)。
Nova ephemeral RBD池(vms,nova-compute)
radosgw bucket indexes .rgw.buckets.index and friends) - 如果你使用radosgw替換你OpenStack Swift
Cinder volume pools (cinder, volumes)
radosgw data pools (.rgw.buckets and friends) - 如果您需要在Swift存儲(chǔ)上進(jìn)行低延遲讀取和寫入
Glance image pools (glance, images)
Cinder backup pools (cinder-backup) - 通常是這是最后一個(gè)轉(zhuǎn)換為 all-flash 的池。
配置一些具有低延遲本地存儲(chǔ)的非Ceph計(jì)算主機(jī)
現(xiàn)在,毫無疑問,有一些應(yīng)用場(chǎng)景,Ceph不會(huì)產(chǎn)生你所需要的延遲。 也許任何基于網(wǎng)絡(luò)的存儲(chǔ)都無法滿足。 這只是存儲(chǔ)和網(wǎng)絡(luò)技術(shù)最近發(fā)展的直接結(jié)果。
就在幾年前,對(duì)塊設(shè)備的單扇區(qū)非緩存寫入的平均延遲大約為毫秒或1000微秒(μs)。 相比之下,在承載512字節(jié)(1扇區(qū))有效載荷的TCP分組上引起的延遲大約為50μs,這使得100μs的往返行程。 總而言之,從網(wǎng)絡(luò)寫入設(shè)備(而不是本地寫入)所產(chǎn)生的額外延遲約為10%。
在過渡期間,對(duì)于相同價(jià)格的器件的單扇區(qū)寫入本身約為100μs,頂級(jí)的,一些價(jià)格還是合理的設(shè)備下降到約40μs。 相比之下,網(wǎng)絡(luò)延遲并沒有改變那么多 - 從千兆以太網(wǎng)到10 GbE下降約20%。
因此,即使通過網(wǎng)絡(luò)訪問單個(gè)未復(fù)制的SSD設(shè)備,現(xiàn)在的延遲將為40 + 80 = 120μs,而本地僅為40μs。 這不是10%的開銷了,這是一個(gè)驚人的三倍
使用Ceph,這變得更糟。 Ceph多次寫入數(shù)據(jù),首先到主OSD,然后(并行)寫入所有副本。 因此,與40μs的單扇區(qū)寫操作相比,我們現(xiàn)在至少有兩次寫操作的延遲,再加上兩次網(wǎng)絡(luò)往返,即40×2 + 80×2 =240μs,是本地寫延遲的6倍
好消息是,大多數(shù)應(yīng)用程序不關(guān)心這種延遲開銷,因?yàn)樗鼈冄舆t不是關(guān)鍵的。 壞消息是,有些非常在意。
所以,你應(yīng)該放棄Ceph因?yàn)檫@樣嗎? 不。 但是請(qǐng)考慮添加一些未使用libvirt / images_type = rbd配置的計(jì)算節(jié)點(diǎn),而是使用本地磁盤映像。 將這些主機(jī)進(jìn)行主機(jī)聚合,并將它們映射到指定的flavor。 建議您的用戶,他們選擇這種flavor來跑低延遲的應(yīng)用程序。
























