0。背景html
OpenStack 中的實例是不能持久化的,cinder服務重啓,實例消失。若是須要掛載 volume,須要在 volume 中實現持久化。Cinder提供持久的塊存儲,目前僅供給虛擬機掛載使用。它並無實現對塊設備的管理和實際服務,而是爲後端不一樣的存儲結構提供了統一的接口,不一樣的塊設備服務廠商在 Cinder 中實現其驅動支持以與 OpenStack 進行整合。它經過整合後端多種存儲,用API接口爲外界提供存儲服務。主要核心是對卷的管理,容許都卷、類型和快照進行處理。node
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等python
對於本地存儲,cinder-volume 默認使用 LVM 驅動,該驅動當前的實現須要在主機上事先用 LVM 命令建立一個的卷組 , 當該主機接受到建立卷請求的時候,cinder-volume 在該卷組 上建立一個邏輯卷, 而且用 openiscsi 將這個卷看成一個 iscsi tgt 給輸出.還能夠將若干主機的本地存儲用 sheepdog 虛擬成一個共享存儲,而後使用 sheepdog 驅動。sql
1. Cinder LVM配置
在cinder配置文件中,默認的backend lvmdriver是經過LVM來使用某個cinder volume服務所在的服務器的本地存儲:shell
[lvmdriver-1] volume_group = stack-volumes-lvmdriver-1 volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name = lvmdriver-1
若是名字爲stack-volumes-lvmdriver-1的volume group不存在,建立volume後其狀態將爲error,在cinder c-vol日誌中可看到以下錯誤:ubuntu
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:session
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 backendapp
(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
注意:
(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 命令。