KVM高级功能部署

目录

一:案例分析

1:案例概述

2:案例前置知识点

2.1:KVM 虚拟机迁移

2.2:KSM 内核同页合并

二:案例环境

1:本案例环境

2:案例需求

3:案例实现思路

三:案例实施

1:静态迁移

2:基于共享存储的动态迁移

3:基于数据块的动态迁移

4:KSM

(1)检查当前 Linux 系统是否支持 KSM

(2)ksmd服务的配置文件

(3)配置 KSM 优化内存

技术对比表


一:案例分析


1:案例概述


企业内部为了使服务器资源达到最大化利用,通常都会进行 KVM 虚拟化,每台服务器上运行多台 KVM 虚拟机。随着 KVM 虚拟机数量的不断增多,个别服务器会出现资源过载现象,这时候就需要对部分 KVM 虚拟机进行迁移,迁移到负载相对较低的服务器上。
为了解决以上问题,针对可停机的 KVM 虚拟机,可使用静态迁移的方式来迁移 KVM 虚拟机。针对在线提供服务、不可停机的 KVM 虚拟机,可使用基于共享存储的动态迁移或基于数据块的动态迁移来完成迁移工作。最终按业务类型将虚拟机重新调配、合理布局,以保证服务器一直处于良好的运行状态。除了迁移之外,还可以在 KVM 宿主机上开启 KSM 内核同页合并,以达到节省内存、降低负载的目的。

2:案例前置知识点

2.1:KVM 虚拟机迁移

KVM 虚拟机迁移,是将某一虚拟机上的环境和软件完全复制到另一台物理机上继续运行。KVM 虚拟机迁移可以优化系统负载、重新规划 KVM 虚拟机布局并简化 KVM 虚拟机的管理维护工作。

KVM 虚拟机迁移的主要应用场景如下所示。
当一台 KVM 宿主机的负载比较高时,可将源 KVM 宿主机上的部分虚拟机迁移到负载较低的 KVM 宿主机中,以保证服务质量。
通过 KVM 虚拟机迁移将多台负载较低的 KVM 宿主机上的 KVM 虚拟机集中迁移到某一台 KVM 宿主机上,从而达到节约资源的目的。
在升级 KVM 宿主机硬件设备时,可以将 KVM 宿主机上运行的 KVM 虚拟机迁移到其他 KVM 宿主机上,以解决对硬件的依赖,从而实现业务不中断情况下对物理硬件设备的升级。
跨地域迁移,实现 KVM 虚拟机的远程迁移。
根据迁移方式的不同,可将迁移分为静态迁移(static magration)和动态迁移(live migration)二者的区别是:静态迁移时会有一段时间虚拟机中的服务是不可用的,而动态迁移则没有明显的服务暂停时间。

(1)静态迁移
静态迁移需要先关闭要迁移的 KVM 虚拟机,并拷贝它的磁盘文件和配置文件到目标 KVM 宿主机,然后恢复启动,从而实现静态迁移。如果 KVM 虚拟机的磁盘文件存储在 KVM 宿主机本地,在静态迁移时需要拷贝磁盘文件和配置文件;如果 KVM 虚拟机的磁盘文件存储在共享存储上,在静态迁移时,只需要拷贝 KVM 虚拟机的配置文件,KVM 虚拟机的磁盘文件可通过挂载共享存储到本地目录的方式来获取。针对 KVM 虚拟机磁盘文件存储位置的不同,在静态迁移时需要做适当的调整。
(2)动态迁移
动态迁移是保证 KVM 虚拟机上运行的应用正常提供服务的同时,让 KVM 虚拟机在不同的 KVM 宿主机之间进行迁移。动态迁移的过程仅有非常短暂的停机时间,甚至可以忽略不计,同时 KVM 虚拟机上已经打开的应用连接不会断开,依然保持不变。KVM 的动态迁移有两种方式:一种是基于共享存储的动态迁移,另一种是基于数据块的动态迁移。

