找回密码
 注册
查看: 5612|回复: 2

openstack 公开版 热迁移和冷迁移

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2018-11-28 21:53:31 | 显示全部楼层 |阅读模式
迁移类型:
*非在线迁移 (有时也称之为‘迁移’)。也就是在迁移到另外的计算节点时的这段时间虚拟机实例是处于宕机状态的。在此情况下,实例需要重启才能工作。
*在线迁移 (或 '真正的在线迁移')。实例几乎没有宕机时间。用于当实例需要在迁移时保持运行。在线迁移有下面几种类型:
* 基于共享存储的在线迁移。所有的Hypervisor都可以访问共享存储。* 块在线迁移。无须共享存储。但诸如CD-ROM之类的只读设备是无法实现的。* 基于卷的在线迁移。实例都是基于卷的而不是临时的磁盘,无须共享存储,也支持迁移(目前仅支持基于libvirt的hypervisor)。什么是热迁移
热迁移(Live Migration,又叫动态迁移、实时迁移),即虚拟机保存/恢复(Save/Restore):将整个虚拟机的运行状态完整保存下来,同时可以快速的恢复到原有硬件平台甚至是不同硬件平台上。恢复以后,虚拟机仍旧平滑运行,用户不会察觉到任何差异。
openstack热迁移
OpenStack有两种在线迁移类型:live migration和block migration。Livemigration需要实例保存在NFS共享存储中,这种迁移主要是实例的内存状态的迁移,速度应该会很快。Block migration除了实例内存状态要迁移外,还得迁移磁盘文件,速度会慢些,但是它不要求实例存储在共享文件系统中。
7 _9 e+ M7 l  O) x: i7 ]  LNFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
( y) R4 V; y3 _
迁移步骤
  • 迁移前的条件检查" W4 f8 V2 X/ \
    动态迁移要成功执行,一些条件必须满足,所以在执行迁移前必须做一些条件检查。
    • 权限检查,执行迁移的用户是否有足够的权限执行动态迁移。
    • 参数检查,传递给 API 的参数是否足够和正确,如是否指定了 block-migrate 参数。
    • 检查目标物理主机是否存在。
    • 检查被迁移的虚拟机是否是 running 状态。
    • 检查源和目的物理主机上的 nova-compute service 是否正常运行。
    • 检查目的物理主机和源物理主机是否是同一台机器。
    • 检查目的物理主机是否有足够的内存(memory)。
    • 检查目的和源物理主机器 hypervisor 和 hypervisor 的版本是否相同。
      ! A6 Q- d7 I" A  U) ?8 t
  • 迁移前的预处理
    - x$ T) ?) l2 J( L2 C- N
在真正执行迁移前,必须做一下热身,做一些准备工作。) R& T3 c" k" ]4 F' g) I
* 在目的物理主机上获得和准备虚拟机挂载的块设备(volume)。
* 在目的物理主机上设置虚拟机的网络(networks)。* 目的物理主机上设置虚拟机的防火墙(fireware)。
  • 迁移
    7 @( W5 v2 \3 J* b" H; o& q* C条件满足并且做完了预处理工作后,就可以执行动态迁移了。主要步骤如下:
    • 调用 libvirt python 接口 migrateToURI,来把源主机迁移到目的主机。  e. s, D( I" {$ V& Q
      dom.migrateToURI(CONF.live_migration_uri % dest,logical_sum,None,CONF.live_migration_bandwidth)
      4 `/ ^8 n) z0 a* T8 Q3 Klive_migration_uri:这个 URI 就是在 3.2.2 里介绍的 libvirtd 进程定义的。9 V0 K2 \6 w/ g* a& R& U
      live_migration_bandwidth:这个参数定义了迁移过程中所使用的最大的带宽。
    • 以一定的时间间隔(0.5)循环调用 wait_for_live_migration 方法,来检测虚拟机迁移 的状态,一直到虚拟机成功迁移为止。# `1 e& F& K4 {, }/ z5 ?6 p
  • 迁移后的处理
    9 i+ m7 s  b& ^" X当虚拟机迁移完成后,要做一些善后工作。
    • 在源物理主机上 detach volume。
    • 在源物理主机上释放 security group ingress rule。
    • 在目的物理主机上更新数据库里虚拟机的状态。
    • 在源物理主机上删除虚拟机。

      3 r( U2 n' c9 ?3 T
    3 }" l. `* K- r5 |
上面四步正常完成后,虚拟机就成功的从源物理主机成功地迁移到了目的物理主机了

0 M3 S0 T3 j" p/ h0 R; WLive Migration 的实现
热迁移条件:
1.计算节点之间可以通过主机名互相访问* r& D1 t1 z2 o1 x7 ~- X
- U2 g' w) _" \
2.计算节点和控制节点的nova uid和gid保持一致
3.vncserver_proxyclient_address和vncserver_listen 监听的是本地IP
4.必须有共享存储,实例存放在共享存储中,且每个计算节点都可以访问共享存储。否则只能使用块迁移

7 C+ k" _, d6 i/ ~& r9 H1 t6 s' q0 L7 y配置
  • 添加live_migration_flag

    2 _1 n% m! d1 V  F/ p( D
修改nova的配置文件,在[libvirt] 段下 添加如下字段

/ z% J, O* ^& S, @" m$ \
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"

+ `8 g- f* ?- k: S) S" I
  • 修改libvirt配置
    配置versh免密码连接,修改/etc/libvirt/libvirtd.conf
    9 ]- l1 W% t2 L# r, M. ^
添加如下配置
listen_tls = 0
listen_tcp = 1t
cp_port = "16509"
listen_addr = "172.16.201.8"   #根据自己的计算节点IP改写
0 I" j3 }- a) b' D
auth_tcp = "none"

2 {0 I8 q4 @8 B) n
修改/etc/sysconfig/libvirtd 添加如下参数
LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
LIBVIRTD_ARGS="--listen"
重启libvirt
systemctl restart libvirtd.service
查看监听端口:
[root@compute1 ~]# netstat -lnpt | grep libvirtdtcp        0      0 172.16.206.6:16509      0.0.0.0:*               LISTEN      9852/libvirtd
测试:
在compute1节点上:
4 q  ?' n! O5 G% ]/ X) T/ w& G- ?- u
virsh -c qemu+tcp://compute2/system在compute2节点上virsh -c qemu+tcp://compute1/system如果能无密码连接上去,表示配置没问题

, T6 r3 o4 ]9 ?; x8 l! y) D动态迁移
  • 查看所有实例; X8 M; y* D% j( w9 x/ J9 n
nova list
  • 查看需要迁移虚拟机实例
    / f$ x2 i& R5 |1 W& y8 S; @! v, ~
nova show f3d749ba-98e1-4624-9782-6da729ad164c
  • 查看可用的计算节点. D3 a$ u  F, F! {! G
    nova-manage service list
  • 查看目标节点资源# Q+ C0 w. w" ~4 ^% z
    nova-manage service describe_resource computer1
  • 开始迁移,正常无任何回显

    : c* |& D* Q" l  a2 z. m6 k) j8 x
nova live-migration 8da00f69-05f6-4425-9a8a-df56b79a474f computer1
  • 也可以通过dashboard 节点迁移/ ]7 `0 v3 Y/ t
    用节点迁移需要使用admin管理员用户执% T( t( J9 _% Q
冷迁移配置
冷迁移需要启动nova账户,并配置ssh 免密码认证
usermod -s /bin/bash novasu - novassh-keygen
enter
6 j; Z: E3 w+ n$ h) i" xenter
# V& S9 |, ?- `! xenter#生成密钥cat .ssh/id_rsa.pub >> .ssh/authorized_keys' ~$ o% ]: G9 c/ z- Y
9 c3 k) C# P* j1 P, l

4 H6 u8 j( G7 B' b: n' D
将密钥复制到所有计算节点的/var/lib/nova/.ssh下,并设置权限为nova用户
编辑/etc/nova/nova.conf的配置文件,修改下面参数
allow_resize_to_same_host=True scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
在计算节点重启nova服务
systemctl restart openstack-nova-compute.service
在controller节点重启nova 相关服务
systemctl restart openstack-nova-api.service openstack-nova-scheduler.service

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2018-11-28 22:32:50 | 显示全部楼层
配置方案
& z$ g$ n8 \$ V/ X! i1.修改Nova.conf文件5 |) p" K1 d7 p4 _+ z0 _
添加:
; u# [# i$ J' O9 R% F& Rimage_cache_manager_interval=02 _' q3 `" Q; {, |. g
live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_UNSAFE
4 ]: q) K# G  Z0 T" G! s, t$ _% ~修改:
! E2 M: f4 H% S+ G7 j: W; ]. tvncserver_listen=0.0.0.0
' ~2 a" |5 p! b) E8 {! K( u2.参与的计算节点机器名字都能ping通。6 X9 j2 ^3 o, s' F
3.修改计算节点上 /etc/libvirt/libvirtd.conf:9 W  b! g# o: l# _& ^$ u9 x

