26 KVM热迁移虚拟机

news2024/10/7 8:29:02

文章目录

    • 26 KVM热迁移虚拟机
      • 26.1 总体介绍
        • 26.1.1 概述
        • 26.1.2 应用场景
        • 26.1.3 注意事项和约束限制
      • 26.2 热迁移操作
        • 26.2.1 前提条件
        • 26.2.2 热迁移脏页率预测(可选)
        • 26.2.3 设置热迁移参数(可选)
        • 26.2.4 热迁移操作(共享存储场景)
        • 26.2.5 热迁移操作(非共享存储场景)
        • 26.2.6 热迁移操作(加密传输)

26 KVM热迁移虚拟机

26.1 总体介绍

26.1.1 概述

当虚拟机在物理机上运行时,物理机可能存在资源分配不均,造成负载过重或过轻的情况。另外,物理机存在硬件更换、软件升级、组网调整、故障处理等操作,如何在不中断业务的情况下完成这些操作十分重要。虚拟机热迁移技术可以在业务连续前提下,完成负载均衡或上述操作,提升用户体验和工作效率。虚拟机热迁移通常是将整个虚拟机的运行状态完整保存下来,同时可以快速恢复到原有的甚至不同的硬件平台上。虚拟机恢复后,仍然可以平滑运行,用户感知不到任何差异。根据虚拟机数据存储在当前主机还是远端存储设备(共享存储)的不同,openEuler支持共享存储热迁移和非共享存储热迁移两种方式。

26.1.2 应用场景

共享存储和非共享存储热迁移的共同应用场景有:

  • 当物理机故障或者负载过重时,可以将运行的虚拟机迁移到另一台物理机上,以避免业务中断,保证业务的正常运行。
  • 当多数的物理机负载过轻时,可以将虚拟机迁移整合,以减少物理机数量,提高资源的利用率。
  • 当物理服务器硬件设备成为瓶颈,比如CPU、内存、硬盘等,需要更换性能更好的硬件,或者需要增加设备,但是又不能关闭虚拟机或者停止业务。
  • 服务器软件升级,比如虚拟化平台升级,就可以把虚拟机从旧版本虚拟化平台热迁移到新版本虚拟化平台。

对于非共享存储热迁移,还可以应用在如下场景:

  • 当物理机故障存储空间不足,需要将运行的虚拟机迁移到另一台物理机上,可以避免业务中断,保证业务的正常运行。
  • 当物理机存储设备老化,性能不能支撑当前业务数据处理,成为系统性能的瓶颈,需要更换性能更强的存储,但是又不能关闭虚拟机或者停止虚拟机,这需要将运行的虚拟机迁移到一个具有更好性能的物理机上。

26.1.3 注意事项和约束限制

  • 热迁移过程中,需要保证网络状态良好。如果发生网络中断,热迁移会暂停,直到网络恢复后才会继续,当发生超时,热迁移会失败。
  • 迁移过程中,不允许对虚拟机进行生命周期和管理虚拟机硬件设备等操作。
  • 虚拟机正在迁移的过程中,应尽可能保证源端、目的端服务器不被意外下电或重启,否则会导致热迁移失败,甚至可能导致虚拟机被下电。
  • 虚拟机正在迁移的过程中,不允许对虚拟机做关机、重启或恢复操作,否则可能会导致热迁移失败,当执行ACPI方式重启时,再执行热迁移会导致虚拟机关闭。
  • 只支持同构热迁移,即源端和目的端CPU型号需要相同。
  • 跨业务网段虚拟机迁移可以成功,但是到目的端后会出现网络异常,为了防止该情况发生,需要用户保证迁移业务网段一致。
  • 如果源端虚拟机vCPU数大于目的端的物理机CPU核数,则迁移后将会影响到虚拟机的性能,应保证目的端物理机CPU核数大于等于源端虚拟机vCPU数。

