一:概述
构建一个基于KVM(Kernel-based Virtual Machine)的高可用性(High Availability, HA)环境时,通常会涉及多个组件和技术。其中一个关键部分是选择合适的存储解决方案以确保虚拟机的数据一致性、可靠性和可访问性。GFS2(Global File System 2)是一种集群文件系统,可以用来构建这种高可用环境。
特点
KVM(Kernel-based Virtual Machine)是一种开源的全虚拟化解决方案,而GFS (Global File System) 是一种为集群环境设计的高性能、高可用性的文件系统。将KVM与GFS结合使用,可以构建一个支持高可用性的虚拟化平台。
在构建KVM + GFS分布式存储系统的高可用性架构时,主要的特点包括:
1. **资源共享**:
通过GFS,多个KVM节点可以共享同一个存储池,提高资源利用率和灵活性。
2. **数据一致性**:
GFS确保了即使在多台服务器同时访问同一份数据时也能保持数据的一致性和完整性。
3. **故障恢复**:
当某一台物理主机出现故障时,其他节点可以接管其上的虚拟机,减少服务中断时间。
GFS能够提供数据冗余,即使某个节点或磁盘发生故障,数据仍然可访问。
4. **负载均衡**:
可以通过动态迁移虚拟机来平衡不同物理主机之间的负载。
5. **扩展性**:
随着业务增长,可以通过增加更多的物理主机和存储空间来扩展整个集群的能力。
6. **管理简化**:
使用统一的管理工具可以方便地监控和管理整个集群的状态,包括虚拟机、物理主机和存储源。
7. **成本效益**:
利用开源软件和技术减少了许可费用和其他相关成本。
8. **性能优化**:
GFS的设计考虑到了高性能的需求,尤其是在读写密集型的工作负载中表现良好。
9. **容错机制**:
GFS通常会实现一定的容错机制,如镜像和条带化等技术,以提高数据的安全性和可用性。
10. **灵活的配置选项**:
可以根据需要调整集群的配置参数,以适应不同的工作负载和场景需求。
要实现这样的架构,还需要考虑其他组件和技术,例如集群管理软件(如Pacemaker)、虚拟网络配置(如OVS或Linux Bridge)以及可能的负载均衡器。此外,还需要对KVM和GFS进行适当的配置和调优,以确保它们能够高效协同工作。
二:实验
1:部署GFS高可用分布式存储环境
1:安装部署 KVM 虚拟化平台
2:部署 GlusterFS
(1)关闭防所有节点的防火墙、SELiunx
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
(2)编写 hosts 文件
将所有节点的IP和名称写入/etc/hosts文件中
(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
[root@node1 ~]# 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.
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
2:为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
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:为配置文件创建共享目录
[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