|
0。背景 OpenStack 中的实例是不能持久化的,cinder服务重启,实例消失。如果需要挂载 volume,需要在 volume 中实现持久化。Cinder提供持久的块存储,目前仅供给虚拟机挂载使用。它并没有实现对块设备的管理和实际服务,而是为后端不同的存储结构提供了统一的接口,不同的块设备服务厂商在 Cinder 中实现其驱动支持以与 OpenStack 进行整合。它通过整合后端多种存储,用API接口为外界提供存储服务。主要核心是对卷的管理,允许都卷、类型和快照进行处理。 Cinder存储分为本地块存储、分布式块存储和SAN存储等多种后端存储类型: W$ W0 u# b8 o" v; u' n1 |
1. 本地存储: 默认通过LVM支持Linux
: g3 x+ K1 l$ @% x! R: x4 E1 v/ g% m2. SAN存储:
- M; }% b8 M6 P (1)通过NFS协议支持NAS存储,比如Netapp
1 `1 h4 f4 b9 i. H% H0 n (2)通过添加不同厂商的制定driver来为了支持不同类型和型号的商业存储设备,比如EMC,IBM的存储。 在https://wiki.openstack.org/wiki/CinderSupportMatrix可以看到所支持的厂商存储列表。% t( K/ T9 B5 z3 Y1 z4 o
3. 分布式系统:支持sheepdog,ceph,和IBM的GPFS等 对于本地存储,cinder-volume 默认使用 LVM 驱动,该驱动当前的实现需要在主机上事先用 LVM 命令创建一个的卷组 , 当该主机接受到创建卷请求的时候,cinder-volume 在该卷组 上创建一个逻辑卷, 并且用 openiscsi 将这个卷当作一个 iscsi tgt 给输出.还可以将若干主机的本地存储用 sheepdog 虚拟成一个共享存储,然后使用 sheepdog 驱动。 1. Cinder LVM配置
% u! `- A$ _- s在cinder配置文件中,默认的backend lvmdriver是通过LVM来使用本地存储: [lvmdriver-1]
! _8 @* y: @- i5 Rvolume_group = stack-volumes-lvmdriver-1( _# \! X2 i- B' o4 L/ v
volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver' v, y/ D1 w1 [, }1 x% Y6 D( K
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。
' p: f+ F) E) C2 X: e- iSCSI的话,将其值设为 cinder.volume.drivers.lvm.LVMISCSIDriver;
- iSER的话,将其值设为 cinder.volume.drivers.lvm.LVMISERDriver。
! Z$ _2 C5 M6 Z8 D! x) z; `
# o! l/ C/ K/ ^' [3 F# B* QLVM是cinder.volume.drivers.lvm.LVMISCSIDriver% X) W' L& O3 r1 d
- volume_backend_name 是backend name,在创建volume的时候可选择。6 L4 X- r) p3 r( P( G
如果名字为stack-volumes-lvmdriver-1的volume group不存在,创建volume后其状态将为error,在cinder c-vol日志中可看到如下错误: Exception during message handling: Unexpected error while running command.$ f/ G3 x% O- D% Q
Command: None. w% {8 b( N. V9 |
Exit code: -
2 J6 ~4 p% u' P1 y$ H9 jStdout: 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\''2 Y% f( I# ]" C, x `
Stderr: None 3. Cinder使用LVM 成功创建一个Cinder volume后,可以在VG中看到新创建的logical volume: root@dev:/home/s1# lvdisplay /dev/stack-volumes-lvmdriver-1/volume-02f986b0-418f-4f84-a5ec-7af61f5d5293 |% t7 h W' N9 w; |, d: `
--- Logical volume ---
( G/ b) d% S) c5 G" ~( g+ N, L/ z2 pLV Name /dev/stack-volumes-lvmdriver-1/volume-02f986b0-418f-4f84-a5ec-7af61f5d5293
# l" Q. I# ^4 o) QVG Name stack-volumes-lvmdriver-19 ~/ N- L+ w% c9 ?
LV UUID 9oESr2-4V7f-qp22-F5te-hF2v-DWoy-EshtnN" h, z- I7 s! z3 l: c& B
LV Write Access read/write
5 s5 C* T& t z: K: ^9 v2 _2 H) OLV Status available
/ q5 {+ G7 g8 k" m) I8 S# open 0
! @& h8 M, j; O, WLV Size 1.00 GiB
! R3 L$ j8 q# M* Q9 E$ \5 z% F. v, HCurrent LE 256
, V4 [1 G: {' W) G/ X+ wSegments 1
& l5 G: t0 }) ?' C, ^" _Allocation inherit
% f/ B# \/ C+ x' n Y! [' WRead ahead sectors auto
: G q2 K X% Q, @9 t- T, E7 H- currently set to 256& G" u+ D, G5 v7 m$ f1 ]) N
Block device 252:0 4. 使用多个backend/添加新的LVM backend (1)创建新的volume group vg3 (1)修改cinder.conf,添加下面行: o* [$ N8 u7 A* k: o" V& }" K
enabled_backends=lvmdriver-1,lvmdriver-2 k- R. b5 f, c7 N/ u, R( a) G! @' Y
[lvmdriver-2]) y. a N& _0 y/ ~% r
volume_group = vg3
) { q4 ?8 H% d* \' y8 Ivolume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver
1 A3 z6 k; ~! x! t h! [% m9 p& cvolume_backend_name = lvmdriver4vg3 注意: cinder-volume服务不监控该配置文件,除了在启动的时候读取该文件以外。因为在修改该文件后你需要重启该服务:`service cinder-volume restart`. (3)创建新的的volume type type-test s1@dev:~/devstack$ cinder type-create type-test
& W& W8 n! m9 ^$ o+--------------------------------------+---------------+
3 |" Z7 [' S, D9 V1 x4 Y| ID | Name |- f, ~8 ^8 y( q, T2 \- ^5 ~
+--------------------------------------+---------------+
" p# C s1 M8 T2 h# F9 h| 764480d1-7614-4a63-ba33-924d65765534 | type-test|* `. {. m; ?9 s- e2 w
+--------------------------------------+---------------+ (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了。4 x1 K. ]% g% b0 H9 H7 ~
(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 list1 t' f" t1 V' {
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:5097 k0 B" e2 Z! m! q4 O& Y2 @* w
Binary Host Zone Status State Updated At* b8 a9 y5 q0 H$ _
cinder-scheduler dev nova enabled :-) 2014-12-12 16:11:545 \ ]( _# P% F
cinder-volume dev@lvmdriver-1 nova enabled :-) 2014-12-12 16:11:56
. k1 k; y( [" V; D4 E原因:cinder-volume的host少了一个对应第二个vg的一个。应该是添加第二个backend后配置没生效。
1 N) D% g" S: \1 h( i7 |3 P解决:按照先后顺序重启 cinder-scheduler 和 cinder-volume 服务。创建volume错误消失。
0 W4 r3 p) L- L" N( C; z(2) Volume一直处于creating状态。cinder-volume log中有如下错误:
( \! s: V& ?4 r' ?Returning exception create_volume() got an unexpected keyword argument 'source_replicaid' to caller 原因:controller上和storage node上cinder版本不一致。 [size=1em] | apt-get install package=version 命令。
. E0 ^. ?* d3 o# F/ a# @ ~0 j' a/ l; n( h
| ; v; F+ G- C7 }. l, O
( \% q, z& ?/ b; s5 H3 I1 B
9 f: o* F% n4 n$ P# H7 W# a; w! o$ @6 v2 J1 R
|