" P1 M( i* W  q$ Z2 | before : #listen_tls = 0
/ T# r7 }/ z" c6 t. F4 M- T' ?after : listen_tls = 0
% k' R+ ?# D) R: p4 O& ]* p% `' D$ Z1 c5 P# k8 {" F) |% O
before : #listen_tcp = 1
2 v5 K: {% N1 U: J9 r( v2 S2 I) G- iafter : listen_tcp = 1
8 t: i1 k7 N7 g7 ?( J' [
$ k' ~. E/ H8 ~add: auth_tcp = "none"
9 L. }9 E( I' s" n/ g
3 x7 p1 z4 k/ c' O1 d& Y$ M4.修改 /etc/sysconfig/libvirtd:
7 ]( D5 G. h7 j1 h( L4 H: E- wbefore :# LIBVIRTD_ARGS="--listen"2 W/ L+ ~! ^: g) e+ P5 ~$ D; G0 k
after :LIBVIRTD_ARGS="–listen"
6 Z9 D9 I5 x0 `. s, V5.在源计算节点上修改要迁移虚机的/var/run/libvirt/qemu/instance–xxx.xml文件
' p/ C" O# w5 p1 y$ w* G删除migrate-qemu-fd这一行,将vnc参数修改成0.0.0.0
9 P  N- ?5 I% S+ n8 g8 I9 K6.重启计算节点上nova# B& N; [+ k, j
7备注:
! a/ P: Z. t- g# [) h* y, `# S1.由于云机之前没有配置在线迁移,在迁移虚机之前,需要重启虚机。
0 n& {( G% O% U2 G) I8 l2..因为计算节点上libvirtd的配置中增加了auth_tcp="none",算是一个安全漏洞,需要寻找更安全的办法,或者在迁移完成之后,注释掉这行,重启libvirt
5 ^5 Z. Q7 d) y% _- [3 已经编写了一个辅助程序自动做迁移
; ~3 L" F# l2 {: w" \8 z% u5 A; N
1 r8 i! F0 z; y& I( Q( T) \0 d3 E遇到的问题和解决办法2 d9 W/ p3 D4 D; {9 s8 J) f

$ `& \! a5 g5 X* w* J1.虚机的disk 的cache mode为writethrough,迁移的时候报错
9 m* J& U3 Z; ?, ~7 c1 v: fopenstack认为在centos上磁盘cache mod为writethrough时,迁移是不安全的。) |7 {" ]: _$ q. E& t
解决的办法  :在nova.conf live_migration_flag参数后面增加VIR_MIGRATE_UNSAFE,官方在线迁移配置文件里没有这个参数。
4 M, j* a. J0 y& D2.qemu1.4的一个bug导致迁移失败- k6 t7 P5 P- b" Q
迁移失败,在目的节点上/var/log/libvrit/qemu/instances--xxxx.log里:
. ~. X9 P0 C1 h8 ~% j$ s9 k! M3 C( Hchar device redirected to /dev/pts/1 (label charserial1)
+ o9 T5 C5 a9 Yqemu: warning: error while loading state section id 2) k6 P" f0 x" x( V* U# X7 Q- E0 l
load of migration failed
- A, t6 t# S9 |% h& x1 E8 N) B解决办法:
. b6 m- d% A0 S7 t6 f. a: e1.在源计算节点上修改要迁移虚机的/var/run/libvirt/qemu/instance–xxx.xml文中删除migrate-qemu-fd这一行$ S) Y2 d8 u5 f7 O  g
2.重启源计算节点上的libvirtd8 M, V& X& t: w# S1 ^0 G6 l
3.然后再执行nova live-migration命令  ~, I1 A+ E+ B# N0 ~! b3 r) c$ t
! G$ R* d: c5 `( `" ~, w
这个操作已经编写了一个程序自动执行。
# d8 M0 [$ H" r" L# z8 I3.vncserver的问题,需要重启虚拟机才可以迁移。6 ]/ r2 _3 A( z% V
由于之前Nova.conf中vncserver_listen=计算机节点的ip,所以在虚拟机Kvm进程中参数中vnc=计算节点的ip,迁移的时候报错,在目的节点绑定不了源节点的IP,所以需要修改Libvirt.xml配置文件,重启虚机,然后才能进行迁移。( d7 W8 V& n+ u" ?+ b+ y8 i& S
解决办法:9 E, ^5 I$ \( I6 y/ D8 t, j
$ V$ s' E/ i2 _' ]
1.在源计算节点上/var/run/libvirt/qemu/instance–xxx.xml文中将vnc的参数修改成0.0.0.0$ }4 y* x/ @7 H* r4 n1 y

; k, e8 \2 o$ P9 e, y% ^2.重启源计算节点libvirtd
; w: y* `& O- Z7 c' U# ~
) R+ N5 [) n7 @- g) T1 j3.然后再执行nova live-migration命令: b6 r/ h) h4 A- v
+ `( }  v7 k5 Y! [. C
这个操作已经编写了程序来自动完成6 r$ }  V7 J7 d3 k1 g% Q1 ^! X+ v

; M$ W$ j$ ~5 {5 \* P$ t/ r. k$ ~4.迁移完成后console.log,disk属主变成了root/root. b" z4 W2 ^0 q5 d. }* I' n- t9 |
迁移完成后,发现虚机的console.log和disk文件属主由qemu.qumu变成了root.root,这个估计是openstack迁移程序的问题,这个问题目前没有影响虚机。7 m% ]' a+ w1 o$ r7 w
解决办法:2 B/ e- Z1 p/ z' Z
修改文件属主,这个操作已经编写了程序来自动完成- H, }6 E  Z/ P! o$ ?
5.源节点和目的节点cpu不兼容问题
& [; _% {: m: C& g5 Z, z迁移失败,在/var/log/nova/compute的日志:
) ?. G! D* P1 |/ @( p# o; v# }/ n "InvalidCPUInfo: Unacceptable CPU info: CPU doesn't have compatibility.\n\n0\n\nRefer to http://libvirt.org/html/libvirt-libvirt.html#virCPUCompareResult\n"]5 A, C7 P  \" @
解决办法:
* \1 j+ B  h" Q: h# u; k目前还没有解决办法* }5 Q$ x& l- ]1 z1 Z0 y! @
6.目的节点内存为负,
! W5 g3 [$ I( I# s* j5 F$ F! O( O迁移失败,从控制节点的api.log上输出的错误是目的节点内存为-3400,不能满足迁移的需要。
3 J$ z& m$ k$ |6 R4 x4 ~3 w
( z. _3 W# H4 L解决办法:
9 f% t- W% v4 c  c5 b9 K, K- p0 h
0 G8 N9 n8 |$ C: L用nova命令指定在该计算节点上创建虚机,能够成功。估计是迁移时候的调度算法和创建虚机时的调度算法不一致。
+ S, ?* X2 c7 [% X) M8 e1 W1 `
( B, Z5 F, e6 v0 z6 J7.错误日志,在2.4上api.log0 Z) g2 i, Z: B% Q5 d9 d
迁移时候一般看的日志有:; ^; i1 n3 Y$ b2 a6 @0 @; v6 N
1.目的节点上的/var/log/libvirt/qemu/instances–xxx.log
+ L3 P+ l! o7 G6 M6 y2.目的节点上的/var/log/nova/compute.log- P0 k' i) Z3 d  ^
3.源节点上的/var/log/nova/compute.log. R! p9 C0 t4 A7 _3 ]3 b6 Y! Y5 Q
有时候迁移失败,命令行执行后报错:* M: m  F6 y7 X, S
ERROR: Live migration of instance bd785968-72f6-4f70-a066-b22b63821c3b to host compute-13 failed (HTTP 400) (Request-ID: req-180d27b5-9dc7-484f-9d9a-f34cccd6daa2)
" ?) i6 ]1 }$ Y6 P1 H9 a但在上述的三个日志文件中都看不到任何的错误信息。
  Z. C0 p5 i/ x8 J& P' e3 C5 o- p! l/ }( P
解决办法:
' U8 X8 L& N' E- Z3 c& |, L+ V9 n在控制节点或者是在操作迁移命令的节点上/var/log/nova/api.log有错误信息
1 z" ]4 _6 ]" M; p0 X- Q+ T
9 ~* X/ u6 j+ H% n) U. T走的弯路
* M# D+ q1 u  L1 [$ U$ k( N0 i) T5 `* @6 W& G; o0 ?+ n( q3 m7 j
1.尝试不用修改nova.conf里的vncserver_listen参数为0.0.0.0,4 R* }/ U4 Q3 r
将/var/run/log/libvirt/qemu/instances--xxx.log里的vnc改成目的节点的ip,重启libvritd,然后进行迁移,可以成功,但如果迁移失败,当需要重新虚机的时候,虚机启动失败,在/var/log/libvrit/qemu/instances-xx.log的错误是
8 d: [- {7 M  aFailed to start VNC server on `172.18.2.15:0': Failed to bind socket: Cannot assign requested address$ ^& j+ f5 ~) Z
而/mnt/instances/instance--xxx/libvirt.xml里没有修改成目的节点的Ip。不知道这个参数被保存到了哪里
5 g# `9 G. f* }% M$ \2.vnc 端口问题5 x, t4 {  I, r) ?4 U
在一次迁移失败后,在目的节点/var/log/libvirt/qemu/instance--xxx.log里的错误是:
& ~% c; a, X9 \  {/ K  I" Q2 t2013-11-05 05:42:39.401+0000: shutting down3 r" @" j' M  j; `* W+ p
qemu: terminating on signal 15 from pid 10271,
2 W. e9 i' k. r  w; D8 m. A  ?) @  b" S" o  F2 a: _" D
猜想是由于虚机在源节点上的vnc监听端口在目的节点上被占用,所以导致启动不了。后来在其他机器上做了测试发现,在迁移到目的节点后vnc的端口自己会调整。3 O/ O* |. d& `) A1 K

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-2-23 23:57:41 | 显示全部楼层
nova migrate  4618373d-164f-4f5e-96b4-e59f4f2c3d86   冷迁移命令* Y. b" X# [' o8 f4 F3 Z
openstack server migrate  4618373d-164f-4f5e-96b4-e59f4f2c3d86  冷迁移命令  不能指定物理机
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 01:23 , Processed in 0.020114 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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