GlusterFS实现KVM高可用及热迁移

环境概述

本章案例主要使用之前章节所学的 KVM 及 Glusterfs 技术,结合起来从而达到 kvm 高可用和热迁移环境。利用 Glusterfs 的分布式复制卷,对 kvm 虚拟机磁盘镜像文件进行分布存储和冗余功能。

分布式复制卷主要用于需要冗余的情况下把一个文件存放在两个或以上的节点上,当其中一个节点数据丢失或者损坏之后,kvm 仍然能够通过卷组找到另一节点上的虚拟机文件,保证虚拟机正常运行。当节点修复之后,Glusterfs 会自动同步同一组里面有数据的节点数据。

企业业务环境:

  1. 开发环境
  2. 测试环境
  3. 预上线环境
  4. 线上环境

公司由于大规模使用 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
  1. 在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
  1. 在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卷

  1. 在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
  1. 在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

创建测试虚拟机

  1. 在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

选择迁移的目标主机

相关推荐
xu_yule3 小时前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式
難釋懷7 小时前
分布式锁的原子性问题
分布式
ai_xiaogui8 小时前
【开源前瞻】从“咸鱼”到“超级个体”:谈谈 Panelai 分布式子服务器管理系统的设计架构与 UI 演进
服务器·分布式·架构·分布式架构·panelai·开源面板·ai工具开发
凯子坚持 c8 小时前
如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器
分布式
飞升不如收破烂~9 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式
无心水9 小时前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
Lansonli9 小时前
大数据Spark(八十):Action行动算子fold和aggregate使用案例
大数据·分布式·spark
invicinble11 小时前
对于分布式的原子能力
分布式