非共享存储热迁移过程中的额外注意事项:

  • 不支持迁移源端和目的端为同一个磁盘镜像文件的迁移,用户需要对该类迁移进行特殊处理,提防覆盖写坏数据而导致镜像损坏。
  • 不支持对共享磁盘的迁移,用户需要对该类迁移进行防呆处理。
  • 迁移的目的端镜像只支持文件,不支持裸设备,用户需要对目的端是裸设备的迁移进行防呆处理。
  • 目的端需要创建与源端大小、数量相同的磁盘镜像,否则迁移失败。
  • 混合迁移场景,需要传入迁移的磁盘,不能包括共享和只读的磁盘。

26.2 热迁移操作

26.2.1 前提条件

  • 进行热迁移之前要确保源端和目的端主机之间的网络是互通的,并且源端和目的端获得资源权限是对等的,即两端同时能够访问到相同的存储资源和网络资源。
  • 在执行虚拟机热迁移前应当对虚拟机进行健康检查,并确保目的端主机有足够的CPU、内存和存储资源。

26.2.2 热迁移脏页率预测(可选)

用户在迁移前可以使用dirtyrate功能,获取热迁移的内存脏页变化速率,根据虚拟机内存使用情况评估虚拟机是否适合迁移或配置合理的迁移参数。

使用方法:

例如,指定名为openEulerVM的虚拟机,计算时间为1s:

# virsh qemu-monitor-command openEulerVM '{"execute":"calc-dirty-rate", "arguments": {"calc-time": 1}}

间隔1s后,查询脏页变化速率:

# virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}'

26.2.3 设置热迁移参数(可选)

在执行热迁移之前,可以通过使用virsh migrate-setmaxdowntime命令来指定虚拟机热迁移过程中能够容忍的最大停机时间,这是一个可选的配置项。

例如,指定名为_openEulerVM_的虚拟机最大停机时间为500ms:

# virsh migrate-setmaxdowntime openEulerVM 500

同时,可以通过调用virsh migrate-setspeed来限制虚拟机热迁移占用的带宽大小,防止当前虚拟机热迁移的时候占用带宽过大,对主机上的其他虚拟机或者业务造成影响,这个选择同样也是热迁移的一个可选项。

例如,指定名为_openEulerVM_的虚拟机热迁带宽为500Mbps:

# virsh migrate-setspeed openEulerVM --bandwidth 500

用户可以使用migrate-getspeed来查询虚拟机热迁移过程中的最大带宽。

[root@superman-21 ~]# virsh migrate-getspeed openEulerVM
500
[root@superman-21 ~]# 

用户可以使用migrate-set-parameters来设置热迁移时相关的参数,与热迁移压缩的参数如下所示:

  1. compress-level: 压缩级别,默认:1
  2. compress-threads: 压缩线程数目,默认:8
  3. compress-wait-thread: 是否等待压缩线程,默认:true
  4. decompress-threads: 解压缩线程数目,默认:2
  5. compress-method: 压缩算法选择(zlib、zstd),默认:zlib

例如,指定名为_openEulerVM_的虚拟机热迁算法为zstd,其余参数采用默认设置。

# virsh qemu-monitor-command openEulerVM '{ "execute": "migrate-set-parameters", "arguments": {"compress-method": "zstd"}}'

用户可以使用query-migrate-parameters来查询热迁移时相关的参数。

# virsh qemu-monitor-command openEulerVM '{ "execute": "query-migrate-parameters"}' --pretty

{
  "return": {
    "xbzrle-cache-size": 67108864,
    "cpu-throttle-initial": 20,
    "announce-max": 550,
    "decompress-threads": 2,
    "compress-threads": 8,
    "compress-level": 1,
    "compress-method": "zstd",
    "multifd-channels": 2,
    "announce-initial": 50,
    "block-incremental": false,
    "compress-wait-thread": true,
    "downtime-limit": 300,
    "tls-authz": ,
    "announce-rounds": 5,
    "announce-step": 100,
    "tls-creds": ,
    "max-cpu-throttle": 99,
    "max-postcopy-bandwidth": 0,
    "tls-hostname": ,
    "max-bandwidth": 33554432,
    "x-checkpoint-delay": 20000,
    "cpu-throttle-increment": 10
  },
  "id": "libvirt-18"
}

