环境概述
本章案例主要使用之前章节所学的 KVM 及 Glusterfs 技术,结合起来从而达到 kvm 高可用和热迁移环境。利用 Glusterfs 的分布式复制卷,对 kvm 虚拟机磁盘镜像文件进行分布存储和冗余功能。
分布式复制卷主要用于需要冗余的情况下把一个文件存放在两个或以上的节点上,当其中一个节点数据丢失或者损坏之后,kvm 仍然能够通过卷组找到另一节点上的虚拟机文件,保证虚拟机正常运行。当节点修复之后,Glusterfs 会自动同步同一组里面有数据的节点数据。
企业业务环境:
- 开发环境
- 测试环境
- 预上线环境
- 线上环境
公司由于大规模使用 KVM 虚拟机来运行业务,为了保证公司虚拟机能够安全稳定运行, 决定采用 KVM+Glusterfs 模式,来保证虚拟机存储的分布部署以及分布冗余。避免当虚拟机文件损坏,或者丢失。从而在损坏或就丢失时有实时备份,保证业务正常运行。
1.Glusterfs 简介
Glusterfs 文件系统是由 Gluster 公司的创始人兼首席技术官 Anand Babu Periasamy 编写。一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。
它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服 务。Glusterfs 可以根据存储需求快速调配存储,内含丰富的自动故障转移功能,且摒弃集
中元数据服务器的思想。适用于数据密集型任务的可扩展网络文件系统,免费开源。Gluster
于 2011 年 10 月 7 日被 redhat 收购。
2.Glusterfs 特点
- Glusterfs 体系结构,将计算、存储和 I/O 资源聚合到全局名称空间中,每台服务器都被视为节点,通过添加附加节点或向每个节点添加额外存储来扩展容量。通过在更多节 点之间部署存储来提高性能。
- Glusterfs 支持基于文件的镜像和复制、分条、负载平衡、故障转移、调度、磁盘缓存、存储配额、卷快照等。
- Glusterfs 各客户端之间无连接,本身依赖于弹性哈希算法,而不是使用集中式或分布式元数据模型。
- Glusterfs 通过各种复制选项提供数据可靠性和可用性:复制卷、分布卷。
实验环境
实验环境
|----------------------------|------------------------------------|----------------------|--------------|
| 操作系统 | 主机名/ IP 地址 | 软件 | 备注 |
| CentOS 7.5 | KVM01/192.168.200.111 | KVM/glusterfs-client | 虚拟化主机(2C 4G) |
| CentOS 7.5 | KVM02/192.168.200.112 | KVM/glusterfs-client | 虚拟化主机(2C 4G) |
| CentOS 7.5 | node1/192.168.200.113 | glusterfs3 | 存储主机(加硬盘20G) |
| CentOS 7.5 | node2/192.168.200.114 | glusterfs3 | 存储主机(加硬盘20G) |
| CentOS 7.5 | node3/192.168.200.115 | glusterfs3 | 存储主机(加硬盘20G) |
| CentOS 7.5 | node4/192.168.200.116 | glusterfs3 | 存储主机(加硬盘20G) |

