OpenStack、Ceph RBD 和 QoS

shan

Havana 周期在 Cinder 和 Nova 中引入了一个 QoS 功能。快速了解这个优秀的实现。

最初,QEMU 和 KVM 都支持速率限制。这显然是通过 libvirt 实现的,并且作为 <disk> 部分中的一个额外的 xml 标志可用,称为 iotune

QoS 选项是

  • total_bytes_sec:客户机每秒允许的总带宽
  • read_bytes_sec:顺序读取限制
  • write_bytes_sec:顺序写入限制
  • total_iops_sec:客户机每秒允许的总 IOPS
  • read_iops_sec:随机读取限制
  • write_iops_sec:随机写入限制

OpenStack 在 Nova 和 Cinder 中都实现了这样一个(简单?)功能,这真是太好了。这也表明 OpenStack 正在现有核心项目中变得更加丰富和完善。拥有这样的设施对于几个原因来说都非常有用。首先,并非所有存储后端都支持 QoS。例如,Ceph 根本没有内置的 QoS 功能。此外,限制直接在 hypervisor 层进行,您的存储解决方案甚至不需要具有这样的功能。另一个好处是,从运营商的角度来看,能够提供不同等级的服务非常好。运营商现在可以根据一定的 QoS 提供不同类型的卷,然后,客户将根据此付费。

II. 测试一下!

首先在 Cinder 中创建 QoS

1
2
3
4
5
6
7
8
9
$ cinder qos-create high-iops consumer="front-end" read_iops_sec=2000 write_iops_sec=1000
+----------+---------------------------------------------------------+
| Property |                       Value                             |
+----------+---------------------------------------------------------+
| consumer |                     front-end                           |
|    id    |        c38d72f8-f4a4-4999-8acd-a17f34b040cb             |
|   name   |                high-iops                                |
|  specs   | {u'write_iops_sec': u'1000', u'read_iops_sec': u'2000'} |
+----------+---------------------------------------------------------+

创建一个新的卷类型

1
2
3
4
5
6
$ cinder type-create high-iops
+--------------------------------------+-----------+
|                  ID                  | Name      |
+--------------------------------------+-----------+
| 9c746ca5-eff8-40fe-9a96-1cdef7173bd0 | high-iops |
+--------------------------------------+-----------+

然后将卷类型与 QoS 关联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ cinder qos-associate c38d72f8-f4a4-4999-8acd-a17f34b040cb 9c746ca5-eff8-40fe-9a96-1cdef7173bd0

$ cinder create --display-name slow --volume-type slow 1
+---------------------+--------------------------------------+
|       Property      |                Value                 |
+---------------------+--------------------------------------+
|     attachments     |                  []                  |
|  availability_zone  |                 nova                 |
|       bootable      |                false                 |
|      created_at     |      2013-12-02T12:59:33.177875      |
| display_description |                 None                 |
|     display_name    |                 high-iop             |
|          id         | 743549c1-c7a3-4e86-8e99-b51df4cf7cdc |
|       metadata      |                  {}                  |
|         size        |                  1                   |
|     snapshot_id     |                 None                 |
|     source_volid    |                 None                 |
|        status       |               creating               |
|     volume_type     |                 high-iop             |
+---------------------+--------------------------------------+

最终将卷附加到实例

1
2
3
4
5
6
7
8
9
$ nova volume-attach cirrOS 743549c1-c7a3-4e86-8e99-b51df4cf7cdc /dev/vdc
+----------+--------------------------------------+
| Property | Value                                |
+----------+--------------------------------------+
| device   | /dev/vdc                             |
| serverId | 7fff1d37-efc4-46b9-8681-3e6b1086c453 |
| id       | 743549c1-c7a3-4e86-8e99-b51df4cf7cdc |
| volumeId | 743549c1-c7a3-4e86-8e99-b51df4cf7cdc |
+----------+--------------------------------------+

预期结果

在附加设备时,您应该在 nova-volume 调试日志中看到以下 xml 创建。转储 virsh xml 也可以。

2013-12-11 14:12:05.874 DEBUG nova.virt.libvirt.config [req-232cf5eb-a79b-42d5-a183-2f4758e8d8eb admin admin] Generated XML <disk type="network" device="disk">
  <driver name="qemu" type="raw" cache="none"/>
  <source protocol="rbd" name="volumes/volume-743549c1-c7a3-4e86-8e99-b51df4cf7cdc">
    <host name="192.168.251.100" port="6790"/>
  </source>
  <auth username="volumes">
    <secret type="ceph" uuid="95c98032-ad65-5db8-f5d3-5bd09cd563ef"/>
  </auth>
  <target bus="virtio" dev="vdc"/>
  <serial>2e589abc-a008-4433-89ae-1bb142b139e3</serial>
  <iotune>
    <read_iops_sec>2000</read_iops_sec>
    <write_iops_sec>1000</write_iops_sec>
  </iotune>
</disk>

W 重要提示:Havana 中的速率限制目前已损坏,但是 bug 已经报告,并且 修复已提交/接受。相同的补丁也已经作为 潜在的 Havana 回移植 提出。