26.2.4 热迁移操作(共享存储场景)

  1. 确认是否为共享存储。

    [root@superman-21 ~]# virsh domblklist <VMInstanse>
     Target   Source
    --------------------------------------------
    sda      /dev/mapper/open_euleros_disk
    sdb      /mnt/nfs/images/openeuler-test.qcow2
    [root@superman-21 ~]# 
    

    首先,使用virsh domblklist命令查询虚拟机的存储设备信息,例如上面的查询结果显示虚拟机配置有2个存储设备:sda盘和sdb盘,然后再分别查询一下这两个设备对应后端存储是本地存储还是远端存储,如果虚拟机的所有存储设备都在远端共享存储之上,则说明该虚拟机为共享存储虚拟机,否则为非共享存储虚拟机。

  2. 执行如下命令,进行虚拟机热迁移。

    例如,将虚拟机_openEulerVM_迁移到目的主机上使用virsh migrate命令。

    # virsh migrate --live --unsafe openEulerVM qemu+ssh://<destination-host-ip>/system
    

    其中,为目的主机IP地址,热迁移之前需要进行ssh认证以获取目的端主机管理员权限。

    另外,virsh migrate命令还有–auto-converge和–timeout子选项来保证迁移的顺利完成。

    其中,相关子选项:

    –unsafe命令会强制进行热迁移,忽略安全检查步骤。

    –auto-converge命令会对CPU进行降频限速,确保热迁移流程能够收敛。

    –timeout选项会指定一个热迁移超时时间,热迁移超过指定时间后会强制挂起虚拟机让热迁移得以收敛。

  3. 热迁移完成后命令返回,虚拟机在目的端主机正常运行。

26.2.5 热迁移操作(非共享存储场景)

  1. 首先,先查询虚拟机存储设备列表,确保虚拟机使用的是非共享存储。

    例如,通过virsh domblklist查询到准备迁移的虚拟机有一个qcow2格式的磁盘sda,sda的xml配置为:

        <disk type='file' device='disk'>
          <driver name='qemu' type='qcow2' cache='none' io='native'/>
          <source file='/mnt/sdb/openeuler/openEulerVM.qcow2'/>
          <target dev='sda' bus='scsi'/>
          <address type='drive' controller='0' bus='0' target='0' unit='0'/>
        </disk>
    

    执行热迁移之前需要在目的端主机相同磁盘目录下创建一个虚拟磁盘文件,注意磁盘的格式和大小必须保持一致。

    # qemu-img create -f qcow2 /mnt/sdb/openeuler/openEulerVM.qcow2 20G
    
  2. 在源端使用virsh migrate命令来执行热迁移,迁移的时候会将存储也一并迁移到目的端。

    # virsh migrate --live --unsafe --copy-storage-all --migrate-disks sda \
    openEulerVM qemu+ssh://<dest-host-ip>/system
    
  3. 热迁移完成后命令返回,虚拟机在目的端主机行正常运行,存储设备也被迁移到目的主机上。

26.2.6 热迁移操作(加密传输)

  1. 简介

为了能够更好的对虚拟机热迁移过程中数据的加密,openEuler提供了使用TLS对迁移数据进行加密的特性。几乎QEMU中所有的网络服务都能够使用TLS对会话数据进行加密操作,同时也可以使用X509证书对客户端进行简单的身份认证。

  1. 应用场景

典型应用场景为要求热迁移过程中虚拟机数据在源端和目的端进行传输时保证数据的安全性。

  1. 注意事项

在使用TLS对虚拟机进行热迁移前,需要申请证书,然后在源端和目的端分别设置证书。使用TLS功能前需要打开对端认证配置项,需在/etc/libvirt/qemu.conf文件中设置migrate_tls_x509_verify = 1。

单通道TLS热迁移的业务中断时长、迁移时长会有明显增长,迁移带宽上限100~200MB/s,可能导致迁移失败。

