Block Storage Service Cinder 作為 OpenStack 的塊存儲服務岸更,為 Instance 提供虛擬磁盤。
操作系統(tǒng)獲得存儲空間的方式一般有兩種:
- 裸盤的方式叫做Block Storage(塊存儲)朴艰,也叫做 Volume (卷)。一般是通過某種協(xié)議(SAS混移、SCSI祠墅、SAN等)掛載裸盤,然后分區(qū)歌径、格式化毁嗦、創(chuàng)建文件系統(tǒng),或者直接使用裸盤存儲數據(數據庫)回铛。
- 文件系統(tǒng)存儲狗准。NAS 和 NFS 服務器,以及各種分布式文件系統(tǒng)提供的存儲茵肃。
一腔长、Cinder 架構
1. cinder-api
cinder-api 是整個 Cinder 組件的門戶,所有 cinder 的請求都先由 cinder-api 處理验残。
cinder-api 向外界提供若干 HTTP REST API 接口捞附。
cinder-api 對接收到的 HTTP API 請求做如下處理:
- 檢查客戶端出入的參數是否合法
- 調用 cinder 其他子服務處理客戶端請求
- 將 cinder 其他子服務返回的結果,返回給客戶端
cinder-api 只接受和 Volume 生命周期相關的操作胚膊。操作如下圖:
2. cinder-scheduler
創(chuàng)建 Volume 時故俐,cinder-scheduler 會基于容量、Volume Type 等條件選擇出最適合的存儲節(jié)點紊婉,然后創(chuàng)建 Volume。
在 /etc/cinder/cinder.conf
文件中辑舷,cinder 通過 scheduler_driver
喻犁、scheduler_default_filters
和 scheduler_default_weighers
三個參數來配置 cinder-scheduler。
(1)Filter scheduler
Filter scheduler 是 cinder-scheduler 默認的調度器。調度過程如下:
- 通過過濾器(filter)選擇滿足條件的存儲節(jié)點
- 通過權重計算(weighting)選擇最優(yōu)(權重值最大)的存儲節(jié)點
默認調度器配置如下:
scheduler_driver = cinder.scheduler.filter_scheduler.FilterScheduler
(2)Filter
在 /etc/cinder/cinder.conf
中 scheduler_default_filters
選項指定 file scheduler 使用的 filer肢础,默認值如下:
scheduler_default_filters = AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter
Filter scheduler 將按照列表中的順序依次過濾还栓。
-
AvailabilityZoneFilter
為了提高容災性和提供隔離服務,可以將存儲節(jié)點和計算節(jié)點劃分到不同的 Availability Zone 中传轰。
例如:把一個機架上的機器劃分到一個 Availability Zone 中剩盒,OpenStack 默認有一個命名為 “Nova” Availability 的 Zone,所有的節(jié)點初始都收放在 “Nova” 中的慨蛙。用戶可以根據需要創(chuàng)建自己的 Availability Zone辽聊,如下圖
在創(chuàng)建 Volume 時,需要指定 Volume 所屬的 Availability Zone期贫,如下圖:
cinder-scheduler 在做 filtering 時跟匆,會使用 AvailabilityZoneFilter 將不屬于指定 Availability Zone 的存儲節(jié)點過濾掉。
-
CapacityFilter
創(chuàng)建 Volume 時通砍,用戶指定 Volume 的大小玛臂。CapacityFilter 的作用是將存儲空間不能滿足 Volume 創(chuàng)建需求的存儲節(jié)點過濾掉。
-
CapabilitiesFilter
不同的 Volume Provider 有自己的特性(Capabilities)封孙,比如是否支持 thin provision 等迹冤。
在創(chuàng)建 Volume 時,可以通過 Volume Type(卷類型)指定需要的 Capabilities虎忌,如下圖
當然 Capabilities 可以根據需要定義很多個泡徙。如下圖
通過 Volume Type(卷類型)的 Extra Specs(擴展規(guī)格)定義 Capabilities。Extra Specs 是 Key-Value 的形式定義的呐籽,如下圖:
不同的 Volume Provider 支持的 Extra Specs 不同锋勺,查看 Volume Provider 文檔。下圖 Volume Type 只有一個 Extra Specs狡蝶,“volume_backend_name” 這是最重要的庶橱,也是必須的 Extra Specs。
cinder-volume 會在配置文件 /etc/cinder/cinder.conf
中贪惹,設置 volume_backend_name
參數苏章,作用是為存儲節(jié)點的 Volume Provider 命名。這樣奏瞬,CapabilitiesFilter 就可以通過 Volume Type 的 “volume_backend_name” 賽選出指定的 Volume Provider枫绅。
下面是我測試環(huán)境 cinder.conf
中的 volume_backend_name
配置
[lvmdriver-1]
image_volume_cache_enabled = True
lvm_type = default
iscsi_helper = tgtadm
volume_group = stack-volumes-lvmdriver-1
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = lvmdriver-1
(3)Weigher
Filter Scheduler 通過 scheduler_default_weighers
指定計算權重的 weigher,默認為 CapacityWeigher
scheduler_default_weighers = CapacityWeigher
CapacityWeigher
基于存儲節(jié)點的空閑容量計算權重硼端,空閑越多權重越大
3. cinder-volume
cinder-volume 在存儲節(jié)點上運行并淋, OpenStack 對 Volume 的操作,最后都交給 cinder-volume 來完成珍昨。
cinder-volume 自身并不管理真正的存儲設備县耽,存儲設備是由 volume provider 管理的句喷。cinder-volume 與 volume provider 一起實現 Volume 生命周期的管理。
-
通過 Driver 架構支持多種 Volume Provider
可以在 /opt/stack/cinder/cinder/volume/drivers/
目錄中查看到 OpenStack 源代碼中已經自帶了很多 volume provider 的 Driver兔毙。
root@controller:/opt/stack/cinder/cinder/volume/drivers# cd
root@controller:~# cd /opt/stack/cinder/cinder/volume/drivers
root@controller:/opt/stack/cinder/cinder/volume/drivers# ll
total 1092
drwxr-xr-x 31 stack stack 4096 Feb 23 19:08 ./
drwxr-xr-x 5 stack stack 4096 Feb 23 19:08 ../
-rw-r--r-- 1 stack stack 21860 Feb 23 17:17 blockbridge.py
-rw-r--r-- 1 stack stack 12524 Feb 23 17:17 block_device.py
-rw-r--r-- 1 stack stack 16907 Feb 23 17:17 coho.py
-rw-r--r-- 1 stack stack 41951 Feb 23 17:17 drbdmanagedrv.py
-rw-r--r-- 1 stack stack 26030 Feb 23 17:17 hgst.py
-rw-r--r-- 1 stack stack 18002 Feb 23 17:17 infinidat.py
-rw-r--r-- 1 stack stack 0 Feb 23 17:17 __init__.py
-rw-r--r-- 1 stack stack 36712 Feb 23 17:17 lvm.py
-rw-r--r-- 1 stack stack 25907 Feb 23 17:17 nfs.py
-rw-r--r-- 1 stack stack 75815 Feb 23 17:17 nimble.py
-rw-r--r-- 1 stack stack 87290 Feb 23 17:17 pure.py
-rw-r--r-- 1 stack stack 61860 Feb 23 17:17 qnap.py
-rw-r--r-- 1 stack stack 19099 Feb 23 17:17 quobyte.py
-rw-r--r-- 1 stack stack 58110 Feb 23 17:17 rbd.py
-rw-r--r-- 1 stack stack 62600 Feb 23 17:17 remotefs.py
-rw-r--r-- 1 stack stack 28825 Feb 23 17:17 sheepdog.py
-rw-r--r-- 1 stack stack 26741 Feb 23 17:17 smbfs.py
-rw-r--r-- 1 stack stack 91524 Feb 23 17:17 solidfire.py
-rw-r--r-- 1 stack stack 25959 Feb 23 17:17 tegile.py
-rw-r--r-- 1 stack stack 39682 Feb 23 17:17 tintri.py
-rw-r--r-- 1 stack stack 29320 Feb 23 17:17 vzstorage.py
-rw-r--r-- 1 stack stack 69166 Feb 23 17:17 xio.py
存儲節(jié)點在配置文件 /etc/cinder/cinder.conf
中 volume_driver
選項配置使用 driver
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
-
定期向 OpenStack 報告計算節(jié)點的狀態(tài)
在 cinder-scheduler 會用到 CapacityFilter 和 CapacityWeigher唾琼,他們都是通過存儲節(jié)點的空間容量來篩選。這個容量信息就是來自 cinder-volume 的定期報告澎剥。
在 cinder-volume 的日志 /opt/stack/logs/c-vol.log
中可以發(fā)現每隔一段時間锡溯,cinder-volume 就會報告一次資源情況。如下圖
-
Volume 生命周期的管理
Cinder 對 Volume 的生命周期的管理最終是通過 cinder-volume 完成的哑姚。包括 創(chuàng)建祭饭、掛載、快照蜻懦、刪除甜癞、擴展等。
4. cinder-provider
數據的存儲設備宛乃,為 volume 提供物理存儲空間悠咱。
cinder-volume 支持多種 volume provider, 每種 volume provider 通過自己的 driver 與 cinder-volume 協(xié)調工作征炼。
二析既、物理部署方案
1. Cinder 服務
Cinder 服務部署在兩類節(jié)點上,控制節(jié)點和存儲節(jié)點谆奥。
控制節(jié)點中 cinder 服務眼坏。
root@controller:~# ps -e | grep cinder
7481 pts/19 00:03:25 cinder-api
7998 pts/20 00:00:42 cinder-schedule
8490 pts/21 00:03:23 cinder-volume
可以看到 cinder-api 和 cinder-scheduler 部署在控制節(jié)點上,這個是合理的酸些。
cinder-volume 為什么也在控制節(jié)點上宰译?
首先 OpenStack 是一個分布式系統(tǒng),每個子服務都可以部署在任何地方魄懂,只要網絡能夠連通沿侈。
無論哪個節(jié)點,只要上面運行了 cinder-volume 服務市栗,就是一個存儲節(jié)點缀拭,當然也可以運行其他服務。
也可以使用 cinder service-list
查看 cinder 服務分布填帽。
root@controller:~# cinder service-list
+------------------+------------------------+------+---------+-------+----------------------------+-----------------+
| Binary | Host | Zone | Status | State | Updated_at | Disabled Reason |
+------------------+------------------------+------+---------+-------+----------------------------+-----------------+
| cinder-scheduler | controller | nova | enabled | up | 2019-03-17T00:54:15.000000 | - |
| cinder-volume | controller@lvmdriver-1 | nova | enabled | up | 2019-03-17T00:54:15.000000 | - |
+------------------+------------------------+------+---------+-------+----------------------------+-----------------+
2. RabbitMQ 和 MySQL 服務
RabbitMQ 和 MySQL 通常部署在控制節(jié)點上蛛淋。
3. volume provider
一般 volume provider 是獨立的。cinder-volume 使用 driver 與 volume provider 通信并協(xié)調工作篡腌。
所以只需要將 driver 和 cinder-volume 放在一起就可以了褐荷。
三、操作過程
1. LVM Volume Provider
Cinder 將 LVM 作為默認的 volume provider嘹悼。Devstack 安裝之后诚卸, /etc/cinder/cinder.conf
已經配置好了 LVM葵第,
default_volume_type = lvmdriver-1
enabled_backends = lvmdriver-1
[lvmdriver-1]
image_volume_cache_enabled = True
lvm_type = default
iscsi_helper = tgtadm
volume_group = stack-volumes-lvmdriver-1
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = lvmdriver-1
配置中定義了名為 “l(fā)vmdriver-1” 的 volume provider绘迁,也稱作 back-end合溺。其 driver 是 LVM,LVM 的 volume group 名為 “stack-volumes-lvmdriver-1”缀台。
在 /dev/sdb
中手動創(chuàng)建 VG “stack-volumes-lvmdriver-1” 棠赛。
創(chuàng)建 physical volume /dev/sdb
root@controller:~# pvcreate /dev/sdb
Device /dev/sdb not found (or ignored by filtering).
因為 Linux 的 LVM 默認配置,不允許在 /dev/sdb
上創(chuàng)建 PV膛腐,需要將 sdb 添加到 /etc/lvm/lvm.conf
的 global_filter
中添加 a|sdb|
global_filter = [ "a|sdb|", "a|.*/|" ]
root@controller:/~# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created
然后創(chuàng)建 VG stack-volumes-lvmdriver-1
root@controller:~# gcreate stack-volumes-lvmdriver-1 /dev/sdb
Volume group "vgcreate stack-volumes-lvmdriver-1 /dev/sdb" successfully created
在 OpenStack Web 的 Volume Type 中可以查看了睛约。