2014年6月24日 星期二

OpenStack Cinder 使用磁碟的概念

在 OpenStack 中,關於儲存的服務有 Cinder(Block Storage)以及 Swift(Object Storage)
其中 Cinder 在定位上強調的是永久並且快速的儲存空間
同時 Cinder 也在運算單元產生虛擬機器時,負責提供虛擬機器所需要的實體空間。

在安裝 Cinder 時,可以看到官方文件 [1] 中將 Cinder 分為 Block Storage service controller 以及 Block Storage service node 兩種
其中 service controller 需要安裝 cinder-api 以及 cinder-scheduler、service node 則安裝 cinder-volume。
以下節錄文件 [1] 中關於 cinder-api、cinder-scheduler 以及 cinder-volume 的描述:
The Block Storage service enables management of volumes, volume snapshots, and volume types. It includes the following components:
  • cinder-api: Accepts API requests and routes them to cinder-volume for action.
  • cinder-volume: Responds to requests to read from and write to the Block Storage database to maintain state, interacting with other processes (like cinder-scheduler) through a message queue and directly upon block storage providing hardware or software. It can interact with a variety of storage providers through a driver architecture.
  • cinder-scheduler daemon: Like the nova-scheduler, picks the optimal block storage provider node on which to create the volume.
也就是說,service controller 的責任大概就是決定哪些儲存空間要被路由到哪一台 service node,然後實際執行儲存的就是那些 service node。

在安裝 Cinder 時,過程中會發現 Cinder 的 service node 需要安裝 lvm2 這個套件,並且設定檔中會有 volume group 需要設定。
在這裡其實 Cinder 的運作原理可能就能看出端倪了。

LVM 的相關觀念以及基本的使用方法可以參考 [2]。簡單來說就是動態管理磁碟分區的套件。
在 Cinder 中是直接利用 LVM 來做儲存空間的運用
也就是當透過 API 操作 Cinder 產生一個 volume 時,Cinder 會透過 service controller 決定要把空間放在某一個 service node
接著就在那個 service node 上面動態切割出一個能夠滿足要求的 logical volume。
從這點來看,大概就能想像為何 Cinder 的定位是永久且快速,因為 Cinder 產生的空間是實際在某個硬碟上切割出對應的磁區。

舉例來說,我現在測試的機器上,透過 vgdisplay 顯示的 volume group 狀態如下:
--- Volume group ---
  VG Name               vg-ubuntu
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  9
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               297.16 GiB
  PE Size               4.00 MiB
  Total PE              76072
  Alloc PE / Size       8105 / 31.66 GiB
  Free  PE / Size       67967 / 265.50 GiB
  VG UUID               kxrFhT-nNxq-AaVc-t37Y-i0nk-KHLW-JivhX1

而透過 vldisplay 顯示的 logical volume 狀態如下:
--- Logical volume ---
  LV Name                /dev/vg-ubuntu/lv_root
  VG Name                vg-ubuntu
  LV UUID                tRNokw-58tU-YXz1-eIX6-wSUJ-vIqm-1oSYsV
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                27.94 GiB
  Current LE             7152
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

  --- Logical volume ---
  LV Name                /dev/vg-ubuntu/lv_swap
  VG Name                vg-ubuntu
  LV UUID                CeKTrl-04Rf-rps2-XrYk-oyM8-8K3c-8Zf8fT
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                3.72 GiB
  Current LE             953
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1

也就是說我的 LVM 總共有一個 volume group,名字叫做 vg-ubuntu,並且它有 297.16GB 可以使用。
而 vg-ubuntu 底下目前已經建立的 logical volume 有兩個
名字分別是 lv_root 及 lv_swap,個別使用了 27.94GB 及 3.72GB。
換句話說,現在 vg-ubuntu 上面還有大約 264GB 是尚未分配的閒置空間。

接著我在 /etc/cinder/cinder.conf 裡面做了以下的設定:
volume_group = vg-ubuntu
volume_name_template = cinder-%s
其中第一行表示我希望 Cinder 使用 vg-ubuntu 這個 volume group 作為 Cinder 提供儲存空間的地方
同時 Cinder 產生的所有磁碟分區,磁碟命名要加上 "cinder-" 作為前置詞。

設定完成後,就可以開始看看結果了。
首先依照官方文件 [1] 的驗證方法建立名稱為 myVolume 的空間,空間大小為 1GB
cinder create --display-name myVolume 1
收到的回應如下:
+---------------------+--------------------------------------+
|       Property      |                Value                 |
+---------------------+--------------------------------------+
|     attachments     |                  []                  |
|  availability_zone  |                 nova                 |
|       bootable      |                false                 |
|      created_at     |      2014-06-24T06:40:54.106740      |
| display_description |                 None                 |
|     display_name    |               myVolume               |
|      encrypted      |                False                 |
|          id         | 7e124310-9931-43c1-b3c4-8d4f75191d1f |
|       metadata      |                  {}                  |
|         size        |                  1                   |
|     snapshot_id     |                 None                 |
|     source_volid    |                 None                 |
|        status       |               creating               |
|     volume_type     |                 None                 |
+---------------------+--------------------------------------+
這裡可以看到,建立出來的空間的識別碼是 7e124310-9931-43c1-b3c4-8d4f75191d1f,然後回應的當下狀態是 creating。
接著先確定建立出來的 volume 是可以使用的狀態(也就是狀態欄換成 available,而不是像是 error 之類的)
cinder list
收到的回應如下:
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+
|                  ID                  |   Status  | Display Name | Size | Volume Type | Bootable | Attached to |
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+
| 7e124310-9931-43c1-b3c4-8d4f75191d1f | available |   myVolume   |  1   |     None    |  false   |             |
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+

這時,透過 lvdisplay 回去看一下 logical volume 的狀態,就會發現多出一個 logical volume 出來:
--- Logical volume ---
  LV Name                /dev/vg-ubuntu/lv_root
  VG Name                vg-ubuntu
  LV UUID                tRNokw-58tU-YXz1-eIX6-wSUJ-vIqm-1oSYsV
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                27.94 GiB
  Current LE             7152
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

  --- Logical volume ---
  LV Name                /dev/vg-ubuntu/lv_swap
  VG Name                vg-ubuntu
  LV UUID                CeKTrl-04Rf-rps2-XrYk-oyM8-8K3c-8Zf8fT
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                3.72 GiB
  Current LE             953
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1

  --- Logical volume ---
  LV Name                /dev/vg-ubuntu/cinder-7e124310-9931-43c1-b3c4-8d4f75191d1f
  VG Name                vg-ubuntu
  LV UUID                an1Cpv-nva2-RPFA-2su8-VK1k-0917-Ijhjdl
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:2
多出來這個就是被 Cinder 產生出來作為剛剛建立的 myVolume 的空間,可以看到名稱是 cinder-7e124310-9931-43c1-b3c4-8d4f75191d1f
對應了剛剛在設定檔指定的前置詞 "cinder-" 以及 myVolume 的識別碼 7e124310-9931-43c1-b3c4-8d4f75191d1f
同時磁碟分區的空間就是剛剛指定的 1GB。

參考資料:
1、OPENSTACK INSTALLATION GUIDE FOR UBUNTU 12.04/14.04 (LTS) - ICEHOUSE, Chapter 9. Add the Block Storage service
2、鳥哥的 Linux 私房菜 - 第十五章、磁碟配額(Quota)與進階檔案系統管理 - 邏輯捲軸管理員 (Logical Volume Manager)

沒有留言: