- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
openstack 云计算卷热扩容相关文档
+ z) ]/ {9 t- U7 j5 G[toc]
1 V6 M% N9 a, D( `) T: I4 v) {( f. O; i# B% A+ J
指令& r2 c- V6 I4 |4 L9 m
usage: cinder extend <volume> <new_size>
. ?8 I/ f+ O( L( kAttempts to extend size of an existing volume.. c p3 k4 W C8 m6 q
Positional arguments:) @8 l9 O$ q% E; E/ i
<volume> Name or ID of volume to extend.
: U) A' _. K1 p/ `$ I- q0 I7 u <new_size> New size of volume, in GiBs.; v% B& e2 i0 ^8 l3 z8 U) D
功能说明
0 B& }# u( |2 |" O, U6 p4 l! E, J( Y/ h5 W
最新的openstack()代码支持了热扩容功能:
; \' e1 _% P9 a% p) z+ T/ R/ z7 u$ `4 Z
Add ability to extend 'in-use' volume. User should be aware of the
7 g1 E7 P z- dwhole environment before using this feature because it's dependent
' W3 y- J* t) }0 ^+ Q% E% H, von several external factors below:( {; H8 _9 e: Y U1 E" q
1. nova-compute version - needs to be the latest for Pike.# e, m. v) C5 W/ U$ W
2. only the libvirt compute driver supports this currently.; D6 w- E9 q. M4 o2 J
3. only iscsi and fibre channel volume types are supported
; {8 l( F- P% U. v+ J5 q, xon the nova side currently.0 A6 f+ k o: ?6 W1 C) L% K
Administrator can disable this ability by updating the6 ~% j9 x, I. ]( J w- O; V, m
'volume:extend_attached_volume' policy rule. Extend in reserved
& R1 g# c# H4 L7 L9 C6 Kstate is intentionally NOT allowed.
* z4 K; V& k; B" O7 ?" k+ l0 x
$ D4 o" _3 {/ b0 B3 D$ {1 ]注意:4 L N! z' c' O( u$ _
* V, S/ D, N2 f8 T- h; A
目前只有 libvirt 驱动能支持,且只有 iscsi 和 fibre channel 协议的卷类型能支持!
. ^5 P% }" j- H: [+ K3 C& Ccinder、nova做完热扩容后,fdisk -l查看可以看到磁盘大小变大,但是之前做的文件系统的大小是不会变化的,df -h 的结果跟扩容前一样。用户还必须用resize2fs 指令自行resize文件系统!' `& N* o5 o4 H9 H
《openstack 官网对于热扩容在 CINDER 方面的说明》
# }! s3 J- Y' {+ V4 E7 Y( D' M ?/ W# @4 L
《openstack 官网对于热扩容在 NOVA 方面的说明》
- E, p8 {+ n4 ~3 |, O
7 f# D, B, g7 z3 k% g& ECinder方面代码
4 E- h& L6 N% l% L4 HCinder 方面其实没有什么改动,跟冷扩容做的事一样,扩容后的size必须是整数GB且大于扩容前size。核心实现是调用卷驱动里的方法,如netapp,调用的是cinder.volume.drivers.netapp.dataontap.client.client_base.Client#do_direct_resize实现。唯一的区别是,扩容后,会调用nova api。
. b' u8 ]' ?* u& o6 V- q" [# S# m8 {' v7 p9 L' {2 \
cinder.api.contrib.volume_actions.VolumeActionsController#_extend:2 A5 I S- n* j$ N' G
# 如果版本是 且 卷状态是in-use,则走热扩容
1 ^. c. D2 S) E v% h: y% q dif req_version.matches("3.42") and volume.status in ['in-use']:" K2 p* H9 J& [2 n( N
self.volume_api.extend_attached_volume(context, volume, size)+ b# N9 z: H6 `5 ^
else: # 否则,冷扩展& J4 x- C. A. j, p; T* z
self.volume_api.extend(context, volume, size)) A! K1 z, f% j) c' |" m: X# m7 l
3 p, G, J; V& Z- E' T$ h
cinder/volume/manager.py里调用nova api,通知nova要扩展卷:% z5 I0 b; r' ^0 s8 _
if orig_volume_status == 'in-use':
$ \; ]7 E) b1 N* ?3 ? nova_api = compute.API()
$ P- a( ^4 L4 K4 F/ v8 ]3 M instance_uuids = [attachment.instance_uuid
( [8 F' \6 }6 ]; X# W7 k3 U for attachment in attachments]
/ u" a# B! {. y( J$ Z. p nova_api.extend_volume(context, instance_uuids, volume.id)) t. ^9 G/ q$ X: a$ ]
这里调用nova client 里的:# g. P8 a1 u9 T$ u
novaclient.v2.server_external_events.ServerExternalEventManager#create:
5 c( ~! w, [6 B( S
- g9 l0 z9 Y0 n; K5 O6 a7 u xclass ServerExternalEventManager(base.Manager):
8 L; q& y0 P" O) `6 U resource_class = Event) S6 A( _2 h! ]! @ K
! u% Q* F" ?5 C8 {* [8 k def create(self, events):, Q' O6 j! h7 e
"""Create one or more server events.
1 L4 |. H. o% T' a" E; v
7 A2 [7 ?9 l" I$ y :param:events: A list of dictionaries containing 'server_uuid', 'name',
1 W9 _! m2 H8 Q 'status', and 'tag' (which may be absent)
0 g! [+ y5 J2 H1 f: c """
4 F+ y0 Q8 K' ~6 l: \* H6 X" O6 `( j, b2 Y1 c! ]( F
body = {'events': events}# M |3 X9 [1 U* u5 A; E
return self._create('/os-server-external-events', body, 'events',
7 T7 S; c% [, Q' p( z S" d return_raw=True)
+ N8 z% d R0 o t2 j( h& u$ n2 O5 b( i4 d. f. x* n+ Y
'events':. ?. Y. ?/ A& u
3 X3 u2 m$ Y+ f c6 M5 j+ w
{'name': 'volume-extended',
+ m* E2 y5 G8 Q( u'server_uuid': server_id,
g8 P3 ~- J- K9 E'tag': volume_id}
( c+ v4 x7 h4 C" r/ A$ g6 R& m* HNova方面代码4 V& Q' h! C( E: u' k- D8 q
Nova将使用现有的外部事件API端点监听来自Cinder的附加卷扩展通知。收到通知后,Nova将使用os-brick触发主机上的设备重新扫描,以发现卷大小的变化。
' e- e" g% `' y) M: x. c7 W* O- h8 i7 l! z$ t% J
nova api '/os-server-external-events':
z9 S1 v" {7 U4 c. ^8 v1 G9 F2 @! J4 D: O# Q
request:
: n% {. q! a" F0 L {5 D+ n2 c: r8 U9 D6 o1 j
"events": [& n7 t/ F. D0 D! z1 o$ }
{ n. k3 i- o$ l% _- r2 P, a5 ^
"name": "volume-extended",' \- R4 _$ n& v, g& Q( b
"server_uuid": "3df201cf-2451-44f2-8d25-a4ca826fc1f3",$ p6 y2 M9 @2 j$ o5 I
"tag": "0e63d806-6fe4-4ffc-99bf-f3dd056574c0"3 o4 i2 i, I/ z: F0 q5 a
}
5 I% C1 x: }# T9 m8 Q6 ^9 m$ G ]' w2 { ^( I' Y6 m! O# x0 M6 j$ o
}
8 `% P: P6 B: E: Nresponse:6 z" f$ K7 m2 R/ q. h
{
9 `2 g' |% e! q7 I7 o "events": [, |0 C5 Z: X0 o6 X
{0 V( C6 @3 {4 ^$ x* R$ p
"name": "volume-extended",
+ E! j" r. {# Y* Q8 j3 J "status": "completed",* c* ]) ~& C! C$ J2 K# W8 k
"code": 200,
7 M* A- K% U3 y% {. G! h "server_uuid": "3df201cf-2451-44f2-8d25-a4ca826fc1f3",, `' H& X. e, v; v& @2 F& z
"tag": "0e63d806-6fe4-4ffc-99bf-f3dd056574c0"4 y2 L' x3 C- K/ m
}& e3 M. K1 Y% ~+ r
]' A0 B. {' k @+ H
}/ N, t1 ]( u% h, i& L9 o8 c: c
检查nova驱动compute_driver = libvirt.LibvirtDriver是否能支持卷扩展 "supports_extend_volume": True7 u. [1 c0 T" V0 R
驱动的支持功能定义在nova.virt.libvirt.driver.LibvirtDriver:& y1 e2 w3 z& U8 G7 X) U' H
class LibvirtDriver(driver.ComputeDriver):
( g+ _! e$ x8 v/ \7 u% D+ M y capabilities = {
9 J! O0 c1 a2 ~4 I6 q- l8 ]* S "has_imagecache": True,
- e* m. A* M) ~, X; I" \9 r "supports_recreate": True,
" Q' A4 _: K; s8 c* k "supports_migrate_to_same_host": False,% P$ S/ l/ b' Z$ M
"supports_attach_interface": True,4 e- l# u( E/ V! }+ {" p$ t# N ~+ \
"supports_device_tagging": True,
2 c/ m" p5 q' x9 C- p; L! c "supports_tagged_attach_interface": True,8 k |2 k }) h" b5 i4 G
"supports_tagged_attach_volume": True,
8 W1 j: J; }$ ^4 Z) R1 U* D" p "supports_extend_volume": True,, W- M1 l7 z6 G& X5 ^
}
2 F9 n* ]# |" Y B$ a, D+ }, @
0 a1 N' I/ B: Q根据卷connection_info找对应的驱动,然后调用驱动的extend_volume方法。
$ ^: W I3 H& Y1 v. A: a! a) h! | w def _extend_volume(self, connection_info, instance):
: Y N7 ~# S) l5 O& d# {, h vol_driver = self._get_volume_driver(connection_info)
9 l4 ^- v* M) U6 Q" V" I return vol_driver.extend_volume(connection_info, instance)
, u- l* L% P; k; C6 Z. x1 o9 n比如Iscsi,就会找nova.virt.libvirt.volume.iscsi.LibvirtISCSIVolumeDriver#extend_volume:; s; v! w5 |% r2 y) Q
new_size = self.connector.extend_volume(connection_info['data'])
. b1 m) h3 e& b5 Q/ D在调用ISCSIConnector的extend_volume3 l1 a- V1 r# m% V# E7 A
os_brick.initiator.connectors.iscsi.ISCSIConnector#extend_volume:
$ h7 d4 s# g* A8 P volume_paths = self.get_volume_paths(connection_properties)
' U3 q- L( I' x3 w if volume_paths:% `$ k- A6 P' [! k1 R6 d
return self._linuxscsi.extend_volume(volume_paths) y, j. {+ e2 ^4 r4 H8 B5 ]3 v$ H
调用linuxscsi的extend_volume
: x9 C8 i! I! h* H! e% g( Y$ m9 D. `5 O2 Kos_brick.initiator.linuxscsi.LinuxSCSI#extend_volume:
$ Y) a- e( E: @, T) _* M2 _* k) g/ } def extend_volume(self, volume_paths): ^% g( T/ y4 J- S7 \
"""Signal the SCSI subsystem to test for volume resize.
0 n6 l; c. w' s f8 w! u% a0 I1 R2 ^( t* [' J* m
This function tries to signal the local system's kernel
" j; ~3 i' X/ U8 z$ c5 g m that an already attached volume might have been resized.
$ R' {$ @2 B) @8 }- _% B' l """2 S# Z% E; _0 j/ s
LOG.debug("extend volume %s", volume_paths)
) C+ |; |, s, [; t9 b5 a. G" f1 K* G3 e" x% o# S
for volume_path in volume_paths:9 l7 n! f, y5 S6 D' ?9 g3 i( s& b
device = self.get_device_info(volume_path)
3 _8 M# t. N' e5 x V9 `8 @ LOG.debug("Volume device info = %s", device)
; v$ J1 ^5 o; H, D/ P/ `8 X+ v device_id = ("%(host)s:%(channel)s:%(id)s:%(lun)s" %& D( u# _8 s' V- b& A5 n7 p
{'host': device['host'],
7 a% G4 B' i E7 C! u 'channel': device['channel'],2 `6 Y4 H, n5 w' |& Y
'id': device['id'],; Q+ ]8 m7 j$ I$ h5 a2 W
'lun': device['lun']})
& U, I: x; d4 O1 i
8 M+ \ r0 d1 k scsi_path = ("/sys/bus/scsi/drivers/sd/%(device_id)s" %
6 |; I u/ N$ H {'device_id': device_id}) 5 T5 E) c% k- Q: D. ~7 n+ ~, G
# 如:scsi_path = u'/sys/bus/scsi/drivers/sd/3:0:0:3'
j; H: R* E, G O2 w$ F# D1 D/ q
# 获取设备大小( M4 Y: [8 i$ K1 f" z Y% |
size = self.get_device_size(volume_path) m2 q7 Y+ X R
LOG.debug("Starting size: %s", size)
) R; U( @3 b9 q8 ?
7 r8 z/ t# C1 S+ b7 J& o # now issue the device rescan8 E8 J# ?) c3 A% B* V
rescan_path = "%(scsi_path)s/rescan" % {'scsi_path': scsi_path}( f+ e1 r- z1 j. v3 l- X! @
# 如:rescan_path = u'/sys/bus/scsi/drivers/sd/3:0:0:3/rescan'! G) q- I2 @# q: F V: D
9 }: ~" C& x1 Y" W
# 在rescan_path文件里写入1。 T( i ?& ~7 V- C8 @
# 对于SCSI设备,对 rescan 文件设置为1 可以使SCSI设备重新扫描。
7 g% O9 Y, F3 I P% @3 M self.echo_scsi_command(rescan_path, "1") a& W# K- J5 q6 j5 n
new_size = self.get_device_size(volume_path)* r% K9 ^, v n0 J: J! n5 D
LOG.debug("volume size after scsi device rescan %s", new_size)
! |, W0 k- U9 _0 f& F( W A8 z* y1 K+ a W5 ?
# 通过指令`/lib/udev/scsi_id --page 0x83 --whitelisted /dev/disk/by-path/ip-12.24.3.10:3260-iscsi-iqn.1992-08.com.netapp:sn.2d72abb030d511e7875800a098ac0ce9:vs.24-lun-3 `拿到wwnid
; n. ?3 A% K d# R! S scsi_wwn = self.get_scsi_wwn(volume_paths[0]) y: O6 R8 M) i4 c6 |
# 如:scsi_wwn = u'3600a09803830387461244a62344f6b52'2 s0 z% E: h2 K8 _+ x; O9 P
mpath_device = self.find_multipath_device_path(scsi_wwn)
6 n# a# Z4 \5 k! x7 ] # 如果mpath_device非空,说明是多路径磁盘。
! o& z$ {$ @* _+ {' F if mpath_device:
1 c6 ?' k; G* o1 j2 t* \2 M # Force a reconfigure so that resize works
7 L( \( L5 o$ `# @ # 执行 `multipathd reconfigure` 重新获取 multipath.conf 配置中变化。
; j- l5 e; U$ }' T! g$ n self.multipath_reconfigure()
' z. L4 d" ^$ e) N # 获取设备大小
; x, \- P, F8 m5 R/ A7 k$ A7 I& G size = self.get_device_size(mpath_device). {- ~5 S% l# @$ [8 J
LOG.info("mpath(%(device)s) current size %(size)s",
7 _% v, m* B: v7 |! [; h5 I+ K {'device': mpath_device, 'size': size})
9 p' h, ]8 G* {' C% X. I. [+ s5 c5 _+ C# h. L7 q
# 调用指令 multipathd resize map multipath_device 重置多路径磁盘的大小1 r% l6 L3 ~6 h" D" `, k- x+ ?
result = self.multipath_resize_map(scsi_wwn) {" n5 K3 x1 j& ?, Y2 A
if 'fail' in result:7 }1 a2 Y% C# V4 C
LOG.error("Multipathd failed to update the size mapping of "
* x7 g4 x) s) e2 g9 D* U "multipath device %(scsi_wwn)s volume %(volume)s",& s7 R& I, x; E0 R
{'scsi_wwn': scsi_wwn, 'volume': volume_paths})
$ _- k( j. \# p9 N* Q: h% ?9 ] return None
8 z& _ D4 `, e( m X0 E8 h+ [" X' f6 G
# 获取设备大小 p f" p3 R" q1 u" U$ [0 N9 `4 @
new_size = self.get_device_size(mpath_device)
; D" ^4 }, ^$ {& T, \4 X% G% ~) g" U- V- ] LOG.info("mpath(%(device)s) new size %(size)s",
* {2 n8 g$ v9 W( I {'device': mpath_device, 'size': new_size})9 S% {6 K5 O% Y- w% J, Q
* A' `6 k! [, P. D$ m
return new_size
2 e9 B: {% {7 N' x流程简要:
" [* Y1 g t2 V+ E7 q* ?向scsi扫描文件写入 1:tee -a 1 "%(scsi_path)s/rescan",对于SCSI设备,对 rescan 文件设置为1 可以使SCSI设备重新扫描。
2 Q* W& l8 u8 r, X& i' A# O+ L' A
/lib/udev/scsi_id --page 0x83 --whitelisted 得到scsi_wwn$ X' T& T! g6 a2 t
6 ]6 f2 j; I. C! }" L# B检查多路径设备,先检查/dev/disk/by-id/dm-uuid-mpath-%(wwn)s是否存在,存在则返回路径;如果不存在,则检查/dev/mapper/%(wwn)s,存在则返回路径,不存在返回none。
7 j' `' w/ F0 d2 F" d. ]
0 J' f( ^5 w+ D如果第3部结果为none,流程结束。
" Y! S/ }4 i' m: A8 v% q) _
7 {% V W! E1 I! `& C, w2 @8 h如果第3步查到路径,则需要执行 multipathd reconfigure 重新获取 multipath.conf 配置中变化。5 }/ i5 g, n( }
- N( m1 m9 B* k- \# e执行multipathd resize map scsi_wwn 重新设置设备大小。多路径磁盘流程结束。
# ~0 j; P4 w/ O/ x, S6 R& d$ ?, b1 r0 k J
FC和Iscsi驱动都是这样流程。: M& @# O, ] i) f
2 e `0 |( r- ]; Q" q, `
附:2 q7 N' @8 h, w J+ h3 l: j
centos 如何使用多路径磁盘5 B+ g, g) v7 S: m! A3 ?
1.安装multipath工具! K3 Z- r% O k: a" b
# 安装multipath工具: \/ q2 W* `% E9 d% H6 p6 w
yum -y install device-mapper device-mapper-multipath
9 x. _# X8 l) k1 k, G! z$ Y9 y( B% c! p" _: o9 ]. f. F1 E2 v
#加载multipath内核模块( a1 M& o* m( H3 ~. M: t$ k* D
modprobe dm-multipath: k& J, y0 k1 t( d* f$ H, v
modprobe dm-round-robin
. B6 z& o7 m1 h+ e
7 H; r- O2 M/ {; H/ L# 拷贝默认配置文件
* j, N2 ]3 j& q- ~/ b/ g0 b1 O& P* qcat /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf > /etc/multipath.conf
- E. a/ T' b+ x9 Z, C+ T
* f" g9 J% Z* F#启动服务
) y; o3 S+ E+ [) |% Tservice multipathd start 或者 /bin/systemctl start multipathd.service9 R2 t4 P* a; m
2.配置nova_compute的配置文件8 N, e: U+ s/ N: b1 |! I
[libvirt]3 e, [% u& s7 a" Y% c
# iscsi磁盘是否开启多路径,True为开启
5 K' ?: `- h; B" u/ m) ^volume_use_multipath=True" L' b1 a( W$ b; ~
L# M# A+ Z' K3 ~6 |
# 建立连接时的rescan次数9 B9 ~8 z$ w1 O+ G" d4 e0 n! j, p
num_iscsi_scan_tries=5
: b7 I/ m& e5 z* {$ F$ \! o- F' T$ g9 |; R9 T, f
# 创建iscsi连接使用的iface名称
7 F# H8 H t0 z- A( qiscsi_iface=default
^- q! J/ U, b: y+ }2 Z G1 S修改在线多路径设备容量的方法
! \0 R$ `& i# ^' q& s6 S$ X( Y7 \; @redhat官网上介绍了修改在线多路径设备容量的方法:
* }7 s4 i; ]' V$ Y
3 ^- J4 l% h" U" B8 e" ^# x6 _; f& J- bRESIZING AN ONLINE MULTIPATH DEVICE( W) f: Y! m8 } L
If you need to resize an online multipath device, use the following procedure.
: t5 z. K& b4 R, R$ y S' q
- t- i. @5 J$ t( o0 KResize your physical device./ i* [) z( F$ q2 @" ^
Execute the following command to find the paths to the LUN:
% T s" y+ X; ~3 U8 f# multipath -l
1 p; \9 m. y8 @% o$ s
) U- Y; I* J6 T1 T1 w5 h7 [Resize your paths. For SCSI devices, writing a 1 to the rescan file for the device causes the SCSI driver to rescan, as in the following command:
# L3 T M9 x3 K$ p- i" S: O# echo 1 > /sys/block/path_device/device/rescan0 t6 ]+ K8 h) E: G4 i7 }& ~
+ I% \9 L! B( I
Ensure that you run this command for each of the path devices. For example, if your path devices are sda, sdb, sde, and sdf, you would run the following commands:
8 K0 J# J7 S% Y& j0 y m u' L4 Y8 M% R; @$ r4 |; z8 D! _3 g
# echo 1 > /sys/block/sda/device/rescan+ L! F B0 A6 p) X& Z! F
/ T! a) y8 J. R Z% {9 V: O: z
# echo 1 > /sys/block/sdb/device/rescan' }" F- v. w' N/ Z) U) B ?3 e
' I8 A. d1 e* p2 ~' ~1 c
# echo 1 > /sys/block/sde/device/rescan. E1 |, E; Q+ R% ~$ \1 _9 \8 v+ o$ w
- g+ g" @ ^# m) V
# echo 1 > /sys/block/sdf/device/rescan
9 d6 y. H. I; I0 F+ I
" D0 ]* t( c9 ~. @# q2 h* LResize your multipath device by executing the multipathd resize command:
; x! Y7 H, h4 ~# multipathd resize map multipath_device/ }: c, p% m( c) Q0 V- C0 y6 `
u, H w. ~8 bResize the file system (assuming no LVM or DOS partitions are used):; T. b- W, L X2 s
# resize2fs /dev/mapper/mpatha
0 Q$ W! N' S/ ]! m9 s8 e) l6 p6 r% _/ n
看的出,跟nova的处理流程差不多,主要少了resize2fs一步。
! k- l2 e. T8 r/ v4 ~1 U$ Z7 M
# D' U3 h6 @3 I! J1 B- z; Y测试过程遇到问题
9 b0 ]8 H6 ~. X; R问题: 创建虚机时提示"Host 'localhost.localdomain' is not mapped to any cell"
3 h' s s' E& y- a2 p, ]0 T [' G4 a
解决: 执行 nova-manage cell_v2 simple_cell_setup4 F( N, B9 L: q6 o0 n' E
! t q B( I! f9 h a问题: n-cpu日志提示libvirt 版本过低
. Z7 f: t+ o x( \# X/ l4 S" v, O( Z' m2 g' k8 N: j6 B* V- L6 G: \7 Z8 u
解决: 按照以下步骤升级
7 z) ^; X( V+ |5 B$ rpm -qa|grep kvm
% @+ b3 ]/ a. T! d4 F$ rpm -qa|grep qemu-system# P& Y6 E( k" L$ E9 I# X; D
$ sudo virsh -c qemu:///system version --daemon8 x. m+ D7 M" P5 I8 Y& E1 ^- d- y+ K
$ sudo yum remove qemu-system-x863 ]- }5 L2 x# N& g" ]- B
$ sudo service libvirtd restart1 i; k4 k4 D9 i1 I' _
$ sudo virsh -c qemu:///system version --daemon
) `( U$ b: x8 A: n( a! H8 E$ R5 U/ O) u6 g* A
问题: c-vol 提示:ERROR oslo_messaging.rpc.server ConnectionFailedError: HTTPConnectionPool(host='12.24.2.18', port=2379):
/ F4 B# {7 V9 ^6 \" n1 k4 YMax retries exceeded with url: /v3alpha/lease/grant (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x718cc10>:% J% x: q" c" {9 t7 b
Failed to establish a new connection: [Errno 111] ECONNREFUSED',))
& t) W8 e% s' K: tERROR oslo_messaging.rpc.server
. v# g6 U+ d" a. P1 y b" O& @8 S* u7 [) C* C9 n5 B
解决: 配错了coordination。在cinder.conf里吧[coordination]的backend_url注释掉即可。9 N0 d3 P; d0 Q& l
+ e: `, v" E% M& d
; [* f6 B9 W- u- |! _2 e
|
|