将设为首页浏览此站
开启辅助访问 天气与日历 收藏本站联系我们切换到窄版

易陆发现论坛

 找回密码
 开始注册
查看: 270|回复: 3
收起左侧

openstack 疏散功能nova evacuate

[复制链接]
发表于 2021-8-30 17:33:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?开始注册

x
[root@controller1 ~]# nova help  evacuate- N( Z) c6 U" \
usage: nova evacuate [--password <password>] <server> [<host>]
  e3 H9 ?- D1 a  rEvacuate server from failed host.6 k0 E8 {- r: I6 p5 n
Positional arguments:& c1 C! s7 c9 d% k4 w$ B6 j+ c
  <server>               Name or ID of server.
$ D" l  [: v1 O. [0 M4 K  <host>                 Name or ID of the target host. If no host is
9 F& q. M: j9 G) [! f& Y! N5 ~                         specified, the scheduler will choose one.
8 `, T$ ^5 m* U. J" DOptional arguments:/ z, m  C4 S/ Z6 y8 i( t  w
  --password <password>  Set the provided admin password on the evacuated5 c* ?4 I$ r4 P) r2 G6 [
                         server. Not applicable if the server is on shared
0 }6 ]4 M! q: Z+ W: z. x. C                         storage.
" C8 u/ i" H$ g7 W# ~! p
 楼主| 发表于 2021-8-30 17:35:13 | 显示全部楼层
前提条件:8 m2 t: F3 d1 U0 ^( C# u& m
openstack和ceph集成完成,保证虚拟机系统盘运行在ceph上
$ T# }. x* e, q: K  y& S- N4 ^; q0 i3 H& H: m, b/ Q; a2 e% V
配置步骤:
2 t7 }- e+ C9 F1 @/ e1.在各个计算节点之间做root的ssh认证,可以相互免密登录
. T4 S6 i' s1 G/ D4 J( k
3 g; v/ k# a# |8 K  \: @6 B9 E2.配置libvirtd服务修改配置
/ a. q, ^* T* j. H  q; x5 v# F+ u! p8 x
# vim /etc/libvirt/libvirtd.conf
7 K. l' j4 N  \ + a4 D0 X8 @$ I. x4 O+ |/ M
listen_tls = 0
3 @" t# S) r, z5 j" r* klisten_tcp = 1  X0 b" Z& {3 m) ^; e
unix_sock_group = "root"
  W% _' ^- Y" Q4 Y7 H; t& x- F. uunix_sock_rw_perms = "0777"- ^$ |* n( y" v$ H
auth_unix_ro = "none"
( W+ }5 I8 E/ I9 _auth_unix_rw = "none"1 V, l7 B0 @% u9 f' A* G
log_filters="2:qemu_monitor_json 2:qemu_driver"* t& E) g/ {% R* B
log_outputs="2:file:/var/log/libvirt/libvirtd.log"
5 i& @' I% B4 P) ]$ Q4 S+ Gtcp_port = "16509"
, U: f6 D; S# d* O2 jlisten_addr = "0.0.0.0"
: A4 q2 H* C, s) Sauth_tcp = "none"" G2 z3 _  B% {7 P& s
修改配置! }* u4 L1 o' J) c: S9 }
( z% ~0 a, `; N: L) W
vim /etc/sysconfig/libvirtd
  B5 v$ S) K* \% W9 J) I9 k$ r # t' H1 y# S+ q( k, m' c7 b
LIBVIRTD_ARGS="--listen"
$ i0 v  F! t$ P8 G! N5 F2 K#重启libvirtd服务
- f5 }' t0 l, Q7 \4 C' l. T. h8 A; Y# U, A" {# K
# systemctl restart libvirtd
! u0 Q/ b" X" y- \; K4 |3.执行热迁移# X& \$ Q+ {" H3 `