① 基于共享存储的动态迁移
基于共享存储的动态迁移是在 KVM 虚拟机迁移开始后,被迁移的 KVM 虚拟机依然保持在源 KVM 宿主机上运行。与此同时,KVM 虚拟机的内存页被传输到目标 KVM 宿主机之上。QEMU/KVM 会监控并记录迁移过程中所有已被传输的内存页的任何修改,并在所有内存页传输完成后再开始传输在前面传输过程中被更改的内存页内容。QEMU/KVM 也会评估迁移过程中的传输速度,当剩余的内存数据量能够在一个可设定的时间周期内完成传输,QEMU/KVM 将会关闭源宿主机上的 KVM 虚拟机,再将剩余的数据量传输到目标宿主机,最后通过传输过来的内存内容在目标宿主机上恢复 KVM 虚拟机的运行状态。如此即可完成 KVM 基于共享存储的动态迁移。如果 KVM 虚拟机中内存使用量非常大且修改频繁,内存中数据被不断修改的速度大于 KVM 能够传输的内存速度,该情况下无法使用动态迁移,只能使用静态迁移方法来进行 KVM 虚拟机迁移。
② 基于数据块的动态迁移
如果对使用本地存储的 KVM 虚拟机进行在线迁移,就要用到基于数据块的动态迁移。上述基于共享存储的动态迁移,为了实现动态迁移,源 KVM 宿主机和目标宿主机需要连接共享存储服务,而基于数据块的动态迁移,共享存储不再是动态迁移的必要条件。在迁移过程中,KVM 虚拟机只使用本地存储,不再需要共享存储的支持,因此迁移环境比较简单,迁移的源宿主机和目标宿主机只需要保持以太连接即可。因为少了共享存储,所以降低了动态迁移的难度。

2.2:KSM 内核同页合并


KSM(Kernel SamePage Merging)被称为内核同页合并。KSM 允许内核在两个或多个进程之间共享完全相同的内存页。KSM 让内核扫描正在运行中的程序并比较它们的内存,如果发现它们的内存区域或内存页是完全相同的,就将相同的内存合并为一个单一的内存页,并将其标识为 “写时复制(copy-on-write)”,这样可以起到节省系统内存使用量的作用。如果有进程试图去修改被合并并且被标识为 “写时复制” 的内存页,就为该进程复制出一个新的内存页供其使用。

二:案例环境

1:本案例环境

KVM高级功能部署_第1张图片

主机

操作系统

IP地址

主要软件

kvm01

CentOS7.9 x86_64

192.168.10.201

Qemu-kvm、libvirt

kvm02

CentOS7.9 x86_64

192.168.10.202

Qemu-kvm、libvirt、qemu-kvm-ev

kvmnfs

CentOS7.9 x86_64

192.168.10.101

nfs-utils

2:案例需求

  • 通过静态迁移实现 KVM 虚拟机的迁移。
  • 通过基于共享存储的动态迁移方式实现 KVM 虚拟机的迁移。
  • 通过基于数据块的动态迁移方式实现 KVM 虚拟机的迁移。
  • 实现 KSM 内存优化。

3:案例实现思路

  • 通过拷贝磁盘文件和配置文件的方式实现静态迁移。
  • 通过配置 NFS 共享服务,实现基于共享存储的动态迁移。
  • 通过基于数据块的方式实现动态迁移。
  • 针对同类型 KVM 虚拟机和应用使用 KSM 来优化内存。

三:案例实施

1:静态迁移

原理:在虚拟机关机状态下,将完整磁盘镜像、配置文件等资源拷贝到目标主机,随后重新注册启动。

关键步骤

  • 停止源虚拟机。
  • 复制虚拟磁盘、配置文件(如XML描述文件)至目标主机。
  • 在目标主机重新定义虚拟机并启动。

优点

  • 实现简单,兼容性高(跨平台/跨版本)。
  • 无需额外硬件支持(如共享存储)。

缺点

  • 停机时间长,业务中断。
  • 不适用于高可用场景。
#导出虚拟机 test01的 xml 配置文件
virsh dumpxml test01 > test01.xml
#定位虚拟机 test01 的磁盘文件 
virsh domblklist test01

102:
#现在kvm02上创建目录
mkdir -p /data_kvm/store

101:
#关闭虚拟机
virsh shutdown test01
virsh list --all
#到kvm01上拷贝文件到kvm02上
scp test01.xml 192.168.10.102:/etc/libvirt/qemu/
scp /data_kvm/store/test01.qcow2 192.168.10.102:/data_kvm/store/

2:基于共享存储的动态迁移

原理:虚拟机运行过程中,将内存状态实时同步至目标主机,最终切换至共享存储(如SAN/NFS),实现业务无感知迁移。

关键步骤

  • 源与目标主机挂载同一共享存储(虚拟机磁盘存放于此)。
  • 通过迁移工具(如Libvirt/QEMU)逐轮迭代传输内存脏页。
  • 最后一次快速迭代冻结源VM,切换至目标主机。

优点

  • 零停机(用户无感知)。
  • 迁移速度快(仅需同步内存,磁盘无需拷贝)。

缺点

  • 依赖共享存储,成本高。
  • 网络延迟敏感(建议千兆/万兆网络)。
103:
部署共享存储

#关闭防火墙
systemctl stop firewalld
setenforce 0
#在 kvmnfs 服务器上面安装 NFS 服务
dnf -y install nfs-utils
#配置共享目录
mkdir /data
chown -R 777 /data/
vim /etc/export
	/data 192.168.10.0/24(rw,sync,no_root_squash)
#启动并查看 NFS 服务 
systemctl enable nfs 
systemctl enable rpcbind
systemctl start nfs 
systemctl start rpcbind 
netstat -anpt | grep rpcbind

102:
dnf -y install nfs-utils
#源宿主机 kvm01 和kvm02上创建 kgc 目录 
mkdir /data_kvm/kgc
#源宿主机 kvm01 和kvm02上都挂载共享目录
mount -t nfs 192.168.10.101:/data /data_kvm/kgc/
mount

101:
通过现有的磁盘文件生成虚拟机

#拷贝qcow2磁盘文件
cd /opt
cp CentOS-7-x86_64-GenericCloud-2009.qcow2 /data_kvm/kgc/test02.qcow2
#部署虚拟机
virt-customize -a /data_kvm/kgc/test02.qcow2 --root-password password:aptech
(正确报绿色,不正确报红色)
virt-install --name=test02 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/data_kvm/kgc/test02.qcow2',size=10 -w
bridge:br0 --virt-type=kvm --boot hd --osinfo detect=on,require=off

备注:
bus:磁盘总线类型

virsh list --all
#登录测试
virsh destroy test02
virsh list --all
#导出虚拟机 test02的 xml 配置文件
virsh dumpxml test02 > test02.xml

3:基于数据块的动态迁移

原理:在无共享存储环境下,同时迁移内存状态和磁盘数据块(通过网络实时复制)。

关键步骤:

  • 预拷贝阶段:传输磁盘基础数据块和内存状态。
  • 迭代阶段:跟踪并传输变更的磁盘块(脏块)和内存脏页。
  • 切换阶段:短暂暂停VM,同步剩余数据后恢复。

优点:

  • 无需共享存储,灵活性高。
  • 支持异构存储迁移(如本地磁盘→Ceph)。

缺点:

  • 迁移时间较长(受磁盘大小和网络带宽影响)。
  • 对网络稳定性要求极高。
迁移前准备工作 
动态迁移(前提有一个共享存储)

#克隆新的虚拟机
virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2 
#查看
virsh list --all
------------------------------------------------------------------------------
#启动虚拟机
virsh start test01

——怎样动态迁移?
基于共享存储
基于数据块的迁移
——如果没有一个共享存储,怎样动态迁移?

方法二:数据块迁移
(在开机的情况下,同步磁盘里面的数据)
——为甚要用数据块迁移?
不想关机
没有一个共享存储

101:
#创建一个空白磁盘
qemu-img create -f qcow2 /data_kvm/store/test003.qcow2 20G
(磁盘大小要与要被迁移的磁盘大小一致)
#在kvm01主机上执行迁移操作
virsh migrate test04 qemu+ssh://192.168.10.102/system --live --persistent --undefinesource --copy-storage-all --verbose

备注:
--live:实时迁移
--persistent :持久性状态
--undefinesource:删除源主机物理机器上的客户机虚拟机
--copy-storage-all :全磁盘复制
--verbose:显示迁移的进度

