1. 虚拟化技术
**KVM(Kernel-based Virtual Machine)**是Linux内核的一个模块,它将Linux变成一个Type 1(裸金属)虚拟机管理程序(Hypervisor)。KVM通过QEMU(Quick Emulator)提供硬件仿真,使多个虚拟机能够在同一个物理主机上并行运行,每个虚拟机都有自己的虚拟硬件环境。
2. 分布式文件系统
**GFS(Global File System)**是一个集群文件系统,允许多台计算机共享一个存储池。GFS2是GFS的改进版,具有更好的性能和稳定性。它通过分布式锁管理(Distributed Lock Manager, DLM)来协调对文件系统的访问,确保数据一致性和完整性。
3. 高可用性集群管理
Pacemaker和Corosync是常见的集群管理工具。Pacemaker负责资源的管理和高可用性,而Corosync提供集群成员的通信和同步。
4. 高可用性(HA)
高可用性系统通过冗余设计和快速故障恢复,确保系统在发生硬件或软件故障时仍然可用。对于虚拟机高可用性,关键在于:
- 故障检测:及时发现节点或虚拟机的故障。
- 自动切换:在故障发生时,将受影响的虚拟机迁移到健康的节点。
- 数据一致性:确保虚拟机的数据在多个节点间一致。
技术原理
1. 分布式存储与GFS2
在KVM高可用性系统中,虚拟机的磁盘文件存储在GFS2文件系统上。GFS2使得多个节点可以同时访问和修改同一个文件系统,依赖DLM来管理文件锁,以防止数据冲突和不一致。
2. 虚拟机管理与KVM
KVM负责创建和管理虚拟机。通过Libvirt API,管理员可以方便地对虚拟机进行创建、启动、停止和迁移操作。虚拟机的配置文件(如XML格式)描述了虚拟机的硬件资源、存储和网络配置。
3. 集群管理与Pacemaker/Corosync
Pacemaker和Corosync配合使用实现高可用性集群:
- Corosync:提供集群节点间的通信,维护节点的成员关系和状态同步。
- Pacemaker:管理集群资源(如虚拟机),定义资源的启动、停止和迁移策略,并根据集群节点的状态自动执行相应操作。
4. 故障恢复与自动切换
当Pacemaker检测到某个节点或虚拟机故障时,会自动将受影响的虚拟机迁移到另一个健康的节点。由于虚拟机的磁盘文件存储在GFS2上,迁移时不需要拷贝数据,只需在目标节点上重新启动虚拟机,数据仍然一致。
架构设计
1. 集群架构
- 节点:至少两个物理节点,每个节点运行KVM和GFS2。
- 存储:共享存储池,使用GFS2文件系统。
- 网络:高速网络连接,确保节点间低延迟和高带宽通信。
2. 高可用性组件
- KVM:提供虚拟化平台。
- GFS2:提供分布式文件系统。
- Corosync:提供集群通信。
- Pacemaker:管理集群资源和高可用性。
3. 典型工作流程
- 虚拟机创建:在GFS2文件系统上创建虚拟机磁盘文件,通过KVM启动虚拟机。
- 监控:Pacemaker持续监控节点和虚拟机的状态。
- 故障检测:当某个节点或虚拟机出现故障时,Pacemaker检测到异常。
- 自动迁移:Pacemaker指示健康节点重新启动受影响的虚拟机。
- 数据一致性:由于使用GFS2,虚拟机在新节点启动后,数据保持一致。
优点与挑战
优点
- 高可用性:快速故障恢复,减少停机时间。
- 数据一致性:GFS2确保多个节点间的数据一致性。
- 可扩展性:可以通过增加节点扩展集群。
挑战
- 复杂性:配置和维护高可用性集群需要较高的技术水平。
- 性能开销:GFS2和集群管理工具会带来一定的性能开销。
- 故障排除:故障发生时,排查和解决问题可能比较复杂。
通过KVM和GFS2结合,可以构建一个高可用性虚拟化平台,确保关键业务的持续运行。关键在于正确配置和维护集群,确保各组件间的协调工作。
部署GFS高可用分布式存储环境
1:安装部署 KVM 虚拟化平台
步骤略
2:部署 GlusterFS
在所有节点上执行如下命令:
(1)关闭防所有节点的防火墙、SELiunx
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
(2)编写 hosts 文件
[root@node1 ~]# cat<<EOF> /etc/hosts
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
192.168.10.104 node4
192.168.10.201 kvm01
192.168.10.202 kvm02
EOF
(3)安装软件
注意:先设置阿里yum仓库
[root@node1 ~]# yum -y install centos-release-gluster
[root@node1 ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
(4)启动 GlusterFS
在所有节点Gluster执行以下操作
[root@node1 ~]# systemctl start glusterd.service && systemctl enable glusterd.service
(5)在 node1 上添加所有节点
[root@node1 ~]# gluster peer probe node2
peer probe: success.
[root@node1 ~]# gluster peer probe node3
peer probe: success.
[root@node1 ~]# gluster peer probe node4
peer probe: success.
(6)查看集群状态
[root@node1 ~]# gluster peer status
3:创建 GlusterFS 分布式复制卷
在所有节点创建/data 目录
[root@node1 ~]# mkdir /data
创建分布式复制卷。
[root@node1 ~]# gluster volume create models replica 2 node1:/data node2:/data node3:/data node4:/data force
查看 models 卷
[root@node1 ~]# gluster volume info models
启动 models 卷
[root@node1 ~]# gluster volume start models
为KVM主机部署GFS存储
1:KVM挂载 glusterfs 卷(所有kvm主机上都配置)
(1)安装 glusterfs 客户端软件。
[root@kvm01 ~]# yum -y install glusterfs glusterfs-fuse
(2)创建挂载目录,并挂载 models 卷。
[root@kvm01 ~]# mkdir /kvmdata
[root@kvm01 ~]# mount -t glusterfs node1:models /kvmdata/
[root@localhost ~]# vi /etc/fstab
node1:models /kvmdata glusterfs defaults,_netdev 0 0
(3)查看挂载卷。
[root@kvm01 ~]# df -h
2:在kvm01上安装虚拟机
(1)拷贝qcow2磁盘文件
将实验用到的系统镜像上传到KVM主机的root家目录中。这里直接使用CentOS官方提供的qcow2格式的系统镜像(CentOS-7-x86_64-GenericCloud-2009.qcow2),这个镜像可以直接部署到kvm或openstack的平台中。
[root@kvm01 ~]# cp CentOS-7-x86_64-GenericCloud-2009.qcow2 /kvmdata/test01.qcow2
(2)部署虚拟机
[root@kvm01 ~]# yum -y install libguestfs-tools
[root@kvm01 ~]# gpasswd -a qemu root
备注:
该工具提供了virt的高级命令,其中有一个virt-customize命令,可以为系统镜像设置密码。
[root@kvm01 ~]# virt-customize -a /kvmdata/test01.qcow2 --root-password password:aptech
[root@kvm01 ~]# virt-install --name=test01 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/kvmdata/test01.qcow2',size=10 -w bridge:br0 --virt-type=kvm --boot hd
备注:
--disk:指定存储设备及其属性
device:设备类型,如cdrom、disk或floppy等,默认为disk;
bus:磁盘总线类型,其值可以为ide、scsi、usb、virtio或xen
--virt-type:使用的hypervisor(虚拟机监视器),如kvm、qemu、xen等
--boot cdrom,hd,network:指定引导次序;
(3)登录测试
测试实时迁移环境
1:配置kvm01和kvm02的无密码登录环境
[root@kvm01 ~]# ssh-keygen -t rsa
[root@kvm01 ~]# ssh-copy-id kvm02
[root@kvm01 ~]# ssh-copy-id kvm01
[root@kvm02 ~]# ssh-keygen -t rsa
[root@kvm02 ~]# ssh-copy-id kvm01
[root@kvm02 ~]# ssh-copy-id kvm02
2:将test01虚拟机从kvm01主机迁移到kvm02主机
[root@kvm01 ~]# virsh migrate --persistent --undefinesource test01 qemu+ssh://kvm02/system
[root@kvm01 ~]# virsh list --all
备注:
迁移成功后,在kvm01主机就没有了test01的资源
3:查看kvm02主机上的虚拟机状态
[root@kvm01 ~]# virsh --connect=qemu+ssh://kvm02/system list
Id 名称 状态
----------------------------------------------------
1 test01 running
4:将test01从kvm02主机迁移到kvm01主机
[root@kvm01 ~]# virsh --connect=qemu+ssh://kvm02/system migrate --persistent --undefinesource test01 qemu+ssh://kvm01/system
创建虚拟机资源
1:为配置文件创建共享目录
[root@kvm01 ~]# mkdir /kvmdata/config
2:将test01的配置文件拷贝到共享目录
[root@kvm01 ~]# cp /etc/libvirt/qemu/test01.xml /kvmdata/config/
3:取消定义test01虚拟机
[root@kvm01 ~]# virsh shutdown test01
[root@kvm01 ~]# virsh undefine test01
[root@kvm01 ~]# virsh list --all
4:重新定义test01虚拟机
[root@kvm02 ~]# virsh define /kvmdata/config/test01.xml
[root@kvm01 ~]# virsh start test01
域 test01 已开始
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
6 test01 running
部署群集
1:群集组件的安装(kvm01和kvm02都安装)
设置好阿里的基础源和epel扩展源
[root@kvm01 ~]# yum -y install pcs pacemaker fence-agents-all
备注:
- Pacemaker 是一个集群管理器。它利用OpenAIS 或 heartbeat提供的消息和成员能力,由辅助节点和系统进行故障检测和回收,实现性群集服务(亦称资源)的高可用性。
- Fence agent是集群管理中的一个概念,用于在发生电源故障或其他故障时确保集群的稳定性。
- pcs 是集群管理的一个守护进程,利用pcs提供的工具可以对集群环境进行状态的管理
[root@kvm01 ~]# passwd hacluster
备注:
两台kvm主机的密码要一致(本案例设置的是aptech)
[root@kvm01 ~]# systemctl start pcsd
[root@kvm01 ~]# systemctl enable pcsd
2:认证组成群集的节点(只在kvm01上操作)
[root@kvm01 ~]# pcs cluster auth kvm01 kvm02 -u hacluster -p aptech
3:自动生成配置文件(只在kvm01上操作)
[root@kvm01 ~]# pcs cluster setup --name cluster-kvm kvm01 kvm02
4:启动群集(只在kvm01上操作)
[root@kvm01 ~]# pcs cluster start --all
[root@kvm01 ~]# pcs cluster enable --all
备注:
enable:将群集设置为开机自启
5:在任意一个kvm主机上查看pcs群集状态
[root@kvm01 ~]# pcs status
6:将其中一个节点关闭,查看群集状态
[root@kvm01 ~]# pcs cluster stop kvm01
在另一个节点查看状态
[root@kvm02 ~]# pcs status
Online: [ kvm02 ]
OFFLINE: [ kvm01 ]
7:查看后再开启,让群集正常运行
[root@kvm01 ~]# pcs cluster start kvm01
8:关闭隔离设备的功能(每个设备都执行)
pcs property set stonith-enabled=false
备注:
测试环境用的 VMware的环境,没有隔离设备,必须要关闭,否则无法实现高可用
8:向群集中添加资源
[root@kvm01 ~]# pcs resource create test01 VirtualDomain hypervisor="qemu:///system" config="/kvmdata/config/test01.xml" migration_transport=ssh meta allow-migrate="true"
备注
meta allow-migrate="true" :允许迁移模式
9:查看当前群集状态
[root@kvm01 ~]# pcs status
Cluster name: cluster-kvm
WARNINGS:
No stonith devices and stonith-enabled is not false
Stack: corosync
Current DC: kvm02 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Wed Aug 31 19:55:48 2022
Last change: Wed Aug 31 19:55:43 2022 by root via cibadmin on kvm01
2 nodes configured
1 resource instance configured
Online: [ kvm01 kvm02 ]
Full list of resources:
test01 (ocf::heartbeat:VirtualDomain): Started kvm01
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
KVM群集验证
1:在两台kvm主机上分别查看虚拟机状态
(1)kvm01的状态
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
6 test01 running
(2)kvm02的状态
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
注意:此时虚拟机在kvm01
2:删除资源test01的约束
清除某个 pcs 资源只能在某个主机上运行的限制
[root@kvm01 ~]# pcs resource clear test01
[root@kvm01 ~]# pcs constraint ##查询限制情况,如下显示结果为无限制
Location Constraints:
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:
备注:
如果冒号后没有任何信息,表示没有约束,如果有约束会有警告提示
constraint(限制)
当把虚拟机迁移到了另一台主机,会出现约束,要想将虚拟机迁移回来,需要先清除约束
3:手动迁移
[root@kvm01 ~]# pcs resource move test01
备注:
会自动选择其他节点进行迁移
4:kvm01上查看状态
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
[root@kvm01 ~]# pcs status
Cluster name: cluster-kvm
Stack: corosync
Current DC: kvm01 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Wed Aug 31 21:54:15 2022
Last change: Wed Aug 31 21:52:31 2022 by root via crm_resource on kvm01
2 nodes configured
1 resource instance configured
Online: [ kvm01 kvm02 ]
Full list of resources:
test01 (ocf::heartbeat:VirtualDomain): Started kvm02
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
5:kvm02上查看状态
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 test01 running
备注:
迁移后,test01运行在kvm02上
6:将kvm02挂起,模拟故障
注意:
如果kvm01上对test01有约束,需要在kvm01上清除约束,才能将test01迁移回来
pcs resource clear test01
7:查看kvm01中的状态
[root@kvm01 ~]# pcs status
Cluster name: cluster-kvm
Stack: corosync
Current DC: kvm01 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Wed Aug 31 21:56:26 2022
Last change: Wed Aug 31 21:52:31 2022 by root via crm_resource on kvm01
2 nodes configured
1 resource instance configured
Online: [ kvm01 ]
OFFLINE: [ kvm02 ]
Full list of resources:
test01 (ocf::heartbeat:VirtualDomain): Started kvm01
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
5 test01 running