- x* B: _9 j0 ]- {/ R# openstack server migrate 3aa7f750-0867-43e8-accb-d2262ab99932 --live compute01% ^' a3 j! e. X0 {9 R/ r
4.疏散步骤
# P* Z/ I! U! i; U4.1 主机查询1 i7 K, J1 V- z) o) u# G

- ^& Y; @& Z* U! E9 w' l0 A/ t' ]# openstack host list! ~8 c. U( a4 e" S2 ^& n. u
[root@controller1 ~]# openstack host list ' |$ G% Q# l- m3 c1 x# _# x1 v
+-------------+-------------+----------+8 e9 k$ A  r! Z
| Host Name   | Service     | Zone     |" h" A6 G" w+ H; K" B2 O5 v
+-------------+-------------+----------+: u/ R. ?) D4 w2 S2 ^
| controller2 | scheduler   | internal |1 v; p& _: X( {
| controller3 | scheduler   | internal |
- ~+ l! u% D8 }, [| controller1 | scheduler   | internal |9 M  r7 J* E* v
| controller3 | conductor   | internal |0 p( Y1 z8 l" C4 ^
| controller1 | conductor   | internal |
+ r; q; Q7 a, g/ `) b4 F! h| controller2 | conductor   | internal |
; T1 X; m; y/ W( _0 [# r! t2 F| controller2 | consoleauth | internal |
" A+ b) z7 c& x" C+ [| controller1 | consoleauth | internal |& x5 @% v! T/ ]+ _! U1 ~' w
| controller3 | consoleauth | internal |
8 m( w2 H, n1 || compute02   | compute     | nova     |
' A8 H& F$ }0 b8 |4 I6 o" W| compute03   | compute     | nova     |
/ d" m" z6 b& h| compute01   | compute     | nova     |6 b' D8 O4 c9 @
+-------------+-------------+----------+
" P: y3 V( `$ H  e4 N" Y2 L4 g1 y
4 L% ~' U$ i- T( W8 B
4.2 执行疏散
' u3 \+ z$ V7 V$ ?: z' l$ G* y& v
4 e6 s: L+ V- V! n( f一台计算节点的所有虚拟机疏散到另外一台计算节点6 @( h* P5 T5 y6 N

! Q7 F) v& P4 k* ]& S6 d- V" L( L% v. E$ A

  j6 o4 r1 N. M! ]7 i# nova host-evacuate --target_host compute02 compute01
$ j% Y4 D+ Y6 D" z$ r" N一台计算节点上的一台虚拟机疏散到另外一台计算节点
" T/ ~; e+ K4 \
* \, M/ h* V, w# nova evacuate 3aa7f750-0867-43e8-accb-d2262ab99932 compute02- m. k1 t# {5 D/ V  s$ [

$ o5 x' W8 R& P- q4 v* Q! h4 v, |) H; `# V# `' {
[root@controller1 ~]# openstack host list - G$ K/ t( M2 U& [7 b
+-------------+-------------+----------+
5 O4 ?. m7 H+ @# `$ N| Host Name   | Service     | Zone     |6 T$ _5 y+ s$ n8 u5 K, `
+-------------+-------------+----------+
$ }8 [3 O% B* ^; M% @| controller2 | scheduler   | internal |% `/ q. \: @" L& P8 o# r5 x
| controller3 | scheduler   | internal |
  n* h& @1 ^: c3 Q" V' || controller1 | scheduler   | internal |
0 b+ Q! h' }& w| controller3 | conductor   | internal |
) {1 t+ w" {: n2 e6 O: `' B7 L| controller1 | conductor   | internal |
; e+ a" C0 b* F2 u, H5 U| controller2 | conductor   | internal |" V% O( I4 ~" I
| controller2 | consoleauth | internal |
8 l: p' f  A7 a* U% U" O. v| controller1 | consoleauth | internal |
3 K9 G$ L2 J4 q! A. z# E1 r| controller3 | consoleauth | internal |
# J$ q# i: y: V- j| compute03   | compute     | nova     |
. G) x( M3 v5 }| compute01   | compute     | nova     |
% g7 b, w  G" w5 ~) o* S. w+ x+-------------+-------------+----------+
# m% M9 F, r+ k4 T3 K& e. _* K3 y/ y, L
7 w* g$ b, T2 u8 u[root@controller1 ~]# nova host-evacuate --target_host compute02 compute01
# q9 l& }8 c1 E9 }+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
- R/ |7 M+ B' V8 s| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |$ [% e1 U/ G7 p4 E5 t' g1 `
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
9 x. |0 ~% R! x' n% v9 D/ G; f| 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) |$ \0 \1 o$ c6 a; I9 i
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
& m; ?: n9 O$ V0 S[root@controller1 ~]# nova host-evacuate --target_host compute02 compute03; d  T5 s! e- m0 {" d: W
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
( }( F8 c, y1 k# ~3 o1 @" V1 J| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
. D( \8 b5 e& ?7 c" C: s& O) ?5 N+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+  X6 p* }$ Z7 G; i' a% u' O
| 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) |% E: J2 D# S5 R6 b7 ]0 f) P+ d$ Z) F
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+- t' F' N( a! L7 Z3 z7 t

& b0 Y: N# c! R4 m+ }[root@controller1 ~]# nova list ; _6 {; x8 `; \5 b( n' @# k, g
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+/ D2 V) v* |0 Q+ E; ]" j
| ID                                   | Name     | Status | Task State | Power State | Networks                            |3 y( }3 A0 t# W' \0 R3 O/ w
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
. I& r1 O/ y+ t8 \# I  `| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
# ?3 m5 o5 K4 ]6 I* P/ e| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |
' Y7 ~& t/ q! s, p6 c2 \) N+ {- }" t| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
* }( U6 d4 _: Y+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
2 Q$ @7 e: ^; n6 H9 y6 F, T[root@controller1 ~]# nova evacuate  7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 compute03
8 B! |2 H2 M& s9 A[root@controller1 ~]# nova list
2 H4 v: _' _" p, n4 h+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+) j( s/ c0 s) `( ?. U2 n
| ID                                   | Name     | Status | Task State | Power State | Networks                            |" t" g/ R! X/ Y0 q, Q. j, g
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+& Y" N  \; Z5 T$ k# d" G, O0 E
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
+ i: T* l2 t- J! v1 J| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |/ [) Y" D5 S- B$ I2 F) n- E
| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |: \5 o* k/ |2 {8 _
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
+ `; S5 o/ D; g  }" {0 k[root@controller1 ~]# nova show 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2" v% I8 }+ F* _* Y0 {
+--------------------------------------+----------------------------------------------------------------------------------+
& s5 r* D( [; J| Property                             | Value                                                                            |
7 d) R/ j  Y$ C; d/ t+--------------------------------------+----------------------------------------------------------------------------------+
) l' t* l0 t" {4 \" L| OS-DCF:diskConfig                    | AUTO                                                                             |
) L6 ]- z5 D* M) J1 c| OS-EXT-AZ:availability_zone          | nova                                                                             |
+ [3 \3 `0 M- u: A! h| OS-EXT-SRV-ATTR:host                 | compute03                                                                        |
7 ]; F3 X  X  a* {! h3 V, g) ^: ~9 p6 A| OS-EXT-SRV-ATTR:hostname             | test1                                                                            |
3 Y8 }# c& T" h, `) d8 k| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute03                                                                        |! H6 [+ H2 h4 v: v4 V* P
| OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                                                |, r! V( h( ^) v  ]# X( r
| OS-EXT-SRV-ATTR:kernel_id            |                                                                                  |: S8 j) t. @) K
| OS-EXT-SRV-ATTR:launch_index         | 0                                                                                |
$ q: h' x  b) W2 S% @" ]| OS-EXT-SRV-ATTR:ramdisk_id           |                                                                                  |) Q3 X* s2 N2 h2 V. y! p; F% C! S" b
| OS-EXT-SRV-ATTR:reservation_id       | r-uqofhf0v                                                                       |
" y" Z9 _% r" p" y| OS-EXT-SRV-ATTR:root_device_name     | /dev/vda                                                                         |
, D: z. Z3 u- I6 U: Y1 T| OS-EXT-SRV-ATTR:user_data            | -                                                                                |0 x7 @% L9 }; s7 m  c  }. O
| OS-EXT-STS:power_state               | 1                                                                                |
) F5 Y5 {1 F: a" p& d| OS-EXT-STS:task_state                | -                                                                                |
7 ?9 h6 E! R  ]( i1 p* g$ D3 \. A| OS-EXT-STS:vm_state                  | active                                                                           |
7 e$ I  O3 a  V/ Z! u9 h| OS-SRV-USG:launched_at               | 2021-08-31T01:25:16.000000                                                       |: h9 ?% A; S4 Q3 i, p- n/ S. i- {
| OS-SRV-USG:terminated_at             | -                                                                                |
5 q: g$ y/ e' c! x2 `6 _/ ^| accessIPv4                           |                                                                                  |3 x! j& G1 p  w' _
| accessIPv6                           |                                                                                  |, }# h* d9 }/ _4 l  t. V$ G  e
| bridge network                       | 192.168.0.206, 192.168.0.233                                                     |
, w/ q9 V* B& i) M/ r: \$ b6 K% C| config_drive                         |                                                                                  |
$ A6 @( e3 c- p4 X1 ~| created                              | 2021-08-25T07:37:43Z                                                             |
  a9 y% J6 ]- ]4 q% G6 v& X| description                          | -                                                                                |6 D3 c9 {1 ]* Z, X) v
