Ceph and OpenStack – Best Practices Part II

上個禮拜介紹了 Ceph and OpenStack – Best Practices Part I,而這次要接續之前的建議再多介紹幾個 Ceph 跟 OpenStack 整合的最佳實踐。額外使用這些設定可以更加的整合 OpenStack and Ceph。

使用 RAW Image

在前一篇 Ceph and OpenStack – Best Practices Part I 中介紹了 RBD 本身有 layering 的功能,不過這個功能是有些限制的。上傳到 OpenStack 的 Image 必須是 RAW 格式才會利用到 RBD layering。所以會建議所有上傳上去的 image 都先轉成 RAW 格式。透過 qemu-img 指令可以很容易的轉換各種格式:

qemu-img  convert image.qcow2 image.raw

之後將 RAW 格式的 image 上傳至 OpenStack,就會使用 RBD layering 的功能了。

設定 image 讓 VM 使用 Virtio-SCSI

不論是 ephemeral 硬碟或是 Volumes,RBD backend 的 Nova VM 預設是使用 Virtio-blk driver 來讓 guest 存取 RBD image。這個時候,VirtIO 會提供一個 paravirtual I/O bus,而裝置會被命名成 /dev/vda, /dev/vdb 以此類推。VirtIO block device 雖然輕量並且有效率,但是卻不支援 discard 指令。

不能使用 discard 代表 guest 沒辦法在 mount 硬碟時用 discard 這個選項,也就是代表系統沒辦法透過 fstrim 去清掉已經 free 掉的 block。這會造成使用一些安全性上的問題,因為實際上使用者的要刪除的資料是不會被刪除或是 overwrite 掉的。除了安全性上的問題,這同時也會造成維運方的問題。

不支援 discard 同時也會造成 RBD image 的 RADOS objects 在這個 image 的整個生命週期內都不會被刪除 — 它會一直存在,直到整個 image 被刪除掉。所以 Ceph cluster 內可能會有數以萬計的 RADOS object 存在,但是永遠不會被使用。

所幸的是,另一個 VirtIO disk driver 支援 discard 指令,也就是 VirtIO SCSI controller, virtio-scsi。

在 OpenStack 上面要啟用 VirtIO SCSI controller 需要對 glance 的 image properties 做一些設定,需要設定 hw_scsi_model 跟 hw_disk_bus。可以很輕鬆地透過 OpenStack CLI 指令設定:

openstack image set 
  --property hw_scsi_model=virtio-scsi 
  --property hw_disk_bus=scsi 
  <image 的名稱或 ID>

或是如果有多個 Image,可以透過簡單的 script:

for i in $(openstack image list | awk '{print $2}' | sed "s/ID//g");
do
    openstack image  set --property hw_scsi_model=virtio-scsi --property hw_disk_bus=scsi \
        --property hw_qemu_guest_agent=yes --property os_require_quiesce=yes $i
done

這時候如果透過這個 image 去創建一個 instance,你會發現原本看到的 /dev/vdX 裝置名稱會變成 /dev/sdX,也會獲得 SCSI stack 的所有資料。例如,會有 /proc/scsi/scsi,可以獲得 SCSI bus 跟 controller 的資訊,透過 lssci 知道 LU 等。

不只 boot volume 會透過 SCSI controller 去提供給 instance,在之後所有 attach 上去的 volumes 也會同樣的會使用 SCSI controller。所以這些 volume 同樣也可以利用 discard 來進行 free block 的清理。

透過 Cinder multi-backend 跟 Volume Type 區分 Ceph Pool

在同時有兩個 Ceph Pool,一個 All flash、一個 HDD 的時候,我們會需要用 Cinder multi-backend 跟 Volume Type 來區別兩個 Ceph pool。這時需要在 cinder.conf 中更改 volume backend 的設定:

[DEFAULT]
enabled_backends=rbd-hdd,rbd-ssd
scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler
default_volume_type = hdd

[rbd-hdd]
rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_user=cinder
backend_host=rbd:volumes
rbd_pool=volumes
volume_backend_name=rbd-hdd
volume_driver=cinder.volume.drivers.rbd.RBDDriver
rbd_secret_uuid = {{ cinder_rbd_secret_uuid }}

[rbd-ssd]
rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_user=cinder
backend_host=rbd:volumes
rbd_pool=volumes-ssd
volume_backend_name=rbd-ssd
volume_driver=cinder.volume.drivers.rbd.RBDDriver
rbd_secret_uuid = {{ cinder_rbd_secret_uuid }}

上面的設定我們啟用了兩個 Cinder backend,rbd-ssdrbd-hddrbd-ssd 會使用 Ceph 的 volumes-ssd 這個 pool,而 rbd-hdd 使用 volumes 這個 pool。除此之外也要設定 Cinder 的 scheduler driver,跟預設會選擇的 volume type。

最後需要透過 OpenStack CLI 建立相對應的 volume type 給不同的 backend:

openstack --os-username admin --os-tenant-name admin volume type create ssd
openstack --os-username admin --os-tenant-name admin volume type set ssd \
  --property volume_backend_name=rbd-ssd
openstack --os-username admin --os-tenant-name admin volume type create hdd
openstack --os-username admin --os-tenant-name admin volume type set hdd \
  --property volume_backend_name=rbd-hdd

之後就可以在創建 Volume 的時候指定 volume type 來利用對應的 Ceph pool 了。

利用 Cinder Volume Types 做 QoS

Volume types 通常被用來區分不同 Cinder backend,例如:讓使用者可以選擇用 Ceph RBD 還是 NetApp 來生成 Volume。但是除此之外維運人員也可以利用這個功能在同一個 backend 上設定不同的 QoS profile。Cinder QoS 可以去限制像是 Volume 的最大 IOPS 或是最大 throughput,同樣也是利用 OpenStack CLI 便可以設定,也可以透過 Horizon Dashboard 設定。

如果要限制循序讀寫速度 150MB/s 跟隨機讀寫速度 1000 IOPS:

openstack volume qos create \
  --consumer front-end \
  --property total_bytes_sec=$((100<<20)) \
  --property total_iops_sec=1500 \
  "volume_qos"

然後會需要設定一個對應的 volume type,並且套用 QoS spec:

openstack volume type create --public "volume_qos"
openstack volume qos associate "volume_qos" "volume_qos"

最後可以將 Volume type 設成 public,或是限定只有特定 project 可以存取。

Part I

Reference


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