0。背景
OpenStack 中的實例是不能持久化的,cinder服務重啟,實例消失。如果需要掛載 volume,需要在 volume 中實現持久化。Cinder提供持久的塊存儲,目前僅供給虛擬機掛載使用。它並沒有實現對塊設備的管理和實際服務,而是為后端不同的存儲結構提供了統一的接口,不同的塊設備服務廠商在 Cinder 中實現其驅動支持以與 OpenStack 進行整合。它通過整合后端多種存儲,用API接口為外界提供存儲服務。主要核心是對卷的管理,允許都卷、類型和快照進行處理。
Cinder存儲分為本地塊存儲、分布式塊存儲和SAN存儲等多種后端存儲類型:
1. 本地存儲: 默認通過LVM支持Linux。cinder volume 將該服務所在的節點變為存儲節點,將上面的 volume group 作為共享存儲池暴露給計算節點。
2. SAN存儲:
(1)通過NFS協議支持NAS存儲,比如Netapp
(2)通過添加不同廠商的制定driver來為了支持不同類型和型號的商業存儲設備,比如EMC,IBM的存儲。 在 https://wiki.openstack.org/wiki/CinderSupportMatrix可以看到所支持的廠商存儲列表。
3. 分布式系統:支持sheepdog,ceph,和IBM的GPFS等
對於本地存儲,cinder-volume 默認使用 LVM 驅動,該驅動當前的實現需要在主機上事先用 LVM 命令創建一個的卷組 , 當該主機接受到創建卷請求的時候,cinder-volume 在該卷組 上創建一個邏輯卷, 並且用 openiscsi 將這個卷當作一個 iscsi tgt 給輸出.還可以將若干主機的本地存儲用 sheepdog 虛擬成一個共享存儲,然后使用 sheepdog 驅動。
1. Cinder LVM配置
在cinder配置文件中,默認的backend lvmdriver是通過LVM來使用某個cinder volume服務所在的服務器的本地存儲:
[lvmdriver-1] volume_group = stack-volumes-lvmdriver-1 volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmdriver-1
- volume_group 指定Cinder使用的 volume group。在devstack默認安裝時其名稱是stack-volumes-lvmdriver-1;在實際部署cinder的時候其默認名稱是cinder-volumes。
- volume_driver 指定driver類型. Cinder目前支持兩種傳輸協議, iSCSI and iSER。
- iSCSI的話,將其值設為 cinder.volume.drivers.lvm.LVMISCSIDriver;
- iSER的話,將其值設為 cinder.volume.drivers.lvm.LVMISERDriver。
LVM是cinder.volume.drivers.lvm.LVMISCSIDriver
- volume_backend_name 指定backend name。當有多個 volume backend 時,需要創建 volume type,它會綁定一個或者多個backend。用戶在創建 volume 時需要選擇某個 volume type,相當於選擇了某個 volume backend。要這個參數的原因是因為一個openstack環境中可能有多個 cinder-volume 存儲節點,此時就有多個 volume backend,此時就需要給每個backend 一個 name 來區分。
如果名字為stack-volumes-lvmdriver-1的volume group不存在,創建volume后其狀態將為error,在cinder c-vol日志中可看到如下錯誤:
Exception during message handling: Unexpected error while running command. Command: None Exit code: - Stdout: u'Unexpected error while running command.\nCommand: sudo cinder-rootwrap /etc/cinder/rootwrap.conf lvcreate -n volume-f3aef3b9-1a71-41d4-956e-a00044544b74 stack-volumes-lvmdriver-1 -L 1g\nExit code: 5\nStdout: u\'\'\nStderr: u\' Volume group "stack-volumes-lvmdriver-1" not found\\n\'' Stderr: None
可參考我的博文http://www.cnblogs.com/sammyliu/p/4157491.html來配置LVM。
3. Cinder使用LVM
成功創建一個Cinder volume后,可以在VG中看到新創建的logical volume:
root@dev:/home/s1# lvdisplay /dev/stack-volumes-lvmdriver-1/volume-02f986b0-418f-4f84-a5ec-7af61f5d5293 --- Logical volume --- LV Name /dev/stack-volumes-lvmdriver-1/volume-02f986b0-418f-4f84-a5ec-7af61f5d5293 VG Name stack-volumes-lvmdriver-1 LV UUID 9oESr2-4V7f-qp22-F5te-hF2v-DWoy-EshtnN 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:0
4. 使用多個backend/添加新的LVM backend
(1)創建新的volume group vg3
(1)修改cinder.conf,添加下面行:
enabled_backends=lvmdriver-1,lvmdriver-2 [lvmdriver-2] volume_group = vg3 volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmdriver4vg3
注意: cinder-volume服務不監控該配置文件,除了在啟動的時候讀取該文件以外。因為在修改該文件后你需要重啟該服務:`service cinder-volume restart`.
(3)創建新的的volume type type-test
s1@dev:~/devstack$ cinder type-create type-test +--------------------------------------+---------------+ | ID | Name | +--------------------------------------+---------------+ | 764480d1-7614-4a63-ba33-924d65765534 | type-test| +--------------------------------------+---------------+
(4) 設置volume type的backend name
cinder type-key type-test set volume_backend_name=lvmdriver4vg3
注意:
- 只有一個backend的時候,除了配置volume group外,不需要添加別的配置信息,創建volume的時候也不需要選擇volume type。
- 當有多個backend的時候,你需要使用volume-type來將volume創建到指定的backend中。一個volume-type可以有幾個backend,這時候 the capacity scheduler 會自動選擇合適的backend來創建volume。
- 如果定義了volume type,但是cinder.conf中沒有定義volume backend,那么cinder scheduler將找不到有效的host來創建volume了。
(5)可以在Horizen中選擇新的type type-test來創建volume了
5. 遇到的問題:
(1) 在選擇一個volume type創建volume時失敗,
症狀:日志中有 No valid host was found. No weighed hosts available 錯誤
分析:查看volume host:
s1@dev:~/devstack$ cinder-manage service list STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION from (pid=4488) _check_effective_sql_mode /usr/local/lib/python2.7/dist-packages/oslo/db/sqlalchemy/session.py:509 Binary Host Zone Status State Updated At cinder-scheduler dev nova enabled :-) 2014-12-12 16:11:54 cinder-volume dev@lvmdriver-1 nova enabled :-) 2014-12-12 16:11:56
Returning exception create_volume() got an unexpected keyword argument 'source_replicaid' to caller
原因:controller上和storage node上cinder版本不一致。
解決:在兩個node上首先卸載cinder,然后執行命令 echo "deb http://ubuntu-cloud.archive.canonical.com/ubuntu" "trusty-updates/juno main" > /etc/apt/sources.list.d/cloudarchive-juno.list,再安裝cinder。確認cinder的版本一致。
apt-get install package=version 命令。