| flavor:disk                          | 10                                                                               |. d4 [+ ]. _% ]: G- A( C
| flavor:ephemeral                     | 0                                                                                |
4 n; `+ q( R# n* r2 C| flavor:extra_specs                   | {}                                                                               |  d/ l, J6 f- h; D/ B, |9 B2 |6 @
| flavor:original_name                 | type-1c-1g-10g                                                                   |
/ r6 j3 \# W8 d; N4 U| flavor:ram                           | 1024                                                                             |
+ r+ b# q+ B, N. k% s7 O| flavor:swap                          | 0                                                                                |
% M* V& C" X: H* N| flavor:vcpus                         | 1                                                                                |  z/ z+ m/ \. V) k3 c
| hostId                               | 35bcc54020d6ae54aebe586983a9df9d8562a0201cea0c0d85e39455                         |
2 {1 A' j1 R1 w, E| host_status                          | UP                                                                               |
$ I& |& u( l% S/ A$ o+ ]/ N| id                                   | 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2                                             |
! C4 |" z7 e% ?* x. m2 e7 r0 m| image                                | Attempt to boot from volume - no image supplied                                  |' Y8 M( ^3 @. x& Z* \
| key_name                             | -                                                                                |' I8 h7 j) U1 J
| locked                               | False                                                                            |/ x# H! C/ W0 [. ^
| metadata                             | {}                                                                               |6 Q7 t+ M: N, x/ y. G, D. k' z: b6 D
| name                                 | test1                                                                            |* d% T3 k/ w% C  Y  B# i1 v
| os-extended-volumes:volumes_attached | [{"id": "d385a405-529b-450e-98e7-44aad0d3e94a", "delete_on_termination": false}] |; t; M1 g- \' m, I9 k* d; l
| progress                             | 0                                                                                |
, o) {3 u1 B3 r! ^| security_groups                      | default                                                                          |
3 {" U8 x' I1 Y( j- E| status                               | ACTIVE                                                                           |& C# S$ u& x3 h4 S& c7 ^
| tags                                 | []                                                                               |
+ m# D0 Z0 L  B+ D) C$ G, n$ A| tenant_id                            | 92a5a26fc14d418d881ade0ccbcffc59                                                 |, l7 b- c, T- V- X! O
| updated                              | 2021-08-31T01:25:17Z                                                             |0 H3 p) ]) s5 M
| user_id                              | b1ffbc1f84cf42c99a8e59fdaf7f1cf5                                                 |
8 v# M, [! i" g& I$ M2 l& R, B6 s/ S+--------------------------------------+----------------------------------------------------------------------------------+
( o$ M# n/ @7 U( M- O  r- b————————————————
- J- S9 U& ^/ F; v& ~/ r  ~) t" `" P, F1 ^: _9 y
+ i: ^3 Z; a- n7 V& R
 楼主| 发表于 2021-8-30 17:35:43 | 显示全部楼层
一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。' i; N1 m1 d* L0 S" N7 m
这可以是OpenStack计算节点HA的一种实现方案。' G+ K  A1 i2 }, d% w/ g
- P; z! @3 D2 y/ e! s  W; e
二. API调用
, S, S, Z4 C4 U/ k0 _# Wnova.servers.evacuate(server=fm['id']), on_shared_storage=True
5 ~7 ^# N8 P9 x1 ?2 l7 C: k1. on_shared_storage参数在2.14版本后废除,自动检查是否为共享存储。
- D/ G* W  w" i& r9 H+ D    共享存储能够保证实例在另外新节点重建后数据不丢失' ?1 y3 C9 H/ K" b$ O3 o+ y
2. 可以设置目的主机host3 {8 }5 T, g7 G+ H" m6 n
    如果不设置host,nova会通过scheduler选择一个新的主机(不会分到原主机,因为rebuild函数中过滤了原主机)
  Y" p2 C! x- w3. 这个调用只是发送了evacuate操作命令,具体是否真正疏散成功,无法知道
& u% S! q7 W+ F: F1 z
5 a! _. T5 H0 N三. 源码分析1 [) \, j7 ~& K& O9 A
对应的是/nova/compute/api.py" U- m) p6 T% l. \2 T) Z
@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED,
4 q9 {/ o) A, l; A                                vm_states.ERROR])
' a& v+ R! P" jdef evacuate(self, context, instance, host, on_shared_storage,
9 E' }5 \% J. e- ]4 p" C2 y            admin_password=None)5 J, x+ X: E# ]4 x( b
1. 函数上方有装饰符 @check_instance_state
" _# o( P3 `7 [, V  A表示在执行evacuate方法前先执行check_instance_state:检测传入的instance的vm_state是否为ACTIVE、STOPPED或ERROR。如果不是这三种状态,不能执行evacuate方法。$ @% `2 Z0 e# i) z
4 E4 m' Y3 i  k8 a) z" d
2. 首先检测instance所在主机的状态是否为down,如果不是down(比如up),执行会出错。4 Q  N9 L+ q/ Y* E  g2 Z
LOG.debug('vm evacuation scheduled', instance=instance)
( c% N4 D# \+ L6 \/ p# z. {# 原实例所在主机/ A! X3 B5 Z. h! r  b
inst_host = instance.host
* T# Q% p% \; t$ J; s; |- Jservice = objects.Service.get_by_compute_host(context, inst_host)4 x( t  F! r7 g
# 首先确保compute主机的状态为down9 J" k# \* }& S0 H+ s; M
if self.servicegroup_api.service_is_up(service):: H% `6 Q5 J0 L& Q# ^  D3 ^
    LOG.error(_LE('Instance compute service state on %s '
; B  z# a5 J" d2 g( Q0 j                  'expected to be down, but it was up.'), inst_host)& e- t1 W/ k, ~5 x- p
    raise exception.ComputeServiceInUse(host=inst_host)
- |, o; ?- s0 i6 C4 p4 v/ x$ A$ ?& E( g" q$ h8 m( @( l" v( l2 r
3. 记录action执行操作+ n0 H4 G2 o# v( B6 H
# 实例的任务状态设置为REBUILDING2 i& X; Z0 k: ~9 K
instance.task_state = task_states.REBUILDING- H( }/ o* J( T( W8 @
instance.save(expected_task_state=[None])
1 R1 r% {( ]1 Q* g! Z, G) aself._record_action_start(context, instance, instance_actions.EVACUATE)* p- C: H& h& c) i- M* p8 \$ }

/ V! i! W. v. b7 q4. 初始化迁移类2 W9 ]6 [! }$ \4 F/ h1 k! S
migration = objects.Migration(context,% q. y+ H/ ^, X# i5 v. g! s7 P3 K! V
                              source_compute=instance.host,
7 j; E/ z$ i4 U                              source_node=instance.node,
/ e# [& L# `$ E5 V% G: ^                              instance_uuid=instance_uuid,
0 h* Z. F) U7 M9 b                              status='accepted',
* C. N  o- J' l$ U                              migration_type='evacuation')0 ?( o. k+ H6 r# t$ v
5. 创建迁移(这里为什么要创建migration,并没有执行迁移)4 g2 d7 v4 R9 f8 t
# 如果提供了目的主机; h9 a, ^! y  v3 D' t. k/ B
if host:
1 U/ n6 X' k4 q    migration.dest_compute = host
& S% b  s: [2 H9 D0 Z6 dmigration.create()
& }. T! K$ H, Y- Z: W1 E! |  U2 A/ U8 t; |7 U
6. 发送消息通知实例的使用配额
7 x* @0 P" s7 {: R7 f+ z. `compute_utils.notify_about_instance_usage(3 r- A# Q9 M8 o8 J, y. Z5 H
    self.notifier, context, instance, "evacuate"): N1 I- S2 ~. r- w7 A2 j$ l