支持使用multiFd进行多通道TLS迁移,但会增加CPU开销(多开2个迁移线程),可能影响虚拟机运行;建议通过设置热迁移线程CPU亲和性将热迁移线程享受的CPU资源与虚拟机进程绑定的CPU资源隔离,迁移每台虚拟机建议绑定2个CPU。

  1. 使用方法

单通道热迁移加密传输命令

# virsh migrate --live --unsafe --tls --domain openEulerVM --desturi qemu+tcp://<destination-host-ip>/system --migrateuri tcp://<destionation-host-ip>

多通道热迁移加密传输命令

# virsh migrate --live --unsafe --parallel --tls --domain openEulerVM --desturi qemu+tcp://<destination-host-ip

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

image-20230521203239674

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:文本三剑客之awk

Linux&#xff1a;文本三剑客之awk 一、awk编辑器1.1 awk概述1.2 awk工作原理1.3 awk与sed的区别 二、awk的应用2.1 命令格式2.2 awk常见的内建变量&#xff08;可直接用&#xff09; 三、awk使用3.1 按行输出文本3.2 按字段输出文本3.3 通过管道、双引号调用 Shell 命令 一、a…

【模电实验】日光灯电路及功率因数的提高

实验4 日光灯电路及功率因数的提高 一、实验目的 1&#xff0e;理解提高功率因数的意义并掌握其方法。 2&#xff0e;掌握日光灯电路的联接。 二、原理说明 日光灯电路结构及工作原理 日光灯电路如图4-1所示&#xff0c;日光灯由灯管、镇流器和启辉器三部分组成。 &…

复制带随机指针的链表

&#x1f495;“如果你关注自己已经拥有的&#xff0c;你就会拥有更多。如果你只关注自己没有得到的&#xff0c;你永远不会满足。” - 奥普拉温弗瑞&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;Java学习&#x1f3…

11. Redis集群(cluster)

11. Redis集群cluster 是什么&#xff1f;能干嘛&#xff1f;集群算法-分片-槽位slot官网出处redis集群的槽位slotredis集群的分片他两的优势slot槽位映射&#xff0c;一般业界有3种解决方案哈希取余分区—致性哈希算法分区3大步骤算法构建一致性哈希环redis服务器IP节点映射k…

【Python sqlite3】零基础也能轻松掌握的学习路线与参考资料

Python sqlite3是Python语言自带的轻量级关系数据库管理系统&#xff0c;它可以让我们在不需要额外的安装和配置下&#xff0c;使用SQLite数据库进行操作和管理。SQLite是一个功能强大的嵌入式数据库&#xff0c;它非常适合在轻量级应用程序中使用&#xff0c;如桌面应用程序、…

ROS学习(4)——launch文件的编写

对于一个复杂的系统,会有十几个、几十个甚至是上百个节点在运行,如果我们每次都是采取“打 开终端、运行 rosrun 指令”来启动应用程序,显得效率非常低。我们需要一个更方便的方式来启动系统。ROS 中提供了“使用 launch 文件 roslaunch”命令来完成系统的启动。具体的实现方法…

Java·Lambda

文章目录 ⚽️1 背景⚽️&#x1f34f;1.1 Lambda表达式的语法&#x1f34f;&#x1f34e;1.2 函数式接口&#x1f34e; &#x1f3c0;2 Lambda表达式的基本使用&#x1f3c0;&#x1f348;2.1 语法精简&#x1f348; &#x1f3c8;3 变量捕获&#x1f3c8;&#x1f3c6;3.1 匿…

Linux Audio (7) DAPM-4 Path/Route添加过程

DAPM-4 Path/Route添加过程 route分类&#xff1a;route转化为Pathcodec驱动add widgetMechine驱动add kcontrol route分类&#xff1a; 常规route {“sink”, NULL, “source”}&#xff0c;其path->connect1 sink widget是Mixer {“Mixer”, name1, “source1”} {“Mixe…

chatgpt赋能Python-python88

