易陆发现互联网技术论坛

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

openstack 疏散功能nova evacuate

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

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

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

x
[root@controller1 ~]# nova help  evacuate% z. z, G; U% h4 J
usage: nova evacuate [--password <password>] <server> [<host>]# \! t  @; y" R1 u% k
Evacuate server from failed host.6 Z2 |) h6 Z/ M1 o1 j9 q7 G
Positional arguments:
+ z. U; n! K, x& U- g! ~  <server>               Name or ID of server.
8 P* |9 y2 a  {  <host>                 Name or ID of the target host. If no host is3 m+ s: }- F. ]* J, Z2 l: Q
                         specified, the scheduler will choose one.
' V$ v/ X! C) {( @& oOptional arguments:. T- n, n. D0 N. L! c6 h1 |. H8 ?
  --password <password>  Set the provided admin password on the evacuated
( }! z- a# s5 m9 x$ @$ X! z- q                         server. Not applicable if the server is on shared
0 R  h% x" ^6 A$ j& F                         storage.
! `4 B( S* ~" J0 ~) D4 M1 V
 楼主| 发表于 2021-8-30 17:35:13 | 显示全部楼层
前提条件:
+ r8 i5 Z3 F* @: Z" Qopenstack和ceph集成完成,保证虚拟机系统盘运行在ceph上" y0 [0 _  S6 z% b2 ?
; m/ i2 {! |+ Q6 U  }9 ^
配置步骤:0 a4 ?1 ?7 s: L- ]. P( t
1.在各个计算节点之间做root的ssh认证,可以相互免密登录. o* }( R0 n1 J$ H/ s& \+ e
1 T6 m1 t; `) v9 N
2.配置libvirtd服务修改配置
: d0 f2 Z3 _, \' m, C" C
# ]) @5 T1 e" w- E: m) I8 {! b# vim /etc/libvirt/libvirtd.conf7 }2 m  F! S3 @/ W/ C" r) b& X