. c7 ^- x' ~1 D$ e7 ^' X4 A7. 最后执行task任务:rebuild_instance/ ~! ]; X3 }4 q3 K5 x9 v+ L
所以evacuate的本质是在新节点上执行rebuild操作
; N0 K+ P* c0 m5 O/ F2 O4 Sreturn self.compute_task_api.rebuild_instance(context,
: d* h8 k' W5 a% M6 o+ e* g            instance=instance," l; E3 R( p4 L# a
            new_pass=admin_password,
( l/ y: c8 u6 v* y2 X7 z; L            injected_files=None,
; e9 @6 r! O$ \4 d' G( r7 m1 ~5 n* A            image_ref=None,
* N* C" t" y% f# U5 `* P            orig_image_ref=None,
4 B! H  D# d( D: U% I            orig_sys_metadata=None,: q' L  I8 {+ j' B9 {4 X
            bdms=None,
, n7 @) I: q6 O" j$ J4 v2 p9 E            recreate=True," Y& E. t" Y/ U5 x! ^. N
            on_shared_storage=on_shared_storage,
) \: n  C, ?( t0 [, a8 w( _: n            host=host)
1 J( e7 u( r, Z# O: C深入分析rebuild_instance方法,通过各种rpc调用,最终具体执行的是/nova/conductor/manager.py
2 t6 {& O  T) adef rebuild_instance(self, context, instance, orig_image_ref, image_ref,7 E! c+ X' J7 \) L: {2 r: v7 T' K
                    injected_files, new_pass, orig_sys_metadata,
  J$ N7 {/ K: b. K1 G& V                    bdms, recreate, on_shared_storage,
0 W; ^1 \1 A8 t2 S                    preserve_ephemeral=False, host=None):% N7 ^/ M% f: ?
(1)在选择新目的主机时先排除instance所在主机
7 L2 l- Z( Q) ?" b* K这样能确保不会在原主机上执行rebuild操作
1 m4 X: `, b6 K/ w# 排除原实例所在的主机,即不能在同一个主机里进行rebuild
$ }6 D+ D. D: T8 H7 Y$ G' }filter_properties = {'ignore_hosts': [instance.host]}$ @& [  e8 c  d) T
hosts = self.scheduler_client.select_destinations(context,
" B7 ?  R! C1 P+ b6 O                                        request_spec,
7 i! r5 f% x2 ?2 d                                        filter_properties)
3 E# z- [. T# T6 U/ i(2)接下来会通过scheduler模块筛选出合适的新主机. U# F( L. X. S3 a6 o3 H; S/ }3 ^
(3)如果没有选出足够的合适新主机,则抛出异常
" L6 ^7 l' \' j3 Q, a1 w* iexcept exception.NoValidHost as ex:/ s- c3 ?4 d0 S# f
    with excutils.save_and_reraise_exception():
$ G6 x; w3 ]. L& n, E# |' y        self._set_vm_state_and_notify(context, instance.uuid,
8 T6 R# F. f3 j; j            'rebuild_server',
) H' R, ~# ]$ I" B            {'vm_state': instance.vm_state,
5 Q, O. n3 g* @, a& g4 o            'task_state': None}, ex, request_spec)
* b! W/ m! ~+ _& Y        LOG.warning(_LW("No valid host found for rebuild"),- e6 h1 g- T* I4 m* P2 d3 S2 Y
                    instance=instance)6 [3 X! ?- n, g( ]+ C
不能选出合适的新主机,有可能是除了原节点外,其他节点都不可用(computer service status:disabled)或网络不通(computer service state:down),导致没有合适的新主机。- [2 ]4 x1 E. j+ o
9 x. T9 v, l. l( w9 O+ Y
 楼主| 发表于 2021-8-30 17:36:52 | 显示全部楼层
前言: 因为机房服务器运行不稳定的原因导致计算节点挂掉,然后上面的Centos7虚拟机在迁移之后开机报错。这个解决方法同样适用于其它操作系统的虚拟机。基于镜像创建的虚拟机实例。
I/O error, can't read device /dev/vda 的报错信息
首先做疏散先把虚拟实例从宿主机上面疏散到其它主机,关闭云主机。

+ h$ H/ h7 i: |
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
这个时候再重新启动就正常了。
- S( i! b# D8 \
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2021-10-28 15:39 , Processed in 0.046092 second(s), 22 queries .

Powered by LR.LINUX.cloud bbs168x X3.2 Licensed

© 2012-2022 Comsenz Inc.

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