部署KVM虚拟化
1、在192.168.200.111上配置虚拟化环境
#安装前调试
bash
[root@KVM01 ~]# hostname KVM01
[root@KVM01 ~]# bash
[root@KVM01 ~]# cat << END >> /etc/hosts
192.168.200.111 KVM01
192.168.200.112 KVM02
192.168.200.113 node1
192.168.200.114 node2
192.168.200.115 node3
192.168.200.116 node4
END
[root@KVM01 ~]# iptables -F
[root@KVM01 ~]# setenforce 0
[root@KVM01 ~]# systemctl stop firewalld.service
[root@KVM01 ~]# cat /proc/cpuinfo | grep vmx
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec ibpb ibrs stibp arat spec_ctrl intel_stibp arch_capabilities
#配置IP
bash
[root@KVM01 ~]# cd /etc/sysconfig/network-scripts/
[root@KVM01 network-scripts]# cp ifcfg-ens32 ifcfg-br0
[root@KVM01 network-scripts]# vim ifcfg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.200.111
PREFIX=24
GATEWAY=192.168.1.2
DNS1=202.106.0.20
[root@KVM01 network-scripts]# vim ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens32
UUID=ae72f9ac-088f-40e3-91a6-5c82539cd192
DEVICE=ens32
ONBOOT=yes
IPV6_PRIVACY=no
BRIDGE=br0
[root@KVM01 network-scripts]# systemctl restart network
[root@KVM01 network-scripts]# cd
[root@KVM01 ~]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.111 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::20c:29ff:feb6:933c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b6:93:3c txqueuelen 1000 (Ethernet)
RX packets 75 bytes 5064 (4.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 67 bytes 9902 (9.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#安装KVM需要的软件
bash
[root@KVM01 ~]# yum -y install qemu-kvm qemu-kvm-tools virt-install qemu-img bridge-utils libvirt virt-manager
[root@KVM01 ~]# lsmod |grep kvm
kvm_intel 174841 0
kvm 578518 1 kvm_intel
irqbypass 13503 1 kvm
#开启服务
bash
[root@KVM01 ~]# systemctl start libvirtd
[root@KVM01 ~]# systemctl enable libvirtd
2、在192.168.200.112上配置虚拟化环境
#安装前调试
bash
[root@KVM02 ~]# hostname KVM02
[root@KVM02 ~]# bash
[root@KVM01 ~]# cat << END >> /etc/hosts
192.168.200.111 KVM01
192.168.200.112 KVM02
192.168.200.113 node1
192.168.200.114 node2
192.168.200.115 node3
192.168.200.116 node4
END
[root@KVM01 ~]# iptables -F
[root@KVM01 ~]# setenforce 0
[root@KVM01 ~]# systemctl stop firewalld.service
[root@KVM02 ~]# cat /proc/cpuinfo | grep vmx
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec ibpb ibrs stibp arat spec_ctrl intel_stibp arch_capabilities
#配置IP
bash
[root@KVM02 kvmdata]# cd /etc/sysconfig/network-scripts/
[root@KVM02 network-scripts]# cp ifcfg-ens32 ifcfg-br0
[root@KVM02 network-scripts]# vim ifcfg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.200.112
PREFIX=24
GATEWAY=192.168.1.2
DNS1=202.106.0.20
[root@KVM02 network-scripts]# vim ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
UUID="8e3c32c2-a1b3-48ce-918e-e91a7e96af8a"
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPV6_PRIVACY=no
BRIDGE=br0
[root@KVM02 network-scripts]# systemctl restart network
[root@KVM02 network-scripts]# cd
[root@KVM02 ~]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.112 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::20c:29ff:fe8c:f2d9 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:8c:f2:d9 txqueuelen 1000 (Ethernet)
RX packets 32 bytes 2194 (2.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 43 bytes 5591 (5.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#安装KVM需要的软件
bash
[root@KVM02 ~]# yum -y install qemu-kvm qemu-kvm-tools virt-install qemu-img bridge-utils libvirt virt-manager
[root@KVM02 ~]# lsmod |grep kvm
kvm_intel 174841 0
kvm 578518 1 kvm_intel
irqbypass 13503 1 kvm
#开启服务
bash
[root@KVM02 ~]# systemctl start libvirtd
[root@KVM02 ~]# systemctl enable libvirtd
部署GlusterFS 集群
在192.168.200.113上配置GlusterFs
bash
[root@localhost ~]# vim gfsconf.sh
#!/bin/bash
for i in $(fdisk -l | grep -wo "/dev/sd[b-z]" | sort)
do
dd if=/dev/zero of=$i bs=1024 count=1024
fdisk $i << EOF
n
p
w
EOF
partprobe $i
mkfs.ext4 ${i}1
done
mkdir /b2
fdisk -l |grep -w "/dev/sd[b-z]" |sed -r 's/.*(\/d.{8}).*/\1/g' |sed -r 's/(.*)(.):(.*)/mount \1\21 \/\2\3/' | bash
fdisk -l | grep -w "/dev/sd[b-z]" | sed -r 's/.*(\/d.{8}).*/\1/g' | sed -r 's/(.*)(.):(.*)/\1\21 \/\2\3 ext4 default 0 0/' >> /etc/fstab
iptables -F
systemctl stop firewalld
setenforce 0
cat << EOF >> /etc/hosts
192.168.200.113 node1
192.168.200.114 node2
192.168.200.115 node3
192.168.200.116 node4
192.168.200.111 KVM01
192.168.200.112 KVM02
EOF
cat <<END >/etc/yum.repos.d/repo.repo
[repo]
name=repo
baseurl = https://mirrors.tuna.tsinghua.edu.cn/centos/7/storage/x86_64/gluster-6/
enabled=1
gpgcheck=0
END
yum clean all && yum makecache fast
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
systemctl start glusterd
systemctl enable glusterd
read -p "请输入主机名: " hn
hostname $hn
bash
[root@localhost ~]# sh gfsconf.sh
请输入主机名: node1
[root@node1 ~]# scp gfsconf.sh 192.168.200.114:/root
[root@node1 ~]# scp gfsconf.sh 192.168.200.115:/root
[root@node1 ~]# scp gfsconf.sh 192.168.200.116:/root
在192.168.200.114上配置
bash
[root@localhost ~]# sh gfsconf.sh
请输入主机名: node2
[root@node2 ~]# ll /b2/
总用量 16
drwx------. 2 root root 16384 4月 25 14:02 lost+found
- 在192.168.200.115上配置
bash
[root@localhost ~]# sh gfsconf.sh
请输入主机名: node3
[root@node3 ~]# ll /b2
drwx------. 2 root root 16K 4月 25 14:03 lost+found
- 在192.168.200.116上配置
bash
[root@localhost ~]# sh gfsconf.sh
请输入主机名: node4
[root@node4 ~]# ll /b2
drwx------. 2 root root 16K 4月 25 14:03 lost+found
#在node1 上添加所有节点
bash
[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.
#查看集群状态
bash
[root@node1 ~]# gluster peer status
Number of Peers: 3
Hostname: node2
Uuid: 32b72c9e-cf33-4b1c-93e0-686c42b8cec8
State: Peer in Cluster (Connected)
Hostname: node3
Uuid: d7b81378-3933-46ff-b3ba-e6eace207f1d
State: Peer in Cluster (Connected)
Hostname: node4
Uuid: b2e7c936-cff4-4de1-9edd-5a345ec9906d
State: Peer in Cluster (Connected)
#创建分布式复制卷
bash
[root@node1 ~]# ll /b2/
总用量 16
drwx------. 2 root root 16384 4月 25 13:57 lost+found
[root@node1 ~]# gluster volume create models replica 2 node1:/b2 node2:/b2 node3:/b2 node4:/b2 force
volume create: models: success: please start the volume to access data
#开启并查看models 卷
bash
[root@node1 ~]# gluster volume start models
volume start: models: success
[root@node1 ~]# gluster volume info models
Volume Name: models
Type: Distributed-Replicate
Volume ID: 8233e02b-bab9-474c-b74d-015ced5343c0
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/b2
Brick2: node2:/b2
Brick3: node3:/b2
Brick4: node4:/b2
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
当前一共有四个节点,设置为 2x2=4,就是 2 个节点为一组,一组两个节点会有相同的
数据。从而达到虚拟机数据分布式存储并有冗余备份。
客户端挂载GlusterFS卷
- 在192.168.200.111上配置
#安装glusterfs 客户端软件
bash
cat <<END >/etc/yum.repos.d/repo.repo
[repo]
name=repo
baseurl = https://mirrors.tuna.tsinghua.edu.cn/centos/7/storage/x86_64/gluster-6/
enabled=1
gpgcheck=0
END
[root@KVM01 ~]# yum -y install glusterfs glusterfs-fuse
#创建挂载目录,并挂载卷
bash
[root@KVM01 ~]# mkdir /kvmdata
[root@KVM01 ~]# mount -t glusterfs node1:models /kvmdata/
[root@KVM01 ~]# ls /kvmdata/
lost+found
[root@KVM01 ~]# df -Th /kvmdata/
文件系统 类型 容量 已用 可用 已用% 挂载点
node1:models fuse.glusterfs 40G 89M 38G 1% /kvmdata
- 在192.168.200.112上配置
#安装glusterfs 客户端软件
bash
cat <<END >/etc/yum.repos.d/repo.repo
[repo]
name=repo
baseurl = https://mirrors.tuna.tsinghua.edu.cn/centos/7/storage/x86_64/gluster-6/
enabled=1
gpgcheck=0
END
[root@KVM02 ~]# yum -y install glusterfs glusterfs-fuse
#创建挂载目录,并挂载卷
bash
[root@KVM02 ~]# mkdir /kvmdata
[root@KVM02 ~]# mount -t glusterfs node1:models /kvmdata/
[root@KVM02 ~]# ls /kvmdata/
lost+found
[root@KVM02 ~]# df -Th /kvmdata/
文件系统 类型 容量 已用 可用 已用% 挂载点
node1:models fuse.glusterfs 40G 89M 38G 1% /kvmdata
创建测试虚拟机
- 在192.168.200.111上配置
#新建虚拟机,添加存储池。
[root@KVM01 ~]# virt-manager


1.1、创建镜像存储池(ISO->放系统安装镜像)


1.2、创建文件系统存储池(data->放虚拟机磁盘镜像)



1.3、添加卷

1.4、上传镜像文件
bash
[root@KVM01 ~]# ls -l /kvmdata/ISO/
总用量 4365312
-rw-r--r-- 1 qemu qemu 4470079488 5月 15 09:32 CentOS-7-x86_64-DVD-1804.iso

1.5、新建虚拟机








1.6、正常安装centos7系统
2、在192.168.200.112上配置
#新建虚拟机,添加存储池。
[root@KVM01 ~]# virt-manager


2.1、创建两个存储池,和192.168.200.111上一样

2.2、查看四台GlusterFS服务器的分布情况
bash
[root@node1 ~]# ll /b2/data/
总用量 0
[root@node2 ~]# ll /b2/data/
总用量 0
[root@node3 ~]# ll /b2/data/
总用量 10485768
-rw-------. 2 qemu qemu 10737418240 4月 26 16:22 centos7.0
[root@node4 ~]# ll /b2/data/
总用量 10485768
-rw-------. 2 qemu qemu 10737418240 4月 26 16:22 centos7.0
3、添加连接
bash
[root@KVM01 ~]# yum -y install openssh-askpass.x86_64
[root@KVM02 ~]# yum -y install openssh-askpass.x86_64





4、实现主机转移
bash
[root@KVM01 ~]# virsh shutdown centos7.0
域 centos7.0 被关闭
[root@KVM01 ~]# virsh edit centos7.0
33 <driver name='qemu' type='raw' cache='none'/>
编辑了域 centos7.0 XML 配置。
[root@KVM01 ~]# virsh start centos7.0
域 centos7.0 已开始
[root@KVM01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
3 centos7.0 running

选择迁移的目标主机







