學習OpenStack之 (2):Cinder LVM 配置

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
  • 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日誌中可看到以下錯誤: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

注意:

  • 只有一個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
緣由:cinder-volume的host少了一個對應第二個vg的一個。應該是添加第二個backend後配置沒生效。
解決:按照前後順序重啓 cinder-scheduler 和 cinder-volume 服務。建立volume錯誤消失。
(2) Volume一直處於creating狀態。cinder-volume log中有以下錯誤:
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 命令。
相關文章
相關標籤/搜索