' D$ {% c3 p+ q4 u$ Ulisten_tls = 0
/ O! w! ^4 Z5 O5 c3 a# p1 Clisten_tcp = 1# d- H6 [) o( x: _3 b' t1 y
unix_sock_group = "root"0 ?( p8 s5 |8 z0 F7 K: d+ [3 G
unix_sock_rw_perms = "0777"$ a: M; c- Q# O- N+ V" a
auth_unix_ro = "none": ~: p% C" J! i& t& g; Z) R  H
auth_unix_rw = "none"
- F9 t7 b5 ^2 E; E' d1 U7 zlog_filters="2:qemu_monitor_json 2:qemu_driver"" o! X+ `5 k7 T4 {
log_outputs="2:file:/var/log/libvirt/libvirtd.log"( I6 O; ]9 S1 H. y0 L8 ^$ H
tcp_port = "16509"
0 B5 w: u% X( D3 Z# [5 clisten_addr = "0.0.0.0"
5 i; d* a; D. _' ~# zauth_tcp = "none"3 ^/ J; j- s/ f5 O/ @
修改配置1 ^$ @% G+ {6 S  B8 d: I% }
7 u0 J7 s! s3 U% L' l) V2 |" {# u
vim /etc/sysconfig/libvirtd 0 \. D; M2 r8 T: t
( C+ K2 ]% T* g( X: g+ E
LIBVIRTD_ARGS="--listen"+ C0 g( e/ }# k3 ]* ]
#重启libvirtd服务) L' _- ]) J: ?9 n6 c" ]

% ~) w4 l0 F. ~2 @% N  z6 J. |' i# systemctl restart libvirtd
. Y- d1 d$ e9 |/ I0 p3.执行热迁移
2 c3 U+ M: W8 C; }8 Y8 M1 p6 i5 {+ k& U& h' M; K; o( c' E
# openstack server migrate 3aa7f750-0867-43e8-accb-d2262ab99932 --live compute017 x0 E8 A7 D( c- p6 ^
4.疏散步骤! `  j; y; K: A# @& b% F, H* k
4.1 主机查询
6 S: d! S' b' I6 V3 x$ Y. ^0 K" f1 [2 ~' W9 E
# openstack host list
# t; O% b7 N3 j$ k- ^7 E[root@controller1 ~]# openstack host list
4 W8 e9 Z) U, m3 G: {+ M# b9 _+-------------+-------------+----------+# ?" e& m8 F4 i& e) o" {- i
| Host Name   | Service     | Zone     |: K4 j8 W9 Z9 \# j3 n+ [9 H
+-------------+-------------+----------+
- n- D4 ~/ m, ]8 G| controller2 | scheduler   | internal |$ G5 L$ m5 e9 Y6 N2 c' s9 C- D
| controller3 | scheduler   | internal |
+ `3 N* A& A; {) A1 F1 y6 j| controller1 | scheduler   | internal |
) _7 `( Z0 n1 L! {. Q: K' w| controller3 | conductor   | internal |
' i1 Y/ T" Y& I  a| controller1 | conductor   | internal |
% l- A9 R# g9 t& I! d| controller2 | conductor   | internal |3 h! t' k( B* V1 u4 {
| controller2 | consoleauth | internal |* A$ x" l3 h4 @# y( W1 m- F* w9 y
| controller1 | consoleauth | internal |; b; j  i8 G0 `( C" ]  Q0 d2 ?8 X
| controller3 | consoleauth | internal |
' G5 V6 @) x9 `, q' Q% L| compute02   | compute     | nova     |
. g& `) d' S3 [% o| compute03   | compute     | nova     |- ^4 j' |/ e0 E6 I2 x
| compute01   | compute     | nova     |
, e) j2 @; d" v1 j3 I+-------------+-------------+----------+
6 ~" A* B" \4 ~, s' {1 }
3 ]2 U6 V; [6 n8 ^- P
2 T, B* m, d/ p1 e/ ]2 d0 g" Q4.2 执行疏散
( l) T) s) }9 ~( G# b
, @. q; z" _% J/ Q# W一台计算节点的所有虚拟机疏散到另外一台计算节点
9 z0 X$ D9 }& z4 \# U2 B9 f1 {1 O- ?( H% u2 T
$ Z8 }4 b4 w' n" u( {

3 a( e' c0 v; w* ~* U$ r# nova host-evacuate --target_host compute02 compute016 n; m* ]( x& i
一台计算节点上的一台虚拟机疏散到另外一台计算节点" c! z: j  q* D( R& B

, \$ e8 N8 e* I2 N# K% i( B# nova evacuate 3aa7f750-0867-43e8-accb-d2262ab99932 compute02
) j! q  M. U" D- J, E2 a9 w
/ p8 T; H6 Q2 j9 K4 I2 i( C
4 {: s% v' e( |[root@controller1 ~]# openstack host list # k4 O( ]+ j1 A
+-------------+-------------+----------+
; p& @1 Z; I  U0 ?6 o1 s: Y| Host Name   | Service     | Zone     |
2 H1 g/ g* O# K. ?0 u+-------------+-------------+----------+3 k: E( }( e" m
| controller2 | scheduler   | internal |
$ Q7 J; t7 v; e( w! Y9 x% ^, t| controller3 | scheduler   | internal |
$ f- X4 z; E  Q, F' S$ `; C( |4 E+ F| controller1 | scheduler   | internal |
" c' r4 w% K2 i' S| controller3 | conductor   | internal |
/ r/ Y3 p# `+ J) h; h8 i| controller1 | conductor   | internal |
( R" U4 A, W6 G$ J1 d+ u+ b2 n$ @8 Y| controller2 | conductor   | internal |) m  w# h& `  I
| controller2 | consoleauth | internal |& G2 T% e8 k% b
| controller1 | consoleauth | internal |
0 Q" u" o; V% N# z+ `! _| controller3 | consoleauth | internal |
2 S( k& s8 j* B| compute03   | compute     | nova     |# y' L% C: E2 g; y
| compute01   | compute     | nova     |* N2 a4 A7 [! q; V: e0 }/ Y  l
+-------------+-------------+----------+- v7 V* S: A; J5 K+ y0 Z
: P# f2 x8 G, `
[root@controller1 ~]# nova host-evacuate --target_host compute02 compute01
- i) |+ P( _" ?9 T0 i' W8 q+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+& p& k- U; @' J# j4 h/ l3 K3 {
| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |$ L/ C( U, n% ]* L8 u, t3 g
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
( Q5 @* i& c+ P9 A6 N( a8 Z. [| 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 l1 s8 o0 \9 G3 ^+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+( F- ^# C9 `( B
[root@controller1 ~]# nova host-evacuate --target_host compute02 compute03
* h5 z1 o6 t# S/ q( j* o+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
- j8 Y/ M0 P1 ?| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |$ H0 n2 q! O8 e5 C( d% ^% p/ s
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
* E4 G5 @$ f6 _, H" y' e$ 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 D5 ^; H4 Y8 ~" y# i! w4 u
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+2 M9 M- _$ W4 Z
& ?& q& T, ]( ]! ?5 f& u) }
[root@controller1 ~]# nova list 2 v6 m4 h  i4 w3 S0 m; ]
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
% a' F, q. @/ l# \| ID                                   | Name     | Status | Task State | Power State | Networks                            |" o- E  E9 z6 |; O2 i
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+3 P+ q$ N  I2 Y6 _+ O% g2 a
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
- y% B1 z' ~- U| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |) M2 s3 a& A7 \2 J: L
| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |! X+ U' ^3 w8 t
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+$ @1 S2 I6 K5 Q0 P
[root@controller1 ~]# nova evacuate  7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 compute039 N9 o0 S4 a/ ]& J- P+ s
[root@controller1 ~]# nova list
3 F- ]) e% K( J' V+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+' }  V2 }4 N/ v" E' X+ u8 i( q$ S
| ID                                   | Name     | Status | Task State | Power State | Networks                            |
( U0 e  Q  Q+ ^0 `0 H3 \/ F+ ^, O+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+! }6 B; q9 W. S; l1 e
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
( j5 e# v3 Z7 [' L| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |# j: W2 G8 I% P
| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
! B8 h6 b3 {$ n$ D" q+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
  R) Y! r4 E* P3 m! _4 s[root@controller1 ~]# nova show 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2
' g$ N( g8 P! K5 k" }9 f9 D+--------------------------------------+----------------------------------------------------------------------------------+' e/ y; X$ j% Q4 f) v4 K) x
| Property                             | Value                                                                            |" I% W- }: K9 s
+--------------------------------------+----------------------------------------------------------------------------------+
1 X2 F  [4 A: N" s% E" o" d  P) S| OS-DCF:diskConfig                    | AUTO                                                                             |3 N) q4 f9 y: f/ i8 D. c* q
| OS-EXT-AZ:availability_zone          | nova                                                                             |
+ r0 m0 T& a: v| OS-EXT-SRV-ATTR:host                 | compute03                                                                        |
  ^3 W2 D* r" Z| OS-EXT-SRV-ATTR:hostname             | test1                                                                            |
! W" E6 S# T! @; {8 l1 ?, ]| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute03                                                                        |
; Y9 T* }# H& l% X& || OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                                                |
5 @( M2 D3 N0 m6 P| OS-EXT-SRV-ATTR:kernel_id            |                                                                                  |
! @7 E" f/ z1 P' t| OS-EXT-SRV-ATTR:launch_index         | 0                                                                                |
8 O! s9 g" k5 z( J$ q: `0 k| OS-EXT-SRV-ATTR:ramdisk_id           |                                                                                  |
! S9 N2 ?: ?. L. n* y/ h- D| OS-EXT-SRV-ATTR:reservation_id       | r-uqofhf0v                                                                       |) c3 y7 ~; g& E! u, Q
| OS-EXT-SRV-ATTR:root_device_name     | /dev/vda                                                                         |7 ~8 ]' G3 _" `9 z
| OS-EXT-SRV-ATTR:user_data            | -                                                                                |
# G1 G, ?$ l& b8 [( W+ a6 M| OS-EXT-STS:power_state               | 1                                                                                |) N; M* [' e& z/ F  F; t
| OS-EXT-STS:task_state                | -                                                                                |2 T( f6 K, f# x
| OS-EXT-STS:vm_state                  | active                                                                           |4 g7 d) c4 z7 `" N) E9 N
| OS-SRV-USG:launched_at               | 2021-08-31T01:25:16.000000                                                       |3 n$ W( J+ Z3 I' n
| OS-SRV-USG:terminated_at             | -                                                                                |& F/ J& m4 F! y& W8 p+ F( q3 w1 o
| accessIPv4                           |                                                                                  |
5 y4 I! Z; M+ x4 p, i0 h, o| accessIPv6                           |                                                                                  |5 V) I  q& p! O$ ^. d
| bridge network                       | 192.168.0.206, 192.168.0.233                                                     |$ \7 i. L8 X0 D8 X
| config_drive                         |                                                                                  |
6 {4 h' n. _9 @# f% P| created                              | 2021-08-25T07:37:43Z                                                             |
3 n+ ]9 e1 s, L. d0 G| description                          | -                                                                                |$ {( N9 O$ q) G& k( C
| flavor:disk                          | 10                                                                               |
- O6 W6 m& P0 {& N/ m( s| flavor:ephemeral                     | 0                                                                                |3 y8 }$ c. [( ~8 [% ^
| flavor:extra_specs                   | {}                                                                               |
2 J. E3 L0 l9 o6 C( P| flavor:original_name                 | type-1c-1g-10g                                                                   |
, A* M' `% A5 \+ J| flavor:ram                           | 1024                                                                             |& K7 w+ P/ T* X% `. i
| flavor:swap                          | 0                                                                                |
, g+ y; ?5 |' y$ C" a% Z| flavor:vcpus                         | 1                                                                                |
! f8 ]+ e6 A4 I! L' P% B| hostId                               | 35bcc54020d6ae54aebe586983a9df9d8562a0201cea0c0d85e39455                         |: p  ?5 A+ z: {! }
| host_status                          | UP                                                                               |
2 y0 n4 J9 n) U: Q# `| id                                   | 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2                                             |1 K8 s" ]6 q5 H( R. J3 Q0 ?
| image                                | Attempt to boot from volume - no image supplied                                  |; o0 R# \- B+ [5 f. R
| key_name                             | -                                                                                |
" ~& V" a4 P2 I% f/ Q- e, ?  H| locked                               | False                                                                            |# b% g8 P0 V( F4 e5 O# r
| metadata                             | {}                                                                               |4 ^3 B8 s+ C! d6 U$ K( d, s  i$ S
| name                                 | test1                                                                            |+ W1 T- i/ `& s( c8 ?$ I3 x
| os-extended-volumes:volumes_attached | [{"id": "d385a405-529b-450e-98e7-44aad0d3e94a", "delete_on_termination": false}] |- B* {) h9 S; ~# @- _" x
| progress                             | 0                                                                                |
- c0 @; K7 l$ n| security_groups                      | default                                                                          |  l0 Z6 J; W- Y, }9 J+ ]8 d
| status                               | ACTIVE                                                                           |' l2 i. m) D. O4 U' p- G! R
| tags                                 | []                                                                               |( Y) |! m+ r; G" _, L5 F
| tenant_id                            | 92a5a26fc14d418d881ade0ccbcffc59                                                 |
" Y+ ?/ _, C; U. r| updated                              | 2021-08-31T01:25:17Z                                                             |
7 ~+ N) Y. F) p* X( ]| user_id                              | b1ffbc1f84cf42c99a8e59fdaf7f1cf5                                                 |0 A; R+ e8 S4 K' t' V- j1 ?' p! W
+--------------------------------------+----------------------------------------------------------------------------------+
3 ]' }1 l# J, N* J) E  a. \/ z4 \4 O————————————————: c9 R/ \- C8 [0 C, l
9 v  ?, q1 v* v" t2 W8 K2 _9 I

8 P+ d' U, |" A6 S$ k# D% w( R- h
 楼主| 发表于 2021-8-30 17:35:43 | 显示全部楼层
一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。
1 Z* P. q6 ]  v$ h+ f. }这可以是OpenStack计算节点HA的一种实现方案。
( W' {; w7 G8 B
* Q! m) }' B& L: Y; R- e二. API调用) }+ m/ `: K4 t+ s& l% ?
nova.servers.evacuate(server=fm['id']), on_shared_storage=True
9 B+ c( t0 {9 I1. on_shared_storage参数在2.14版本后废除,自动检查是否为共享存储。3 ?$ k+ N" o* J. ]3 u1 t
    共享存储能够保证实例在另外新节点重建后数据不丢失( d: N- C) m. B' K1 }2 ?
2. 可以设置目的主机host3 Y" W% X/ X! ]
    如果不设置host,nova会通过scheduler选择一个新的主机(不会分到原主机,因为rebuild函数中过滤了原主机)
: i' B" n* o: S5 @5 I+ s, y  L( g3. 这个调用只是发送了evacuate操作命令,具体是否真正疏散成功,无法知道. B8 ]. e4 k7 |- ^: F
7 a5 Z/ l5 ^9 W1 Q( V3 P: r
三. 源码分析( ^* B1 `/ I6 H
对应的是/nova/compute/api.py2 K5 Q0 Q, |: Z. E+ [/ s6 f) P
@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED,$ X' B1 _' P4 D5 A: w3 L# A) M- v
                                vm_states.ERROR])2 X$ g5 C/ n+ [' c4 r7 ]$ y6 k
def evacuate(self, context, instance, host, on_shared_storage,8 F" I% j) E7 |8 E& x5 N$ V7 W
            admin_password=None)
" D; V- ^- s) A1. 函数上方有装饰符 @check_instance_state
9 {$ T( v3 N' {: Q/ B表示在执行evacuate方法前先执行check_instance_state:检测传入的instance的vm_state是否为ACTIVE、STOPPED或ERROR。如果不是这三种状态,不能执行evacuate方法。
$ ~- V9 H2 w3 _$ J
3 I7 F7 `- T+ {( W- t7 D. t  m* ^2. 首先检测instance所在主机的状态是否为down,如果不是down(比如up),执行会出错。6 o* n- y: N& _8 f* O
LOG.debug('vm evacuation scheduled', instance=instance)$ i+ U- x7 ^( o$ r5 s( E
# 原实例所在主机) Q" N% L! r% d* a4 W. |
inst_host = instance.host
! c4 J! Y) c- U, Q! K' g1 tservice = objects.Service.get_by_compute_host(context, inst_host)9 [9 p% z- @0 q$ w" w
# 首先确保compute主机的状态为down3 M7 n: p8 F' y- H; X+ q1 ]
if self.servicegroup_api.service_is_up(service):
6 J+ m4 I. L$ R; N$ U$ f    LOG.error(_LE('Instance compute service state on %s '
; F- j- d1 u5 G0 W0 C( `6 y% h& i                  'expected to be down, but it was up.'), inst_host)
0 t) T# J# t$ H, s% C7 {5 j/ C    raise exception.ComputeServiceInUse(host=inst_host)  X' g1 o+ b# r4 U$ v( ?2 i( ~( [

- V& ]" t! q1 a" v; {' Y% I3. 记录action执行操作2 w: E9 ^+ n- J% x
# 实例的任务状态设置为REBUILDING" H6 H9 Y3 o+ W7 E! \8 O- [
instance.task_state = task_states.REBUILDING* n6 M. ^9 d) S$ V
instance.save(expected_task_state=[None])3 i5 ]: ~, w# N# s6 w* n
self._record_action_start(context, instance, instance_actions.EVACUATE)
6 Q4 X* I  k- {! q5 _4 n1 d$ L2 J% H% o" F, m/ E: N1 b
4. 初始化迁移类1 X. [6 V7 Y# L' t
migration = objects.Migration(context,
! `2 \5 k+ K7 [5 [6 o% V4 V1 C                              source_compute=instance.host,- w) \; q7 x& [8 [  L$ F. B
                              source_node=instance.node,3 L1 N8 j) w4 z/ F- O
                              instance_uuid=instance_uuid,
: i; P+ H  k  T3 s. _$ f* i) x/ \                              status='accepted',
. k  {8 E' x/ L. b; `1 R9 G% y& \                              migration_type='evacuation')- J$ D, Y7 E1 y% R0 S3 u0 z; A: R* S
5. 创建迁移(这里为什么要创建migration,并没有执行迁移)
. W* ?1 _% {- o; q2 J: ]# 如果提供了目的主机, ^' g/ E, j" j: S5 K2 H
if host:
8 d5 [6 @6 m3 O    migration.dest_compute = host% X5 C: A0 E" A3 T* }
migration.create()
. A; i! U5 g5 @# b
6 ~/ o+ F7 E$ N7 j! T6. 发送消息通知实例的使用配额
$ s1 t' a, ]! G& T  |$ q6 Wcompute_utils.notify_about_instance_usage(
! ]. E0 U4 Q' ^! ]0 A3 f( W    self.notifier, context, instance, "evacuate")& o3 v5 b5 ~8 X( }8 c
$ |! I' F4 G+ V3 j# E  n
7. 最后执行task任务:rebuild_instance
# @' @/ ~- B/ x6 [0 F' h所以evacuate的本质是在新节点上执行rebuild操作
; k; O4 x, H6 r4 }- K5 b; b+ wreturn self.compute_task_api.rebuild_instance(context,
6 |% g; T. \1 M1 Z            instance=instance,
+ z- V) z: j4 T: R/ d            new_pass=admin_password,
) _0 ^# l4 v9 L# y            injected_files=None,
( d2 S: ~! m4 N6 O$ @/ A6 G            image_ref=None,3 G% x. ~9 ^; o
            orig_image_ref=None,
1 H4 s& \4 S1 b, n/ X9 ^& ^. G            orig_sys_metadata=None,
2 w: Y# }4 T* t" p* s/ N7 D$ A" g            bdms=None,
: [% g- E9 n& [2 m            recreate=True,
9 _, U$ o6 \) t& M1 V4 ~% x0 N            on_shared_storage=on_shared_storage,0 ]  n: D' }2 E6 F4 F  K8 |
            host=host)' ^7 [% P# ~, q1 Y. X( v) B
深入分析rebuild_instance方法,通过各种rpc调用,最终具体执行的是/nova/conductor/manager.py
% P# |5 U: ^* S) R( [/ L7 Q! \def rebuild_instance(self, context, instance, orig_image_ref, image_ref,
, _+ o/ A% R8 H4 Q1 J                    injected_files, new_pass, orig_sys_metadata,
$ v: Z/ E. z( G) W                    bdms, recreate, on_shared_storage,8 [7 q& m$ G0 H' ?  _  `
                    preserve_ephemeral=False, host=None):; B/ \3 j4 r& L. q8 ?
(1)在选择新目的主机时先排除instance所在主机
) C* B) Y, r6 e8 z这样能确保不会在原主机上执行rebuild操作
7 a) X# W  |. k% h$ ~: s( y, U$ z1 u1 Y# 排除原实例所在的主机,即不能在同一个主机里进行rebuild
1 q5 _) {# Y7 Zfilter_properties = {'ignore_hosts': [instance.host]}1 D  Z0 \9 f% t
hosts = self.scheduler_client.select_destinations(context,1 a) h3 A1 Z) ~) a) t
                                        request_spec,
4 R: Q# O2 c, P# T( j( a                                        filter_properties). G( q# \5 }- e* `1 {8 o1 A' C
(2)接下来会通过scheduler模块筛选出合适的新主机  B/ E% f0 t- L( b: f) ^- U  x
(3)如果没有选出足够的合适新主机,则抛出异常5 q$ }* J8 [( G7 p# S) ]4 \
except exception.NoValidHost as ex:
$ A8 u# g# \" C7 E! ?) T( I! l" B    with excutils.save_and_reraise_exception():- T) u3 L* r% B, j
        self._set_vm_state_and_notify(context, instance.uuid,3 O+ ~, F+ s1 S) _) U8 h1 f9 `8 d
            'rebuild_server',
( ^- e# ]8 _3 {: u            {'vm_state': instance.vm_state,2 j! \; d( a! j" ?  n$ D1 U$ Q
            'task_state': None}, ex, request_spec)
" Q9 n3 O4 {  v4 v        LOG.warning(_LW("No valid host found for rebuild"),7 c! r: A. v" t2 M
                    instance=instance)7 U% u+ N9 u3 E6 H: B7 p
不能选出合适的新主机,有可能是除了原节点外,其他节点都不可用(computer service status:disabled)或网络不通(computer service state:down),导致没有合适的新主机。& Q+ _0 D* f0 z( p/ K9 S' x
; x$ X- v3 J6 h$ Q
 楼主| 发表于 2021-8-30 17:36:52 | 显示全部楼层
前言: 因为机房服务器运行不稳定的原因导致计算节点挂掉,然后上面的Centos7虚拟机在迁移之后开机报错。这个解决方法同样适用于其它操作系统的虚拟机。基于镜像创建的虚拟机实例。
I/O error, can't read device /dev/vda 的报错信息
首先做疏散先把虚拟实例从宿主机上面疏散到其它主机,关闭云主机。
4 M  ?! C+ a+ _3 V$ N& \9 s
1.找到虚拟机的ID可以通过dashboard界面或者使用openstack server list命令,找到虚拟机的ID;然后查看虚拟机的详细信息。
比如:

5 G1 N; v# {; l- v                               
登录/注册后可看大图
nova show 8fa3d2eb-2401-48a9-850a-f800314c6950# 与这个命令相同功能的命令还有openstack server show ID
# E. E, ~: B4 F2 F  J" w
                               
登录/注册后可看大图
连接到所在的计算节点,实例名称确定是哪台主机。
注意要主机是开机状态才能看到

$ k5 U9 L( ]( {; S- I5 }                               
登录/注册后可看大图
通过ID可以确定该虚拟机实例的数据目录,如果openstack没有对接存储的话那么在这个目录下就会存在数据文件,因为对接了ceph所以信息在libvirt.xml的文件里面。

0 F( E, V( l% h9 n5 A                               
登录/注册后可看大图
cat /var/lib/nova/instances/8fa3d2eb-2401-48a9-850a-f800314c6950/libvirt.xml 里面就是它的vda的ID。
' Z( m& e% ~' Y
                               
登录/注册后可看大图
2.当找到这个磁盘的ID之后,在ceph集群里面去查看这个设备
rbd ls volumes | grep 8fa3d2eb-2401-48a9-850a-f800314c6950
4 n# F8 G7 |+ K; s
                               
登录/注册后可看大图
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
这个时候再重新启动就正常了。
6 R. o- [2 x' h) b1 K* A
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

GMT+8, 2026-4-8 15:22 , Processed in 0.080085 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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