Ceph and OpenStack – Best Practices Part I

Ceph and OpenStack 現在已經是 IaaS 中成雙成對的一個組合。根據 2017 年 6-12 月的 OpenStack User Survey,在所有 OpenStack Deployment 中,有 57% 的部署使用的 Cinder backend 為 Ceph RBD。當然在使用 Ceph 作為 OpenStack Glance, Cinder 的 backend 會有一些能夠在設定上調整的最佳實踐。本篇文章將會介紹這些如何調整以及為什麼要進行這些設定。

在 Glance 中使用 show_image_direct_url

使用 Ceph RBD 時,預設會開啟 RBD Layering 這個功能,可以把它想像成一個可以讀寫 snapshot。這會建立一個原本 image 的 clone,而 Ceph 就只會建立跟原本 image 不同部分的 RADOS Objects。這代表了兩件事:

  1. 省空間 — 因為只會建立相對原本 image 有更改過的 RADOS Objects,當有多個 instance 的 volume 是基於這個 image 時,就能節省很多空間
  2. 在沒有被更改的部分,也就是原本的 image,會從最一開始的 volume 被讀取。這代表不管是從哪一個 clone,在讀取時都是讀取到同樣的 RADOS Objects,也就是同樣的 OSD。因刺這些 Objects 有很大的機會會是從 OSD 的 page cache 中讀取,也就是說從 RAM 讀取。RAM 比現今所有持久性儲存裝置都還快,也就是從 clone 提供資料會比從一個完整的副本 Volume 來得快。

Cinder 跟 Nova 預設都會利用 RBD Layering 的功能,但是會需要在 Glance 中的 glance-api.conf 設定 show_image_direct_url=true 並且使用 Glance v2 API。

在 Compute Node 上使用 RBD Cache

librbd,也就是 qemu/kvm 跟 RBD 儲存裝置溝通的 driver,可以利用主機的 RAM 作為 RBD 的 disk cache 使用

使用這種 cache 是安全的,virtio-blk 跟 Qemu RBD storage driver 會確保資料被正確的 flush。當 VM 中的應用程式告知說「我要這個檔案在 disk 上」時,Qemu 跟 Ceph 會在完成下列事項中才回報資料已經被寫入:

  • 寫入至主要的 OSD
  • 複製到其他的 OSD
  • 被告知已經被放置 OSD 的 persistant journal

Ceph 本身也有內建的防呆機制,就算 cache 被設成 write-back mode,Ceph 在收到 user 的第一個 flush request 之前都會以 write-through mode 運作。這個機制相對應的設定是 rbd cache writethrough until flush,預設是設為 true,永遠永遠不要嘗試關閉它。

要啟用 Ceph 的 cache 必須在 nova-compute 的 nova.conf 中設定

[libvirt]
...
images_type = rbd
disk_cachemodes="network=writeback"

讓 CInder, Glance, Nova 使用不同的 Pool

讓三個不同的 service 使用不同的 Ceph pool 有幾個原因:

  • 使用不同的 pool 代表可以對這些 pool 做不同的權限設定。這代表在如果很不幸的,你的 nova-compute 節點被入侵而入侵者可以破壞或刪除你的 nova disk。雖然聽起來很糟,但是如果他同時也能破壞你的 Glance image 的話,情況就會變得更糟了。
  • 使用不同的 pool 也代表可以對這些 pool 做不同的設定,例如 size 或是 pg_num 等設定。
  • 最重要的是,可以對 pool 套用不同的 crush_ruleset,例如可以讓 Cinder 使用高速的 SSD,Nova 使用 HDD,Glance 使用 Erasure Coded Pool。

有些能可能擔心在分開 pool 後 RBD layering 會無法作用,但是不用擔心,這些 clone 是可以跨 pool 做使用的。

所以在 OpenStack 部署中看到 3 個不同的 Ceph Pool 是一件非常常見是事情,一個給 Cinder,一個給 Glance,一個給 Nova。

使用 All-Flash OSD Pool

使用 SSD WAL 跟 DB 不會增加讀取速度。要利用 SSD 快速的讀取速度,就把它們獨立成 OSD 並且利用 crush_ruleset 設定 All-flash OSD Pool。在 Luminous 版本之後,Ceph 會自動偵測 device class,所以要創建 All-flash 的 crush rule 非常容易。

例如要創建一個 All-flash pool (faliure domain: host) 叫做 flash,用 command ceph osd crush rule create-replicated <rule-name> <root> <failure-domain-type> <device-class>

ceph osd crush rule create-replicated fast default host ssd

安裝 OpenStack and Ceph

要安裝 OpenStack 跟 Ceph 的教學可以參考之前寫過的文章:

續讀 Part II

Reference

The Dos and Don’ts for Ceph for OpenStack


Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.