KVM 自Linux 2.6.20版本后就直接整合到Linux 内核中,它依托CPU虚拟化指令(如 Intel-VT 、AMD-V)实现高性能的虚拟化支持。
GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务。
KVM
它是底层的hypervisor,模拟CPU运行,但是缺少了对network和周边I/O的支持,所以不能直接使用
QEMU-KVM
QEMU-KVM是一个完整的模拟器,它是构建基于KVM上的,它提供了完整的网络和I/O支持
libvirt
OpenStack不会直接控制QEMU-KVM,它会用libvirt管理工具来简介控制Qemu-kvm。(libvirt提供了跨VM平台的功能)。
libvirt介绍:是用于管理虚拟化平台的开源API,后台程序和管理工具,它可以用于管理KVM、Xen、VMware ESX、QEMU和其他虚拟化技术
① 客户模式
可以理解为客户机在操作系统运行中的模式,客户模式又分为内核模式和用户模式
② 用户模式
为用户提供虚拟机管理的用户空间工具以及代表用户执行I/O,qemu运行在这个模式下
③ 内核模式
主要作用为:虚拟机的调度执行、内存管理、设备管理,实现客户模式的切换、处理从客户模式的退出,KVM内核模块运行在这个模式下
用户模式的qemu利用libkvm通过ioctl(input/output control 专用于设备输入输出操作的系统调用)进入内核模式,kvm模块为虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模式,加载guest os并执行。
如果Guest OS发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行并保存当前操作,同时退出客户模式来进行异常处理。内核模式处理这些异常时如果不需要I/O 则处理完成后重更新进入客户模式,如果需要I/O 则进入到用户模式,由Qemu来处理I/O,处理完成后进入内核模式,再进入客户模式,以下为工作流程图
GFS文件系统为分布式结构,主要chunkserver(大块设备)由一个master和众多chunkserver构成的
GFS特点包括:扩展性和高性能、高可用性、全局统一命名空间、弹性卷管理、基于标准协议
GFS通过弹性HASH算法地址空的唯一性
工作过程如下:
① 客户端使用固定大小的块将应用程序指定的文件名和字节偏移转换成文件的一个块索引,向master(主)发送包含文件名和块索引的请求
② master收到客户端发来的请求,master向块服务器发出指示,同时时刻监控众多chunkserver的状态。Chunkserver缓存master从客户端收到的文件名和块索引等信息。
③ master通过和chunkserver的交互,向客户端发送chunk-handle和副本位置。其中文件被分成若干个块,而每个块都是由一个不变的,全局唯一的64位的chunk-handle标识。Handle是由master在块创建时分配的。而出于安全性考虑,每一个文件块都要被复制到多个chunkserver上,一般默认3个副本;
④ 客户端向其中的一个副本发出请求,请求指定了chunk handle(chunkserver以chunk handle标识chunk)和块内的一个字节区间。
⑤ 客户端从chunkserver获得块数据,任务完成。
① 分布式卷
相当于windows中的跨区卷,没有对文件进行分块处理,通过扩展文件属性保存Hash值,支持的底层文件系统有ext3、ext4、zfs、xfs
特点
② 条带卷
相当于windows中的带区卷,类似RAID 0,根据偏移量将文件分为N块(N个条带节点),轮询的存储在每个Brick server节点;存储文件越大,读写效率高,但不具备容错性
特点
③ 复制卷
相当于windows中的镜像卷,类似RAID 1,同一文件保存一份活多份副本,复制模式因为要保存副本,因此磁盘利用率较低,多个节点上的存储空间不一致,那么将按照木桶效应取最低值,作为该卷的总容量
特点
④ 分布式条带卷
兼顾分布式卷和条带卷的特点,主要用于大文件访问处理,brick server(块服务器)的数量是条代数(数据块分布的brick数量)的倍数。至少需要4台
⑤ 分布式复制卷
兼顾分布式卷和复制卷的功能,用于需要冗余的情况。brick server数量是镜像数(数据副本数量)的倍数。
⑥ 条带复制卷
类似RAID 10,同时具有条带卷和复制卷的特点
⑦ 分布式条带复制卷
三种基本卷的复合卷,通常用于map reduce(大规模并行计算) 应用
使用六台VMware虚拟机,如下
GFS服务器
① node 1 地址:192.168.226.128 ,添加五块磁盘,大小分别为3G,4G,5G,6G,20G
② node 2 地址:192.168.226.132,添加五块磁盘,大小分别为3G,4G,5G,6G,20G
③ node 3 地址:192.168.226.133,添加3块磁盘,分别为3G,4G,5G,20G
④ node 4 地址:192.168.226.134,添加3块磁盘,分别为3G,4G,5G,20G
KVM服务器
KVM虚拟机部署为GFS客户端 地址:192.168.226.200
实验目的
使用KVM 与GFS结合,达到KVM高可用
使用GFS 分布式复制卷,对KVM虚拟机文件进行分布存储与冗余
把文件存放在两个或以上节点,如果其中一个节点数据丢失或损坏,KVM依旧可以通过卷组找到另一个节点上的文件,保证虚拟机正常运行。当节点恢复时,GFS会自动将正常的节点服务器中的数据同步到另一个修复的节点服务器中
[root@node1 ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x5fae534e 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n '//创建分区'
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p '//创建主分区'
分区号 (1-4,默认 1): '//回车,默认分区号'
起始 扇区 (2048-6291455,默认为 2048): '//回车,默认扇区大小'
将使用默认值 2048
Last 扇区, +扇区 or +size{
K,M,G} (2048-6291455,默认为 6291455): '//回车,默认主分区大小'
将使用默认值 6291455
分区 1 已设置为 Linux 类型,大小设为 3 GiB
[root@node1 ~]# mkfs -t ext4 /dev/sdb1
[root@node1 ~]# mkfs -t ext4 /dev/sdc1
[root@node1 ~]# mkfs -t ext4 /dev/sdd1
[root@node1 ~]# mkfs -t ext4 /dev/sde1
[root@node1 ~]# mkfs -t ext4 /dev/sdf1
#node1和node2
mkdir /c1 /c2 /c3 /c4 /data
#node3和node4
mkdir /c1 /c2 /c3 /data
[root@node1 ~]# vim /etc/fstab
/dev/sdb1 /c1 ext4 defaults 0 0
/dev/sdc1 /c2 ext4 defaults 0 0
/dev/sdd1 /c3 ext4 defaults 0 0
/dev/sde1 /c4 ext4 defaults 0 0
/dev/sdf1 /data ext4 defaults 0 0
#添加磁盘挂载信息
-----》wq
#添加完成后重启
[root@node1 ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 20G 3.5G 17G 18% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 9.1M 903M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 xfs 10G 37M 10G 1% /home
/dev/sdf1 ext4 20G 45M 19G 1% /data
/dev/sdc1 ext4 3.9G 16M 3.7G 1% /c2
/dev/sdb1 ext4 2.9G 9.0M 2.8G 1% /c1
/dev/sde1 ext4 5.8G 24M 5.5G 1% /c4
/dev/sdd1 ext4 4.8G 20M 4.6G 1% /c3
/dev/sda1 xfs 6.0G 174M 5.9G 3% /boot
tmpfs tmpfs 183M 8.0K 183M 1% /run/user/42
tmpfs tmpfs 183M 0 183M 0% /run/user/0
#此处只展示node1
[root@node1 ~]# systemctl stop firewalld.service
[root@node1 ~]# setenforce 0
[root@node1 ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@node1 ~]# vi /etc/selinux/config
#关闭防火墙、增强性安全功能并取消开机自启
[root@node1 ~]# vi /etc/hosts
192.168.226.128 node1
192.168.226.132 node2
192.168.226.133 node3
192.168.226.134 node4
#添加四台node服务器的地址
在所有node节点服务器上执行以下操作
共享上传GFS文件
#软件包已用win10宿主机下载完成,直接共享到虚拟机中
[root@node1 ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:
[root@node1 ~]# cd /mnt
[root@node1 ~]# cp -r gfsrepo /opt
#以下是个小脚本
cd /etc/yum.repos.d/
mkdir backup #备份本地yum源文件
mv Cen* backup #备份本地yum源文件
cat >> node.repo<<-EOF #新建本地yum元文件
[node]
name=node
baseurl=file:///mnt
gpgcheck=0
enabled=1
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo #指向gfs文件
gpgcheck=0
enabled=1
EOF
[root@node1 yum.repos.d]# umount //192.168.226.1/LAMP-C7 /mnt
#解挂主机共享文键
[root@node1 yum.repos.d]# vi /etc/fstab
/dev/cdrom /mnt iso9660 defaults 0 0
#添加自动挂载,重启
[root@node1 ~]# yum clean all
[root@node1 ~]# yum makecache
[root@node1 ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
[root@node1 ~]# systemctl start glusterd.service
[root@node1 ~]# systemctl enable glusterd.service
#开启gluster服务并设置开机自启动
创建GFS集群
node主机添加集群中其他节点(在所有节点上做)
#仅在node 1上示范
[root@node1 opt]# gluster peer probe node1
peer probe: success. Probe on localhost not needed
[root@node1 opt]# gluster peer probe node2
peer probe: success.
[root@node1 opt]# gluster peer probe node3
peer probe: success.
[root@node1 opt]# gluster peer probe node4
peer probe: success.
[root@node1 opt]# gluster peer status
Number of Peers: 3
Hostname: node2
Uuid: bc3002b2-fc8f-433f-ae63-bedf43a28ebe
State: Peer in Cluster (Connected)
Hostname: node3
Uuid: 80feafe1-7b28-4f57-8ae5-bac5825491cb
State: Peer in Cluster (Connected)
Hostname: node4
Uuid: 79b7b921-0b84-4397-8d99-2d1337919d6a
State: Peer in Cluster (Connected)
#创建分布式卷
[root@node1 opt]# gluster volume create dis-volume node1:/c4 node2:/c4 force
volume create: dis-volume: success: please start the volume to access data
#查看创建分布式卷的信息
[root@node1 opt]# gluster volume info dis-volume
Volume Name: dis-volume #卷名
Type: Distribute #类型分布式
Volume ID: cd9b10dd-7261-4bc7-89b2-8a844c64c133 #卷ID
Status: Created #状态:已创建
Snapshot Count: 0 #快照数量
Number of Bricks: 2 #块服务2个
Transport-type: tcp #通讯协议:TCP
Bricks: #块信息
Brick1: node1:/c4
Brick2: node2:/c4
Options Reconfigured: #重新配置的选项
transport.address-family: inet
nfs.disable: on
#启动分布式卷
[root@node1 opt]# gluster volume start dis-volume
volume start: dis-volume: success
[root@node1 opt]# gluster volume create stripe-volume stripe 2 node1:/c3 node2:/c3 force
[root@node1 opt]# gluster volume info stripe-volume
Volume Name: stripe-volume
Type: Stripe
Volume ID: 3d5f0312-f50d-4d70-8fb4-55c14f999cb9
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1:/c3
Brick2: node2:/c3
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@node1 opt]# gluster volume start stripe-volume
volume start: stripe-volume: success
[root@node1 opt]# gluster volume create rep-volume replica 2 node3:/c3 node4:/c3 force
[root@node1 opt]# gluster volume info rep-volume
Volume Name: rep-volume
Type: Replicate
Volume ID: 8ba188be-36c8-40b3-9e96-47b0bd745eee
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node3:/c3
Brick2: node4:/c3
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
[root@node1 opt]# gluster volume start rep-volume
volume start: rep-volume: success
[root@node1 opt]# gluster volume create dis-stripe stripe 2 node1:/c1 node2:/c1 node3:/c1 node4:/c1 force
[root@node1 opt]# gluster volume info dis-stripe
Volume Name: dis-stripe
Type: Distributed-Stripe
Volume ID: bf94313e-0f38-4954-bb64-cc1d8a11f962
Status: Created
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/c1
Brick2: node2:/c1
Brick3: node3:/c1
Brick4: node4:/c1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
[root@node1 opt]# gluster volume start dis-stripe
volume start: dis-stripe: success
[root@node1 opt]# gluster volume create dis-rep replica 2 node1:/c2 node2:/c2 node3:/c2 node4:/c2 force
[root@node1 opt]# gluster volume info dis-rep
Volume Name: dis-rep
Type: Distributed-Replicate
Volume ID: b107d425-8216-46f0-9aa1-1f2921e9544e
Status: Created
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/c2
Brick2: node2:/c2
Brick3: node3:/c2
Brick4: node4:/c2
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
[root@node1 opt]# gluster volume start dis-rep
volume start: dis-rep: success
[root@node1 opt]# gluster volume create kvmdata replica 2 node1:/data node2:/data node3:/data node4:/data force
[root@node1 opt]# gluster volume info kvmdata
Volume Name: kvmdata
Type: Distributed-Replicate
Volume ID: 5b25f84b-37bc-4649-b755-d1765a573844
Status: Created
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data
Brick2: node2:/data
Brick3: node3:/data
Brick4: node4:/data
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
[root@node1 opt]# gluster volume start kvmdata
volume start: kvmdata: success
[root@localhost ~]# hostnamectl set-hostname kvm
[root@localhost ~]# su
[root@kvm ~]#
[root@kvm ~]# vi /etc/fstab
/dev/cdrom /mnt iso9660 defaults 0 0
#添加以上信息
#reboot重启或者使用mount -a 刷新
[root@kvm ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda3 xfs 50G 4.2G 46G 9% /
devtmpfs devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 14M 3.8G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda5 xfs 242G 37M 241G 1% /home
/dev/sda1 xfs 1014M 165M 850M 17% /boot
/dev/sr0 iso9660 4.2G 4.2G 0 100% /mnt
tmpfs tmpfs 781M 4.0K 781M 1% /run/user/42
tmpfs tmpfs 781M 60K 781M 1% /run/user/0
#优化ssh
[root@kvm ~]# vim /etc/ssh/sshd_config
#取消注释,将yes改为no
UseDNS no
----->wq
#优化防火墙
[root@kvm ~]# systemctl stop firewalld.service
[root@kvm ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@kvm ~]# setenforce 0
#设置开启不自启动
[root@kvm ~]# vim /etc/selinux/config
#修改为disabled
SELINUX=disabled
搭建本地yum仓库
将gfsrepo文件上传到KVM虚拟机中
[root@kvm ~]# cd /etc/yum.repos.d
[root@kvm yum.repos.d]# mkdir backup
[root@kvm yum.repos.d]# ls
backup CentOS-Debuginfo.repo CentOS-Sources.repo
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-Media.repo
[root@kvm yum.repos.d]# mv CentOS-* backup/
[root@kvm yum.repos.d]# vim kvm.repo
#输入以下内容
[kvm]
name=kvm
baseurl=file:///mnt
enabled=1
gpgcheck=0
[GFS]
name=gfs
baseurl=file:///opt
enabled=1
gpgcheck=0
-------》wq
#清空yum仓库
[root@kvm yum.repos.d]# yum clean all
BDB2053 Freeing read locks for locker 0xc5d: 13332/140295317485376
BDB2053 Freeing read locks for locker 0xc5f: 13332/140295317485376
已加载插件:fastestmirror, langpacks
正在清理软件源: kvm
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
#创建yum元数据
[root@kvm yum.repos.d]# yum makecache
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
kvm | 3.6 kB 00:00
(1/4): kvm/group_gz | 166 kB 00:00
(2/4): kvm/filelists_db | 3.1 MB 00:01
(3/4): kvm/primary_db | 3.1 MB 00:00
(4/4): kvm/other_db | 1.3 MB 00:00
元数据缓存已建立
[root@kvm yum.repos.d]# yum -y install glusterfs glusterfs-fuse
#安装GFS工具
[root@kvm yum.repos.d]# vim /etc/hosts
192.168.226.128 node1
192.168.226.132 node2
192.168.226.133 node3
192.168.226.134 node4
[root@node2 ~]# mkdir /kvmdata
[root@node2 ~]# vim /etc/fstab
#添加以下内容
node1:kvmdata /kvmdata glusterfs defaults,_netdev 0 0
[root@kvm yum.repos.d]# reboot
[root@kvm yum.repos.d]# df -hT
node1:kvmdata fuse.glusterfs 40G 489M 38G 2% /kvmdata
#安装 GNOME 桌面环境
yum groupinstall -y "GNOME Desktop"
#安装KVM 模块
yum -y install qemu-kvm
#安装KVM 调试工具(可选)
yum -y install qemu-kvm-tools
#安装构建虚拟机的命令行工具
yum -y install virt-install
#qemu 组件,创建磁盘、 启动虚拟机等
yum -y install qemu-img
#安装网络支持工具
yum -y install bridge-utils
#安装虚拟机管理工具
yum -y install libvirt
#安装图形界面管理虚拟机
yum -y install virt-manager
#安装完成后将系统默认运行的target更改为graphical.target
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
#全部安装完成后重启
reboot
#查看CPU是否支持虚拟化
[root@kvm ~]# cat /proc/cpuinfo | grep vmx
......省略部分内容
#查看KVM模块是否安装
[root@kvm ~]# lsmod | grep kvm
kvm_intel 174841 0
kvm 578518 1 kvm_intel
irqbypass 13503 1 kvm
[root@kvm ~]# systemctl start libvirtd
[root@kvm ~]# systemctl enable libvirtd
KVM安装完成后,要配置网络,在libvirtd中运行KVM网络的方法有两种 :NAT 、Bridge
两种模式概述
用户模式:即NAT ,这种方式是默认网络,数据包由NAT方式通过主机的接口进行传送,可以访问外部网络,但无法从外部访问虚拟机网络
桥接模式:这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持(一般有线网卡都支持)
我们本次实验以Bridge 为例
[root@kvm ~]# cd /etc/sysconfig/network-scripts/
[root@kvm network-scripts]# vi ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none" #将dhcp修改为none
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="ens33"
UUID="80da0b5f-1ff2-44df-99ea-89dcfa2452e3"
DEVICE="ens33"
ONBOOT="yes"
BRIDGE=br0 #添加bridge桥接模式
-----》wq
[root@kvm network-scripts]# vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.226.200
NETMASK=255.255.255.0
GATEWAY=192.168.226.1
#添加桥接网卡配置
[root@kvm network-scripts]# systemctl restart network
#创建KVM存储和镜像数据的目录、上传centos7镜像
[root@kvm network-scripts]# mkdir -p /data_kvm/iso
[root@kvm network-scripts]# mkdir -p /data_kvm/store
[root@kvm /]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:
[root@kvm /]# cp /mnt/CentOS-7-x86_64-DVD-1804.iso /data_kvm/iso/
[root@kvm mnt]# cd /data_kvm/iso/
[root@kvm iso]# ls
CentOS-7-x86_64-DVD-1804.iso
#创建镜像、存储文件目录
[root@kvm ~]# mkdir /kvmdata
[root@kvm ~]# cd /kvmdata
[root@kvm ~]# mkdir store iso
#将镜像复制一份到/kvmdata/iso中
[root@kvm ~]# cd /data_kvm/iso
[root@kvm iso]# cp CentOS-7-x86_64-DVD-1810.iso /kvmdata/iso/
[root@kvm ~]# virt-manager
本次实验步骤不复杂,一些相同的操作可以使用shell脚本来编写执行,需要注意的问题:
1、在加入GFS节点时:gluster peer probe node 命令,如果出现以下问题
gluster peer probe node 错误 传输端点尚未连接
可以通过检查以下三点来解决
① 确认防火墙是否关闭
② 检查hosts映射是否添加,添加有无错误
③ 网络是否正常
2、在上传centos7镜像时,如果使用的时远程连接软件,有可能会出现镜像上传不完整,导致最后的虚拟机安装读取错误,或无法正常安装。
可以通过win10共享文件提供出来,然后挂载共享、获取到镜像文件