Python88 简介 Python88 是一个优秀的 Python 开源库&#xff0c;它提供了许多有用的函数和工具&#xff0c;可用于创建高效的 Web 应用程序&#xff0c;简化数据分析、数据可视化以及机器学习和人工智能任务等。 Python88 帮助开发人员以更简单、更快捷的方式编写代码&#…

VS Code Remote Development

1、Ubuntu 上启用 SSH &#xff08;1&#xff09;打开终端&#xff0c;并且安装openssh-server软件包&#xff1a; sudo apt update sudo apt install openssh-server 当被提示时&#xff0c;输入你的密码并且按 Enter&#xff0c;继续安装。 &#xff08;2&#xff09;安…

RocketMQ消息发送

消息发送示例代码&#xff1a; public static void main(String[] args) throws MQClientException, InterruptedException {DefaultMQProducer producer new DefaultMQProducer("please_rename_unique_group_name");producer.setNamesrvAddr("127.0.0.1:9876…

leetcode-743. 网络延迟时间

1.思路分析&#xff1a; 一道Dijkstra模板题 推荐Dijkstra算法讲解教程 Dijkstra&#xff08;有向图某点到其他所有点的最短路径问题&#xff09; Dijkstra算法的基本思想是贪心策略&#xff0c;每次从未确定最短路径的顶点中选择距离源点最近的一个&#xff0c;然后以该顶点…

Python使用正则表达式

正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;又称规则表达式&#xff0c;是一个计算机科学的概念&#xff0c;通常被用来检索和替换符合某些规则的文本。 1. 正则表达式语法 正则表达式就是记录文本规则的代码。 1. 行定位符 行定位符就是用来描述字…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十二届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.ADC:开启ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就行了…

MySQL高级(InnoDB引擎)

&#xff08;一&#xff09;逻辑存储结构 表空间&#xff08;ibd文件&#xff09;&#xff0c;会生成ibd文件&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据。 段&#xff0c;分为数据段&#xff08;Leaf node segment&#xff09;、索引段…

学弟研一,有几篇SCI论文,做过前端,读博 or 走开发进国企?

同学你好&#xff0c;在正面先抛开选择就业的方面的问题&#xff0c;其实我觉得生活种的很多选择&#xff0c;都可以从以下的几点进行斟酌与考虑&#xff1a; &#xff08;1&#xff09;你最擅长的是哪个方面&#xff1f;&#xff08;2&#xff09;你的兴趣爱好是在哪个方面&am…

从0开始搭建完整UVM工程(可直接用于实际的工程中)、含源码(包括makefile文件)、可直接运行,及详细注释

一、说明 网上的实现uvm工程代码都是抄自张强所著的《UVM实战》,都是讲所有文件放到一个文件夹,且不涉及到实际工程中的uvm结构,以及多文件层级结构,让人理解起来较为困难,本文则将会从0开始教大家如何搭建一个具有实际工程效果的UVM框架: 其对应的书中的框架图如下所示:…

chatgpt赋能Python-pythoncontinue

简介 Python是一种高级编程语言&#xff0c;受到越来越多的人们的欢迎。其中&#xff0c;continue是Python语言中的一个很重要的关键字&#xff0c;它的出现可以很好地帮助程序员们实现自己的编程目标。在本文中&#xff0c;我们将介绍continue关键字&#xff0c;并解释它在Py…

Fourier分析入门——第5章——连续函数

目录 第 5 章 连续函数 5.1 引言 5.2 内积和正交性(Inner products and orthogonality) 5.3 对称性(Symmetry) 5.4 复数值函数 第 5 章 连续函数 5.1 引言 在前面的章节中&#xff0c;我们只考虑了在有限区间 L 上定义的离散函数的Fourier级数模型。此类函数在实验科学…

spring 源码

bean的创建 获取类class 推断构造方法 Autoware 创建一个普通对象 依赖注入 populateBean 把一些属性注入 初始化之前 PostConstruct 注解 初始注入 实际可以用构造方法啊 初始化 initializationBean 1.判断是否有aware接口 invokeAwareMethods 2.执行 applyBeanP…