找回密码
 注册
查看: 2343|回复: 3

openstack 疏散功能nova evacuate

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-8-30 17:33:16 | 显示全部楼层 |阅读模式
[root@controller1 ~]# nova help  evacuate% v& r: z5 Q. O* O3 O
usage: nova evacuate [--password <password>] <server> [<host>]5 Q7 V0 h+ Q% M; m8 B" W
Evacuate server from failed host., Q( k; e+ H1 t- v4 m
Positional arguments:
* D* a& x, M  D: G% v  <server>               Name or ID of server.
: y6 g3 C, A4 d! Z/ ^/ ]  <host>                 Name or ID of the target host. If no host is
! g8 N6 b2 o( S/ a                         specified, the scheduler will choose one.
2 s: K7 k( J" Q# v4 U7 l0 m3 qOptional arguments:
2 F" d: Z' J5 l5 u* h! z* q  --password <password>  Set the provided admin password on the evacuated& [, G1 m1 j" X
                         server. Not applicable if the server is on shared
8 d, |; P1 `$ V+ r+ Q4 a4 Y6 j$ l                         storage.3 S$ T6 Q0 c' J9 g( V: s

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-8-30 17:35:13 | 显示全部楼层
前提条件:
7 a. O: k  |% f( U' ]openstack和ceph集成完成,保证虚拟机系统盘运行在ceph上9 \$ ^. t8 [+ X

$ c. x7 o( d2 f+ N配置步骤:0 }; C( S6 i+ |" g0 x) w5 u
1.在各个计算节点之间做root的ssh认证,可以相互免密登录
* q" {( c1 L+ v' l; i4 S6 p! _( D
- ]) e% C# p3 ]- w) r* H9 {, v' a+ v8 }2.配置libvirtd服务修改配置& J5 _4 g0 ^/ \5 V6 u  i
* B& j1 C6 ^: U) O- o% Q
# vim /etc/libvirt/libvirtd.conf
: i: a% Q7 b& F& f! B' i 6 ~5 [$ h; e% w) B& l; v
listen_tls = 0* o1 W5 Q5 V6 Y# l- g/ o
listen_tcp = 1
+ w* n; `7 f  O  i4 V* |* M/ p7 dunix_sock_group = "root"
; x7 f. y1 j0 d- Eunix_sock_rw_perms = "0777"9 e9 q1 n; |$ p/ \/ ?8 C# D" X
auth_unix_ro = "none"( O7 Y+ M  f. y6 ]( ^& I+ f5 Q4 u7 p
auth_unix_rw = "none"5 W/ I- h0 m0 w$ y2 K: G
log_filters="2:qemu_monitor_json 2:qemu_driver"
: A: k( O+ c% Q% klog_outputs="2:file:/var/log/libvirt/libvirtd.log". W7 b: O5 w8 d) p6 [! g0 L
tcp_port = "16509"
$ W! O) e( L4 _' ^1 [. Hlisten_addr = "0.0.0.0"3 u% z7 |  Z7 x8 i9 ]1 N
auth_tcp = "none"
1 j2 }3 J) f* a9 ^+ L修改配置9 E; k. z, C2 d* P2 c

1 v. b( D8 [* {# Jvim /etc/sysconfig/libvirtd
* }" ^' z& k, r8 U; O# Q
# R  v' q2 U$ x+ U9 l( ALIBVIRTD_ARGS="--listen"0 o' b: u' ?) ~/ E$ }
#重启libvirtd服务) c3 t- R  i' t% V
: O2 z" [8 L# u$ p8 J
# systemctl restart libvirtd
1 q9 f) i9 a) M+ B3.执行热迁移
' {) h  T: s. V7 E% K/ N7 ^- G+ D$ d1 @' {+ B. c
# openstack server migrate 3aa7f750-0867-43e8-accb-d2262ab99932 --live compute017 p+ b4 p  f/ [" N) m4 H- y5 m! A5 z
4.疏散步骤
3 p: Y& N$ F# b4.1 主机查询' o/ b" |; f; j
0 P4 s  [* t7 }9 [' [& B
# openstack host list7 t# q, g$ i  b; \, r* E, |3 I  J
[root@controller1 ~]# openstack host list
8 X8 ?( D9 z$ h+ ?5 X' R+-------------+-------------+----------+
" l# p+ u1 X5 P* s- N( g| Host Name   | Service     | Zone     |- {: s4 I1 t, ^3 _- [) }' l7 C9 g
+-------------+-------------+----------+2 ?% R, D0 T& p/ x
| controller2 | scheduler   | internal |
8 K/ h9 c( b1 _8 M: z5 U2 W5 L2 p; j| controller3 | scheduler   | internal |- J# O. i( o$ o: n- t
| controller1 | scheduler   | internal |
, }$ E0 f. X9 o( I6 r& V| controller3 | conductor   | internal |
# O0 c# w# G2 T! t9 |1 Q! x+ w0 I$ D| controller1 | conductor   | internal |
; p) {  j0 Q1 S0 y: Y: M| controller2 | conductor   | internal |% `7 S7 K5 t  s( m+ q
| controller2 | consoleauth | internal |* W# E. n7 s& m" V: K4 M5 r
| controller1 | consoleauth | internal |& a7 [8 ~- b7 ^4 ?, P/ w8 v4 U" H
| controller3 | consoleauth | internal |
7 s$ k' J- \. M) c# k" n| compute02   | compute     | nova     |6 B" M9 D/ \7 _4 c) e
| compute03   | compute     | nova     |/ E8 _7 u4 b- ?& |2 K& |
| compute01   | compute     | nova     |2 h4 Q1 S" d* d- z. Q
+-------------+-------------+----------+8 B9 x6 f  ]8 l2 F

6 E- J9 F% @2 P) L8 B& z/ ?
" x3 u8 E& t$ I2 b) b$ H6 o4.2 执行疏散
' _6 {- I! d& C# E' @1 A, N) @& l4 n
一台计算节点的所有虚拟机疏散到另外一台计算节点) ~% N2 k/ U2 U# F( c2 H% O; Z( `7 z
3 e* d& J2 v; \2 g# W; @

6 F( D; R2 H; B
$ e# ^* g8 Q' X! c0 a# nova host-evacuate --target_host compute02 compute01
" R8 a$ v4 d# L; \, m$ x7 E一台计算节点上的一台虚拟机疏散到另外一台计算节点
5 I2 i8 ?9 Z9 M
* {; H* f6 j1 r! [3 y; T# nova evacuate 3aa7f750-0867-43e8-accb-d2262ab99932 compute02
( E2 u6 s% j4 y9 W& }4 N( s- u. s: g. i- D9 h5 J, l) p

) y: L3 `6 \. x# C[root@controller1 ~]# openstack host list % i1 J$ p6 z, ]6 R6 {
+-------------+-------------+----------+
& x$ O) K) y2 n7 N* i* j2 f| Host Name   | Service     | Zone     |. L7 E0 g' E: e$ r( z& i
+-------------+-------------+----------+9 Q6 M( g+ p8 b% k% D% O4 [) V0 \; l
| controller2 | scheduler   | internal |
) b1 Y0 I6 B7 t, D8 G' o| controller3 | scheduler   | internal |2 v8 ^; K; z0 `
| controller1 | scheduler   | internal |
+ X$ B2 D7 K! V: h| controller3 | conductor   | internal |) Z! M3 T8 W* @
| controller1 | conductor   | internal |
& C/ ~& H4 K! ^5 A* B| controller2 | conductor   | internal |
/ U* d+ f1 N/ W2 S; d9 I5 y: _| controller2 | consoleauth | internal |* `7 D8 D0 P( U8 Y. E
| controller1 | consoleauth | internal |
* }2 K$ S1 i+ }* P! h) B| controller3 | consoleauth | internal |8 C. T0 |# w* [( e4 x0 [) F
| compute03   | compute     | nova     |
( t! p# k. }+ V3 U/ N8 ]| compute01   | compute     | nova     |& w' H/ S+ Q% A+ @. X# r
+-------------+-------------+----------+3 ?  S+ I  K0 z% y- t$ @

3 o- G( X5 \5 p: {; N; D[root@controller1 ~]# nova host-evacuate --target_host compute02 compute013 U' g( H$ V/ ]7 e1 J. t$ L+ t& e0 M
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
, e. P+ ~0 i) \9 k4 f* X* f6 N, O| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
' `4 {3 k8 |! c+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+( _4 p) w6 O* G" E% n9 ~9 G
| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | False             | Error while evacuating instance: Compute service of compute01 is still in use. (HTTP 400) (Request-ID: req-a53b7625-8718-4fe9-9c90-ba67bc79c5bb) |. f5 ^- R# ~5 a  z
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
7 x4 L2 \( f. m; x5 ?1 `: |7 B[root@controller1 ~]# nova host-evacuate --target_host compute02 compute03
. E: N; Q9 Q) C+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
% |4 g) S9 C7 ]& t| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
* P/ c$ o" @$ q+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+  D" V+ w& J8 X' N
| 347d5d2e-1516-41ef-b247-a42bc72e093c | False             | Error while evacuating instance: Compute service of compute03 is still in use. (HTTP 400) (Request-ID: req-d6940859-0d1f-4453-b6b7-16091b602b39) |6 ]9 S/ _8 X, T
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
5 E  o" u! k: _7 a& n7 f( R( E" ]/ D" Z; }
[root@controller1 ~]# nova list 5 @! a; j6 U( f& u$ `0 I
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
. E) Y2 n" t  y1 y& \| ID                                   | Name     | Status | Task State | Power State | Networks                            |
7 Y& M# b# N( ~2 v+ I% h( q+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
# I* r. U% v5 s1 Q1 n! W| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
( W1 i% [  A6 ^4 c! I/ M| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |- T# P0 v8 z* d/ L. r
| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |# y8 g2 m) ?5 P
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
* I- R% O% h: H4 T1 G+ x8 F[root@controller1 ~]# nova evacuate  7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 compute03
7 R+ o5 ?& G7 f0 ]6 ^8 W[root@controller1 ~]# nova list % ~" C% v/ N0 f; g5 m
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
+ }+ `9 _6 Q4 D" k- H' O| ID                                   | Name     | Status | Task State | Power State | Networks                            |
/ W# H/ {. m! a5 }+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+* Z3 P6 d. \3 O3 Z  L6 `
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |+ u- e: w' C2 a: F$ c1 a
| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |
# I: R4 e1 ~- m/ R% k2 P# I$ z; B| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
4 s6 [7 \4 ~/ Q' j1 A$ j& }" p+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+7 F& N- p( @2 W+ }* Y
[root@controller1 ~]# nova show 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2
% ~8 c9 [8 _' `! o+--------------------------------------+----------------------------------------------------------------------------------+9 C' `. G% \7 W* ]
| Property                             | Value                                                                            |5 r* J) A  h1 D4 o6 o* i* C+ P
+--------------------------------------+----------------------------------------------------------------------------------+3 M! C2 U( L2 W  @; ^. O* Z& s1 {
| OS-DCF:diskConfig                    | AUTO                                                                             |0 O5 t+ _& J/ O3 V+ f
| OS-EXT-AZ:availability_zone          | nova                                                                             |8 ~& l9 h0 [( }
| OS-EXT-SRV-ATTR:host                 | compute03                                                                        |
4 d- O1 z/ {* ]; e  Q| OS-EXT-SRV-ATTR:hostname             | test1                                                                            |( k1 \# N5 Q- a
| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute03                                                                        |/ X- h8 J) E9 n0 `* u/ b
| OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                                                |# ~, Y+ e2 `# @
| OS-EXT-SRV-ATTR:kernel_id            |                                                                                  |2 q  S7 ?- A3 i+ ]# b
| OS-EXT-SRV-ATTR:launch_index         | 0                                                                                |4 V- R7 k( j/ r: E" U6 W
| OS-EXT-SRV-ATTR:ramdisk_id           |                                                                                  |
9 S$ v) B& G8 k' E# A  ?| OS-EXT-SRV-ATTR:reservation_id       | r-uqofhf0v                                                                       |
: G* M. F) x5 L4 T| OS-EXT-SRV-ATTR:root_device_name     | /dev/vda                                                                         |
& w3 `3 v( O/ Z2 \1 Y: X( v3 B| OS-EXT-SRV-ATTR:user_data            | -                                                                                |# C2 o6 [( U1 {) j+ v
| OS-EXT-STS:power_state               | 1                                                                                |# W+ N( U: T; V- G- P
| OS-EXT-STS:task_state                | -                                                                                |
1 l  q% T8 T; y7 a, E/ O| OS-EXT-STS:vm_state                  | active                                                                           |2 w7 n2 O  m# V
| OS-SRV-USG:launched_at               | 2021-08-31T01:25:16.000000                                                       |9 m$ c& ]3 r' v+ X; w: _; A  |3 D3 m! P
| OS-SRV-USG:terminated_at             | -                                                                                |# w% m8 f0 R$ D2 K; j
| accessIPv4                           |                                                                                  |0 [# H+ `  C0 J: F
| accessIPv6                           |                                                                                  |
; C! d" o4 ~* }% W| bridge network                       | 192.168.0.206, 192.168.0.233                                                     |
# f: s; M3 ?; ?7 U| config_drive                         |                                                                                  |
) D6 s* q- D# J3 H3 |7 \| created                              | 2021-08-25T07:37:43Z                                                             |
( d) i, W; D6 K6 Y| description                          | -                                                                                |
) T6 C4 |' E9 ], k, o1 }. t8 I  N3 X| flavor:disk                          | 10                                                                               |% N" z8 c7 j) m6 u6 @, [, [
| flavor:ephemeral                     | 0                                                                                |, H4 p3 F. ^2 p4 s7 B2 `+ O
| flavor:extra_specs                   | {}                                                                               |, y/ q; F+ J& s5 h( c' m6 V4 _
| flavor:original_name                 | type-1c-1g-10g                                                                   |3 ?: p" D' X+ V% W
| flavor:ram                           | 1024                                                                             |
. e" L& \; h& Q2 \2 i, l# E5 Q| flavor:swap                          | 0                                                                                |
! n, k2 G- l7 ]# O( b# C| flavor:vcpus                         | 1                                                                                |3 I  U. E0 C' x, A3 F+ P, T  A
| hostId                               | 35bcc54020d6ae54aebe586983a9df9d8562a0201cea0c0d85e39455                         |+ T' @8 W: s. s$ D/ W, E
| host_status                          | UP                                                                               |. k0 X  R/ I9 F0 X7 J8 l  w/ Z
| id                                   | 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2                                             |9 u7 Y0 p3 |: w! h# o
| image                                | Attempt to boot from volume - no image supplied                                  |
, K* {8 ]0 \9 G& T( C' c+ A% m* z| key_name                             | -                                                                                |5 c0 R* r. M. d; K) S4 ?
| locked                               | False                                                                            |, d" o; R& O: o  I8 D/ |' o4 X
| metadata                             | {}                                                                               |
4 T, z2 ?) o1 z7 S  A* U" x$ n| name                                 | test1                                                                            |
% D4 }  z" L& L' g| os-extended-volumes:volumes_attached | [{"id": "d385a405-529b-450e-98e7-44aad0d3e94a", "delete_on_termination": false}] |5 P' k, h3 r; b: c, C
| progress                             | 0                                                                                |0 o/ A$ U, J% f, Z
| security_groups                      | default                                                                          |
1 X) c2 G, b8 _: |" B| status                               | ACTIVE                                                                           |$ p; i8 q7 A; ~5 O9 G( k/ G
| tags                                 | []                                                                               |8 v! [6 ]. ~6 S4 ^$ E' X* g
| tenant_id                            | 92a5a26fc14d418d881ade0ccbcffc59                                                 |/ G+ ]  E4 y0 N5 m6 W
| updated                              | 2021-08-31T01:25:17Z                                                             |; N7 e2 ]3 [4 T2 Z$ D6 O" P) c$ T
| user_id                              | b1ffbc1f84cf42c99a8e59fdaf7f1cf5                                                 |: b- a+ z7 T+ Y
+--------------------------------------+----------------------------------------------------------------------------------+- A6 w: g2 _( v/ `( v) S! Y4 y
————————————————/ Y" T5 x/ _/ M- o0 ^1 w5 W

) j1 U7 H1 z3 n; N
! q, p& e1 k/ I( f) K# @

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-8-30 17:35:43 | 显示全部楼层
一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。
" Y8 O- v+ ?% `; Y. _这可以是OpenStack计算节点HA的一种实现方案。& [: z# `, I! ?' l) \
4 c. E" A( F9 {# l
二. API调用
$ e7 U1 j+ {" W* [7 y6 l( s7 wnova.servers.evacuate(server=fm['id']), on_shared_storage=True, F' z# ~0 x. H
1. on_shared_storage参数在2.14版本后废除,自动检查是否为共享存储。
  r# y* ~: N9 N5 `; V& o- X    共享存储能够保证实例在另外新节点重建后数据不丢失
9 _( n/ ?3 u- k, e; |9 {; d2. 可以设置目的主机host. a2 }9 V' i/ P& I' B
    如果不设置host,nova会通过scheduler选择一个新的主机(不会分到原主机,因为rebuild函数中过滤了原主机)8 D& O3 }7 G  F/ Q. Q# b
3. 这个调用只是发送了evacuate操作命令,具体是否真正疏散成功,无法知道
+ T, q, E/ q' q# p% [9 C9 C3 s$ |3 I! i4 z: E* C
三. 源码分析
% o; t" W# k+ i4 |& F/ o对应的是/nova/compute/api.py
. D. ~' P4 _! ~$ y@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED,
3 ]0 F. d6 z; `4 S/ M; w                                vm_states.ERROR])( F; ?7 F  s% m; x: d$ a
def evacuate(self, context, instance, host, on_shared_storage,; m5 m4 p# O$ S1 \/ g5 D7 Y
            admin_password=None)
6 c" E) h- W2 J1 a+ f: [1. 函数上方有装饰符 @check_instance_state: w, s3 u3 t: E$ q9 t( `
表示在执行evacuate方法前先执行check_instance_state:检测传入的instance的vm_state是否为ACTIVE、STOPPED或ERROR。如果不是这三种状态,不能执行evacuate方法。
. ^0 B# K1 E$ ~( G  q2 j+ x
8 ^. {' S7 F1 }: }  ?- ]2. 首先检测instance所在主机的状态是否为down,如果不是down(比如up),执行会出错。: y' a5 Q& ~2 s
LOG.debug('vm evacuation scheduled', instance=instance)
. X, }8 B8 S% s# w3 U6 G0 Y# 原实例所在主机8 A( `) J# i* ]( }, b
inst_host = instance.host
6 b, x% A" j; J+ I/ l1 b# ?2 x( lservice = objects.Service.get_by_compute_host(context, inst_host)
: C- e8 t7 A- c# 首先确保compute主机的状态为down2 e: ]: v$ \6 x) i: g" S
if self.servicegroup_api.service_is_up(service):
  M, f! T: e. R2 r# {    LOG.error(_LE('Instance compute service state on %s '2 f" G- ~2 u# {6 h! s. e
                  'expected to be down, but it was up.'), inst_host)
2 @: C+ P( m2 q4 O6 d# w    raise exception.ComputeServiceInUse(host=inst_host)9 Q: |) X& e8 ~1 Y) V% S3 s

& e6 b9 }4 d1 f( L' I2 P5 X3. 记录action执行操作4 G. U) i% {) d4 Y
# 实例的任务状态设置为REBUILDING
1 |. c! \! G8 t% u$ |instance.task_state = task_states.REBUILDING* Z0 m6 R5 v9 b) A) ], v" a
instance.save(expected_task_state=[None])
* J/ \' P+ d8 h, R  l. ?$ v  Q- t* Hself._record_action_start(context, instance, instance_actions.EVACUATE)- T- W6 B7 e2 I/ U% _3 p
' @% ?$ K/ `! \% F4 @1 Y
4. 初始化迁移类0 ~2 t  k  V- }. y: p" T. e
migration = objects.Migration(context,4 A" M, N3 n+ f
                              source_compute=instance.host,4 t% o& g6 L% ]4 z9 F# J
                              source_node=instance.node,
4 U) Y3 m1 x. u                              instance_uuid=instance_uuid,( ~5 g/ x+ d* t. o
                              status='accepted',
- v  D7 N1 Q0 `2 A3 O! t9 ?                              migration_type='evacuation')
6 r" U6 Q3 U$ R. m# J& z5. 创建迁移(这里为什么要创建migration,并没有执行迁移)
7 E6 o/ \' h4 ^/ Q& Y3 R6 B# 如果提供了目的主机
7 o; K4 p, C' X; w( a* nif host:
; x5 s, s$ ~" X3 Z' J    migration.dest_compute = host
. T/ X& ]" |( i7 H+ }+ ], N) ~migration.create()
6 Q% b0 S6 f5 e1 C
" B1 [2 t# @9 d* q; t$ R6. 发送消息通知实例的使用配额/ D# h) K0 a. L2 I
compute_utils.notify_about_instance_usage(
$ A& R; n5 T6 F, v( a1 s$ ?; j    self.notifier, context, instance, "evacuate")# x$ o* p0 V2 h

2 B* A8 c+ h) f( p% D. ~& D7. 最后执行task任务:rebuild_instance
, {4 z! ~; a2 c所以evacuate的本质是在新节点上执行rebuild操作" F: F* c4 i0 ?; G" L
return self.compute_task_api.rebuild_instance(context,! j. c) X1 \' e& a9 ]
            instance=instance,8 v8 Q6 }% T6 F7 W' x
            new_pass=admin_password,
: f/ n8 b' F6 k            injected_files=None,/ S1 Y1 `6 s0 @" g, j. c+ `
            image_ref=None,
5 b- _4 n! \1 e: F) [            orig_image_ref=None,2 h# F0 q' J1 A' w; |- J6 [- K
            orig_sys_metadata=None,, R, u( d; {) `8 J
            bdms=None,2 s6 d; n1 Y% @( G2 K
            recreate=True,
6 \& ^0 j( u* Y- `            on_shared_storage=on_shared_storage,
" g) C7 U8 @  W- ?            host=host)6 J: G5 S& [8 ]7 O# l% O' o! \
深入分析rebuild_instance方法,通过各种rpc调用,最终具体执行的是/nova/conductor/manager.py$ s9 t' y- H. \+ m
def rebuild_instance(self, context, instance, orig_image_ref, image_ref,
) `6 D) T/ z8 K  ?                    injected_files, new_pass, orig_sys_metadata,
0 `! v6 a. n: R                    bdms, recreate, on_shared_storage,
. n7 o. _1 }( U' ]8 l7 l$ N                    preserve_ephemeral=False, host=None):" Y2 V3 ^( P" l7 ?
(1)在选择新目的主机时先排除instance所在主机
# m# i: R( ]3 h- O$ ?4 J; v这样能确保不会在原主机上执行rebuild操作6 N7 o% m. T  e2 B5 q
# 排除原实例所在的主机,即不能在同一个主机里进行rebuild3 @. z5 I- s: p0 [% j: g
filter_properties = {'ignore_hosts': [instance.host]}# d! L* s: e2 V* k
hosts = self.scheduler_client.select_destinations(context,
& _. s) @. Z4 h! e) [6 Y5 }                                        request_spec,' w% e+ N1 d. v( N2 @7 X/ _& J( E
                                        filter_properties)
4 l2 {4 ^6 k# J" {! |; [4 E0 u(2)接下来会通过scheduler模块筛选出合适的新主机
  R0 T, A- d  \" {2 E" ~+ ?(3)如果没有选出足够的合适新主机,则抛出异常7 q- S) V" }' T9 @
except exception.NoValidHost as ex:: Z6 A) q) b/ Y  I
    with excutils.save_and_reraise_exception():  ]+ T1 z6 _( N& W: y/ m
        self._set_vm_state_and_notify(context, instance.uuid,/ \9 `$ ~) P5 }: w- W0 \
            'rebuild_server',
! n6 }) h& x' F" K5 k8 W            {'vm_state': instance.vm_state,
2 d& y3 L" }0 h! ?: d, A0 P8 I            'task_state': None}, ex, request_spec)  `5 t# p: ]6 W+ @( W, u
        LOG.warning(_LW("No valid host found for rebuild"),. w" [( n: }7 D/ u2 y( L
                    instance=instance)- k$ R- M3 P9 j6 M$ s
不能选出合适的新主机,有可能是除了原节点外,其他节点都不可用(computer service status:disabled)或网络不通(computer service state:down),导致没有合适的新主机。0 x4 p( Q  V; c# `2 N, E' H7 Y
9 i) o' b2 i; q  k" E

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-8-30 17:36:52 | 显示全部楼层
前言: 因为机房服务器运行不稳定的原因导致计算节点挂掉,然后上面的Centos7虚拟机在迁移之后开机报错。这个解决方法同样适用于其它操作系统的虚拟机。基于镜像创建的虚拟机实例。
I/O error, can't read device /dev/vda 的报错信息
首先做疏散先把虚拟实例从宿主机上面疏散到其它主机,关闭云主机。

9 Z/ D( K- x( O2 x& S7 p2 y0 m2 e
1.找到虚拟机的ID可以通过dashboard界面或者使用openstack server list命令,找到虚拟机的ID;然后查看虚拟机的详细信息。
比如:
nova show 8fa3d2eb-2401-48a9-850a-f800314c6950# 与这个命令相同功能的命令还有openstack server show ID
连接到所在的计算节点,实例名称确定是哪台主机。
注意要主机是开机状态才能看到
通过ID可以确定该虚拟机实例的数据目录,如果openstack没有对接存储的话那么在这个目录下就会存在数据文件,因为对接了ceph所以信息在libvirt.xml的文件里面。
cat /var/lib/nova/instances/8fa3d2eb-2401-48a9-850a-f800314c6950/libvirt.xml 里面就是它的vda的ID。
2.当找到这个磁盘的ID之后,在ceph集群里面去查看这个设备
rbd ls volumes | grep 8fa3d2eb-2401-48a9-850a-f800314c6950
3.取消它原来有的一些属性
# 查看卷rbd info volumes/0859147d-27aa-49a5-8373-7c515c4f3a02_disk#取消它原来有的一些属性;根据ceph的提示操作,因为有的属性linux不支持。rbd feature disable exclusive-lock object-map fast-diff  deep-flatten --image 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes
4.把它映射到本地
rbd map 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes# 如果映射不了执行下这个命令。rbd flatten volumes/8fa3d2eb-2401-48a9-850a-f800314c6950_disk
5.使用命令修复
# 有的可能修复不了就只能做好丢失数据的准备了xfs_repair -L /dev/rbd0p1可以ls /dev/rbd* 查看一下,rbd0p1表示的事一个启动分区。
6.取消映射
rbd unmap 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes
这个时候再重新启动就正常了。2 r# D( c' G+ D/ d5 [4 k" [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 02:19 , Processed in 0.023868 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表