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

openstack 疏散功能nova evacuate

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-8-30 17:33:16 | 显示全部楼层 |阅读模式
[root@controller1 ~]# nova help  evacuate! ~  ~* }* y+ ~9 Z* x' G
usage: nova evacuate [--password <password>] <server> [<host>]
0 f( V( ]; y# v3 GEvacuate server from failed host.
; I/ {# Z# w2 ]4 q0 DPositional arguments:
( L/ I9 d4 Q; G- X/ N! [* D  <server>               Name or ID of server.; o, U1 [( w& O# B7 D+ s  k1 ?
  <host>                 Name or ID of the target host. If no host is+ D( M" F6 i7 J% h0 d
                         specified, the scheduler will choose one.% L& @- n, o. \# g! {* v; T
Optional arguments:
5 L& y- _8 {. k2 `$ q; _7 L  --password <password>  Set the provided admin password on the evacuated
' Q. `1 E: r" r& y5 z8 t                         server. Not applicable if the server is on shared
2 F2 s5 x* e1 T& Z9 ]1 G                         storage.% s. e8 d/ ^; @

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-8-30 17:35:13 | 显示全部楼层
前提条件:+ p4 s- X0 k7 c* F8 V
openstack和ceph集成完成,保证虚拟机系统盘运行在ceph上
5 Z8 O5 T' B1 @" |; g/ o- k( [
5 C% g  x" Q, v- T配置步骤:
, s2 h! f* o# Q: Q! R3 `1.在各个计算节点之间做root的ssh认证,可以相互免密登录4 i4 r1 v4 [. ~3 ]

/ n0 h5 z9 Q9 P; H  i, v2.配置libvirtd服务修改配置
" y7 ?! M3 j4 W8 V' c5 z9 }# R0 v8 V# t
# vim /etc/libvirt/libvirtd.conf
# f) [9 `& r4 m9 h3 }+ h/ x( \ ! _. \3 b8 E! U( m3 j% `% M5 g
listen_tls = 0
8 d+ i( I3 e% e9 J8 ^8 klisten_tcp = 1  n: k4 N; \6 C6 Z( k
unix_sock_group = "root"
% i( G( G2 N: D( Z, Bunix_sock_rw_perms = "0777"# t6 Z0 i& ~( m6 h. v6 B
auth_unix_ro = "none"
+ i; [9 ?1 S$ E) \3 U- Tauth_unix_rw = "none"
5 ^- n; o  e7 t8 ilog_filters="2:qemu_monitor_json 2:qemu_driver", ~, F" p8 m8 u' B$ T
log_outputs="2:file:/var/log/libvirt/libvirtd.log"" @3 L( f/ y& k; f
tcp_port = "16509". q/ z7 g  Z' E$ l
listen_addr = "0.0.0.0"
3 ?$ L* y+ W# {" @auth_tcp = "none"
" j' l# i$ p/ N# Z* q' x8 ]& c修改配置1 x( {- Z% {4 V1 k

! a% B& ^. [8 p& svim /etc/sysconfig/libvirtd : ?2 o' z7 p9 x. {- x  I7 `
; ?) g, ]9 Q* \) v/ `) W
LIBVIRTD_ARGS="--listen"
, q9 Z1 w2 f$ C#重启libvirtd服务0 n# o% f# l( j( l# [2 Z
$ D) b1 }, K! ]9 o
# systemctl restart libvirtd) Z. ]! g, J1 q
3.执行热迁移9 g$ ~' M6 U, ~0 B" \/ i) H
9 m- y% x7 c- D* r) [
# openstack server migrate 3aa7f750-0867-43e8-accb-d2262ab99932 --live compute01
& s7 ^; o+ n: m- T% |4.疏散步骤
7 G, t. d, M# i( d. x4 S( U4.1 主机查询3 z/ U. _" E/ G/ ]* {4 w% c6 i
0 @, t( N7 m$ s0 u- I+ ]
# openstack host list
- Y1 `% z3 g. V0 Q2 F7 r3 e[root@controller1 ~]# openstack host list
  A2 N" Z8 {7 M4 \1 g+-------------+-------------+----------+
, o# J; R9 _$ i| Host Name   | Service     | Zone     |
6 x" p# U& O, r& }; |+-------------+-------------+----------+
1 ~- I0 D3 [; D  p3 E5 Q8 o| controller2 | scheduler   | internal |
, _( N) r0 t, ~& e& ^| controller3 | scheduler   | internal |$ z+ @& {" f) z# H( D( z
| controller1 | scheduler   | internal |
! S# }( R; o1 u% N6 l+ Q. J| controller3 | conductor   | internal |2 v( r9 l5 E4 u9 _
| controller1 | conductor   | internal |
4 B0 v5 j  O' @1 X  m6 p* ?| controller2 | conductor   | internal |) Z' c6 f6 s9 b( |' Y; e6 H+ h: d0 A
| controller2 | consoleauth | internal |
5 x1 R+ m6 ^6 x* W| controller1 | consoleauth | internal |
" R3 I1 z) N! j* V2 T# s| controller3 | consoleauth | internal |" _, {# Y( `1 S) t3 F- b, i
| compute02   | compute     | nova     |
, u7 h7 b% T) `7 ^6 e/ \" {| compute03   | compute     | nova     |" _; @8 u/ X3 a& Q! a+ b$ t$ B# y
| compute01   | compute     | nova     |9 s5 Q$ r/ q- ~9 P; [% ]3 D
+-------------+-------------+----------+
  a  B, s! ?2 q: h
8 Y( e% B+ d+ U0 g) |
# n5 ?, v. X3 r; l4.2 执行疏散
1 \* d/ O( ?3 k3 j3 F6 E  |
2 U. n  ?0 _6 F9 h* n. r3 e0 `* d" z一台计算节点的所有虚拟机疏散到另外一台计算节点: g9 d! H% Y/ j& f. }1 ?
8 {9 V" ]+ p$ P

6 V6 v. E: f5 U$ a
( V! k9 R# e1 r3 k, N% ^# nova host-evacuate --target_host compute02 compute01  Z% J: E2 _0 \$ S9 ], t
一台计算节点上的一台虚拟机疏散到另外一台计算节点
' f% L4 C; a8 u, d" z6 {9 R, U
9 ?$ h. L5 n) P/ ^8 D# nova evacuate 3aa7f750-0867-43e8-accb-d2262ab99932 compute02% l( ~6 |; y: ~: o6 s
1 V( l6 E% b. e0 f) y
: R& q; p  {3 C' d3 X: y8 n# ?
[root@controller1 ~]# openstack host list ) V9 B' x! A- @, \
+-------------+-------------+----------+3 v! T& Y5 x, l: f& X) {  _
| Host Name   | Service     | Zone     |! b% ?) T& c) p' K3 h# A
+-------------+-------------+----------+
9 Y' x6 {5 B0 ]| controller2 | scheduler   | internal |
/ Z& K1 I. h% @8 }# d8 f| controller3 | scheduler   | internal |# w  W$ b7 k: N4 Q. A; f& t# n4 W
| controller1 | scheduler   | internal |( F% e4 L$ K4 n2 D4 G2 O5 Z/ Z
| controller3 | conductor   | internal |" w/ H7 A' R& O
| controller1 | conductor   | internal |$ O& u  P- V3 d, u
| controller2 | conductor   | internal |
  O/ [" ^, I, ~2 n" [# `; P| controller2 | consoleauth | internal |* O/ y3 B. p7 i/ q% k: h+ I9 H6 }1 t
| controller1 | consoleauth | internal |
( Y& I, w2 t- A- J: ~| controller3 | consoleauth | internal |/ @0 ]! K  y: t$ P: c; s0 C
| compute03   | compute     | nova     |6 [# S8 c; P" `' w- n; X
| compute01   | compute     | nova     |
5 ]) v( Q+ d. k- v+ U7 U+-------------+-------------+----------+: |6 s$ W3 E% h# g- n; {+ S6 v
5 O# W  i6 p8 r9 c2 a0 w4 e' G
[root@controller1 ~]# nova host-evacuate --target_host compute02 compute01
0 q( A/ o( e# O; J( U+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
4 y3 n8 Q  n( U) \. l: r* ]! O0 Y% R| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
  f2 R+ h, D7 q8 l- c  X. J5 e+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
" H& Z$ p' I8 T+ Z7 T5 R& M| 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) |
! K3 E6 r6 r, m6 Y, V2 M& ?- O+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+# U; L$ }5 h2 N9 M" |0 e$ q
[root@controller1 ~]# nova host-evacuate --target_host compute02 compute03. _6 }/ ?/ a; D: ^
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
/ P# L/ e0 D- j4 x' `4 @| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
& P3 a/ M) J+ H2 y4 m+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
4 u5 Q* y5 J$ Y2 N2 p$ S* \| 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) |
; F" x6 V' r2 d4 G+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+" |8 K7 Q+ k8 K, x

* M7 ]3 h* ?  _; k[root@controller1 ~]# nova list 7 s" i( D$ V% r
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
6 X5 w2 F- x  f; I| ID                                   | Name     | Status | Task State | Power State | Networks                            |3 p. j  B* z5 i7 F0 \- b
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
  O' `" e6 x3 `' U' p& [8 I| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
* K2 W: o  x& E6 }% X2 [' M: }7 A| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |7 n9 Q  Z* T) \! n
| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
+ d% ~. T3 K/ Q8 ]' w+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+6 s; i# h1 K9 `, X; G- A
[root@controller1 ~]# nova evacuate  7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 compute03; C4 K6 [! I# w  f" k& y3 e
[root@controller1 ~]# nova list 4 b' v5 v1 @/ l. C, \* ~! M
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
3 r( U. A2 M3 O. M| ID                                   | Name     | Status | Task State | Power State | Networks                            |
7 }) Q5 v  f' S1 T; |' \& i$ m+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+5 I) k1 c& i3 l5 ~7 V/ B# W( k' Z3 E
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
: Q; W; N6 Z4 w4 ^' C2 ]; t| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |
8 h$ a  r3 O2 b& m+ P1 y| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
. d# o" r+ t- c5 B. S8 K+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+, E8 q4 T) {8 ~7 L' I: ]
[root@controller1 ~]# nova show 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2/ L* O* E) {) e
+--------------------------------------+----------------------------------------------------------------------------------+& q( ]- S5 U7 y3 P
| Property                             | Value                                                                            |, H# N# n  a6 A% D- v
+--------------------------------------+----------------------------------------------------------------------------------+
8 d8 r4 a) n" v& L, R8 v$ e5 [| OS-DCF:diskConfig                    | AUTO                                                                             |9 K% w2 b6 e) k) J2 ?8 N
| OS-EXT-AZ:availability_zone          | nova                                                                             |
$ |0 h% M7 q  Q1 u6 D: P" }0 d| OS-EXT-SRV-ATTR:host                 | compute03                                                                        |
/ ~7 I8 F! H/ l; w| OS-EXT-SRV-ATTR:hostname             | test1                                                                            |
' F. y/ h! X% ]- c| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute03                                                                        |
9 F# |/ U9 L: r" ~5 ~& B| OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                                                |
  N3 X7 ^& u; S" g4 g8 @9 N! [# N3 ~| OS-EXT-SRV-ATTR:kernel_id            |                                                                                  |; F3 ~& t% m: h9 y- @
| OS-EXT-SRV-ATTR:launch_index         | 0                                                                                |
7 Q" j1 \! Q# m# s+ p| OS-EXT-SRV-ATTR:ramdisk_id           |                                                                                  |
2 R/ z! E$ G! `5 b1 W$ Q| OS-EXT-SRV-ATTR:reservation_id       | r-uqofhf0v                                                                       |
% I3 t+ x& ]. j% d8 x| OS-EXT-SRV-ATTR:root_device_name     | /dev/vda                                                                         |
* o4 E- A4 E+ B3 z| OS-EXT-SRV-ATTR:user_data            | -                                                                                |% {" I- D. O* j
| OS-EXT-STS:power_state               | 1                                                                                |! V, G) @6 s& ?. k
| OS-EXT-STS:task_state                | -                                                                                |
0 H4 @3 O: R$ [3 G$ A| OS-EXT-STS:vm_state                  | active                                                                           |
2 u" q; j* O" z& R7 k) h| OS-SRV-USG:launched_at               | 2021-08-31T01:25:16.000000                                                       |
8 X' I- [* x9 N* h" Z9 I| OS-SRV-USG:terminated_at             | -                                                                                |4 Y& H! M+ p* y  }) i
| accessIPv4                           |                                                                                  |2 z+ q# E* u: H3 W8 @0 {+ @
| accessIPv6                           |                                                                                  |8 H4 O5 Z5 v, A2 p: V
| bridge network                       | 192.168.0.206, 192.168.0.233                                                     |7 i# o6 @+ b3 q8 R
| config_drive                         |                                                                                  |
" E) M- i# \; x! M& p. d| created                              | 2021-08-25T07:37:43Z                                                             |
0 O$ u) W  z5 e( s! O| description                          | -                                                                                |
  Q2 z# X5 l1 F! H( V" U" b| flavor:disk                          | 10                                                                               |  G5 m- E4 k1 U: h8 a
| flavor:ephemeral                     | 0                                                                                |, I; u( C7 r, ]; O/ Y% {* g3 x
| flavor:extra_specs                   | {}                                                                               |
9 |; l+ J: `8 y7 Y1 }| flavor:original_name                 | type-1c-1g-10g                                                                   |: `+ Z( N2 h+ W4 R3 m
| flavor:ram                           | 1024                                                                             |
* E, _7 v4 p- o6 Q| flavor:swap                          | 0                                                                                |
% I" Z0 T: e4 y8 v3 s# U5 D6 `1 h" b| flavor:vcpus                         | 1                                                                                |, t" }6 w9 k  ?% h, m' W8 I3 {
| hostId                               | 35bcc54020d6ae54aebe586983a9df9d8562a0201cea0c0d85e39455                         |$ p3 I, T! m! T8 y
| host_status                          | UP                                                                               |
! r! H+ U7 L( J- B| id                                   | 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2                                             |
' t( G% x3 O- s3 T& s% t| image                                | Attempt to boot from volume - no image supplied                                  |$ `( c6 \8 E# O* c' T5 Q1 m
| key_name                             | -                                                                                |, x9 M# a$ u3 D
| locked                               | False                                                                            |; T$ W! i8 R# J0 A8 A
| metadata                             | {}                                                                               |
/ H" S' L. l. ?4 g% [| name                                 | test1                                                                            |
& W4 |( [: d- x! E* h| os-extended-volumes:volumes_attached | [{"id": "d385a405-529b-450e-98e7-44aad0d3e94a", "delete_on_termination": false}] |' Q- T0 u6 p) [
| progress                             | 0                                                                                |4 L6 _: Q* \0 e( [9 J$ _
| security_groups                      | default                                                                          |
* I2 M8 M8 e- E6 V* t| status                               | ACTIVE                                                                           |  K0 }8 w5 `0 r4 a
| tags                                 | []                                                                               |/ Y7 Z6 [0 X, D% Z+ m
| tenant_id                            | 92a5a26fc14d418d881ade0ccbcffc59                                                 |9 d  W' @2 x8 ]3 ?: h* I6 X
| updated                              | 2021-08-31T01:25:17Z                                                             |$ G# D8 [6 e3 g; q+ V/ z  Q
| user_id                              | b1ffbc1f84cf42c99a8e59fdaf7f1cf5                                                 |1 d; t8 ?' E$ V" C; [: A8 u
+--------------------------------------+----------------------------------------------------------------------------------+$ H; A7 [& [' }  W5 @
————————————————! ~2 {, V  \  \
$ O1 W$ ^: f# W  j* @* s6 `5 u) G; N

9 h7 S. W$ d& t, ]. e! @% k

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-8-30 17:35:43 | 显示全部楼层
一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。4 ?% m3 |0 C- ]. X& Y3 k
这可以是OpenStack计算节点HA的一种实现方案。* i' W8 v( I2 q' B( r" ^

' I( `' ?: A3 a$ F% m二. API调用
- G" }0 F; Q! Vnova.servers.evacuate(server=fm['id']), on_shared_storage=True
  g! a5 ~8 |/ K7 w/ U1. on_shared_storage参数在2.14版本后废除,自动检查是否为共享存储。
& b. X8 ]) [5 B    共享存储能够保证实例在另外新节点重建后数据不丢失# [- X, w# X+ H* ~
2. 可以设置目的主机host
4 c! \: \' V2 i; E$ L    如果不设置host,nova会通过scheduler选择一个新的主机(不会分到原主机,因为rebuild函数中过滤了原主机)
- ~' B- G+ e. y7 ?/ `3. 这个调用只是发送了evacuate操作命令,具体是否真正疏散成功,无法知道
: ?# Q( f& S% P. d" j) K9 f/ s% b: h6 B
三. 源码分析7 |/ B( k* [4 M- w% }& h) {
对应的是/nova/compute/api.py
1 S# ?+ w) E5 |% I# U% Q@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED,) S# v7 M, g: t5 q# b* ~. g* {
                                vm_states.ERROR])
3 B" I" Z' w/ [def evacuate(self, context, instance, host, on_shared_storage,
/ i& n* h+ u* ~! ~7 j& H3 B            admin_password=None)0 t+ ?& _& `5 z9 i1 I) q
1. 函数上方有装饰符 @check_instance_state
! k+ _# \' q: @# B! b表示在执行evacuate方法前先执行check_instance_state:检测传入的instance的vm_state是否为ACTIVE、STOPPED或ERROR。如果不是这三种状态,不能执行evacuate方法。5 `; {. E; F( y, T! _. Y

/ L  Q8 g/ i0 m% R. x  a2. 首先检测instance所在主机的状态是否为down,如果不是down(比如up),执行会出错。+ V# U& y  P8 ~) i1 m, j; Z# ^) h/ Q
LOG.debug('vm evacuation scheduled', instance=instance)
/ F, Q# h7 \1 N9 Z7 y* _# 原实例所在主机
/ k- e9 S- V# J  }! G, yinst_host = instance.host
" y( @* q8 K6 ~- kservice = objects.Service.get_by_compute_host(context, inst_host)1 o/ c9 ], W- T
# 首先确保compute主机的状态为down
0 s: J. L1 [. D* P4 vif self.servicegroup_api.service_is_up(service):
( i& t* ^5 e5 ?  x# x' z% k    LOG.error(_LE('Instance compute service state on %s '
4 Y' w6 K" f% \0 @- J. v- a/ s  ^                  'expected to be down, but it was up.'), inst_host)9 |, A8 X4 L, ^/ @
    raise exception.ComputeServiceInUse(host=inst_host). [' b# e$ p$ W; ~9 M# k

8 I! P2 p! G' D1 m( \$ T3. 记录action执行操作( k6 G0 Z" v% A/ a
# 实例的任务状态设置为REBUILDING7 A) P8 i# C( ~% }
instance.task_state = task_states.REBUILDING
0 e( d( ]0 i0 }5 G, finstance.save(expected_task_state=[None])
8 `) Y% ]0 W/ gself._record_action_start(context, instance, instance_actions.EVACUATE)4 }1 u0 K) N! k! g& j$ W
. M' I$ B! i- A4 ^
4. 初始化迁移类
6 b7 Y# S# \2 W3 R6 y& R; Imigration = objects.Migration(context,2 F7 t# C, U0 W+ d
                              source_compute=instance.host,6 r5 y* R# W1 [# w0 y3 T* ^
                              source_node=instance.node,
; A4 A4 S2 l6 Y* T7 W                              instance_uuid=instance_uuid,) L3 v" Y- c  w- v0 j
                              status='accepted',( r& O& T  E2 h) }
                              migration_type='evacuation')
: u4 _8 C1 z; `: O$ c+ k1 E& b5. 创建迁移(这里为什么要创建migration,并没有执行迁移)
% `  a" w2 W* }, d# 如果提供了目的主机/ P8 T+ Y. I5 o- i
if host:
; _6 }( A7 g& u- b- w  N, O    migration.dest_compute = host
" a" ?' m, P2 V) O! ^migration.create(), O1 L8 x5 L# J6 R9 J( n
) n( J; S  c  _1 G5 P  h# R, t
6. 发送消息通知实例的使用配额6 F( w# w3 v( n4 F
compute_utils.notify_about_instance_usage(1 n2 v& X" @; E/ ~9 j
    self.notifier, context, instance, "evacuate")* p2 F2 R. n1 A6 O& [' P6 {

2 n2 S# P4 w2 D% L' E7. 最后执行task任务:rebuild_instance* j: n$ R8 i7 X- Y, e" T
所以evacuate的本质是在新节点上执行rebuild操作
; q& H- D1 [# W5 {. e5 e6 G% n$ Q2 lreturn self.compute_task_api.rebuild_instance(context,' v- G( d# l( Y6 C8 p! @9 D9 V
            instance=instance,) s- p" R2 p8 u; m- m: `, d" v
            new_pass=admin_password,
2 {6 s& z4 Y7 m6 i7 m            injected_files=None,& A% r. H6 R. ^9 M3 w1 C
            image_ref=None,$ a9 _3 T. E' i* S* X& H
            orig_image_ref=None,
- f) c: s0 _& g( u8 x: b0 R            orig_sys_metadata=None,
$ A9 \" q  M5 t8 z) V* H: k) B. V            bdms=None,: I4 R( P" u8 P
            recreate=True,) B2 H: s8 r3 j& l! y) @
            on_shared_storage=on_shared_storage," ~. b, _' L. q% M2 o5 Y
            host=host)( ~8 e, B* e7 [& @+ k9 Q8 t: e
深入分析rebuild_instance方法,通过各种rpc调用,最终具体执行的是/nova/conductor/manager.py$ E7 D, J1 T3 }& w9 ]5 p9 ]" _
def rebuild_instance(self, context, instance, orig_image_ref, image_ref,  A& E6 k/ W7 e: Q3 C
                    injected_files, new_pass, orig_sys_metadata,$ S; l% G) Q- n+ r. V) S
                    bdms, recreate, on_shared_storage,3 x/ R8 N+ p3 g- G
                    preserve_ephemeral=False, host=None):
3 h. S: h6 Q( H5 D6 y) U(1)在选择新目的主机时先排除instance所在主机
% b! E! e) l9 N) p& \; g这样能确保不会在原主机上执行rebuild操作
' M; g7 W6 J7 X7 u  q0 @, }6 ?# 排除原实例所在的主机,即不能在同一个主机里进行rebuild
, y* O. f9 ~, M. u; D* @; Nfilter_properties = {'ignore_hosts': [instance.host]}  n& v' s  J/ }" x; b
hosts = self.scheduler_client.select_destinations(context,
, v/ Y, m! u+ W4 d) K) u- X7 D                                        request_spec,
2 t$ q" p9 J) U# q" |5 [) B                                        filter_properties)7 g$ l: l/ }' n. z
(2)接下来会通过scheduler模块筛选出合适的新主机
2 O5 s6 I( L. w8 `. k! x; A& ?(3)如果没有选出足够的合适新主机,则抛出异常! ]0 ~/ ?% G! h, @
except exception.NoValidHost as ex:
+ r6 V  {& _8 Y% P) t    with excutils.save_and_reraise_exception():
; C* a* q! R8 \# m1 b2 K6 k        self._set_vm_state_and_notify(context, instance.uuid,% l6 a/ [( T# M$ ~1 N
            'rebuild_server',6 @. \  |8 P2 P
            {'vm_state': instance.vm_state,
* }! F- M6 z: L" L0 l9 Z% `* K/ x            'task_state': None}, ex, request_spec), K1 Z$ X7 D& f5 T
        LOG.warning(_LW("No valid host found for rebuild"),3 c  Z: o2 r! ~* O# e5 A3 q& w# M
                    instance=instance)
) @" [" @; b0 I9 B/ N2 ~不能选出合适的新主机,有可能是除了原节点外,其他节点都不可用(computer service status:disabled)或网络不通(computer service state:down),导致没有合适的新主机。( ~6 q' J* j, V

0 S, j. {7 I1 C& q

1

主题

0

回帖

12

积分

管理员

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

" J7 W8 I& C: Z$ m# N
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
这个时候再重新启动就正常了。" W% P2 p) S+ R& `+ H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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