102:
查看效果
#启动虚拟机
virsh start test01
cd /data_kvm/store/
ls

4:KSM

  • KSM 服务介绍

Linux内核特性称为Kernel Shared Memory(基于内核的共享内存)或Kernel Samepage Merging。KSMD作为守护进程,能够合并内存页面来增加并发虚拟机的数量。KSM 适用于宿主机过载的情况下。KSM 通过减少每个虚拟机实际占用的内存数,可以让多个虚拟机分配的内存数量之和大于物理内存数量。而对于相同类型的虚拟机,在物理内存量不变的情况下,可以在一个宿主机中创建更多虚拟机,从而提高虚拟化部署的密度,同时也可以提高物理资源的利用效率。

(1)检查当前 Linux 系统是否支持 KSM

[root@kvm02 ~]# egrep -i ksm /boot/config-3.10.0-1160.el7.x86_64 
CONFIG_KSM=y

(2)ksmd服务的配置文件

 ls -l /sys/kernel/mm/ksm/

KSM 的常用配置的作用分别如下所示。

  • max_page_sharing:设置每个 KSM 页面允许的最大共享数量。这个配置设置了重复数据删除限制,以避免虚拟内存 rmap 列表变得太大。max_page_sharing 最小值为 2,因为新创建的 KSM 页面至少有两个共享器。
  • merge_across_nodes:指定是否可以合并来自不同 numa 节点的页面。当设置为 0 时,ksm 只合并物理页面并驻留在同一 numa 节点的内存区域中,可以降低访问共享页面的延迟。
  • pages_to_scan:在 KSM 进程休眠之前会去扫描的内存数量。
  • run:控制 ksmd 进程是否运行,默认值为 0。要激活 ksm 必须设置其值为 1。如果设置为 0,表示停止运行 ksmd, 但会保留已经合并的内存页;如果设置为 1,表示马上运行 ksmd 进程;设置为 2 表示停止运行 ksmd,并分离已经合并的所有内存页,但是保留已经注册为合并的内存区域给下一次使用。
  • sleep_millisecs:设置 ksmd 进程休眠的时间(单位:毫秒),即为 ksmd 进程两次运行之间的间隔。
  • stable_node_chains_prune_millisecs: stable_node“ 中 链 接 的 整 个stable_node“dups”列表被周期性地扫描,以删除陈旧的 stable_nodes。该参数的值用于调节重复扫描的时间(单位:毫秒)。

(3)配置 KSM 优化内存

#先将虚拟机test01克隆出三份
[root@kvm02 ~]# virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
[root@kvm02 ~]# virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2
[root@kvm02 ~]# virt-clone -o test01 -n test04 -f /data_kvm/store/test04.qcow2

注意:
克隆虚拟机,源虚拟机需要关闭状态

#开启所有的虚拟机
[root@kvm02 ~]# virsh start test01
[root@kvm02 ~]# virsh start test02
[root@kvm02 ~]# virsh start test03
[root@kvm02 ~]# virsh start test04

#查看Linux宿主机的内存使用情况

[root@kvm02 ~]# free
              total        used        free      shared  buff/cache   available
Mem:        3861288     2464360      135440       15208     1261488     1157748
Swap:       4194300           2834     4194300

#启动 KSM 服务
检查/sys/kernel/mm/ksm/run的值是否为1,如果不是,修改为1
[root@kvm02 ~]# echo 1 > /sys/kernel/mm/ksm/run

[root@kvm02 ~]# systemctl start ksm 
[root@kvm02 ~]# systemctl start ksmtuned

重启系统
打开这些虚拟机

#再次查看Linux宿主机的内存使用情况
[root@kvm02 ~]# free
              total        used        free      shared  buff/cache   available
Mem:        3861288     2449008      103556       15212     1308724     1173004
Swap:       4194300           0     4194300

技术对比表

技术 是否需要停机 依赖共享存储 迁移速度 适用场景
静态迁移 维护、跨平台迁移
共享存储动态迁移 企业级高可用集群
数据块动态迁移 中等 云环境、异构存储迁移
KSM 不涉及迁移 - 内存优化、高密度部署

你可能感兴趣的:(java,服务器,linux)