理论部分:
一、KVM概述
- KVM架构很简单,就是内核的一个模块
- KVM是集成到内核的hypervisorI(虚拟监视器),是X86架构且硬件支持虚拟化技术的linux的全虚拟化解决方案,他是linux 很小的模块,他可以利用linux做任务调度,内存管理与硬件设备交互等工作
- 一个虚拟机就是一个普通的linux 进程,通过这个进程的管理,完成对虚拟化的管理
1. OpenStack中KVM架构
KVM基本架构
- 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和其他虚拟化技术
2.KVM三种模式
① 客户模式
可以理解为客户机在操作系统运行中的模式,客户模式又分为内核模式和用户模式
② 用户模式
为用户提供虚拟机管理的用户空间工具以及代表用户执行I/O,qemu运行在这个模式下
③ 内核模式
主要作用为:虚拟机的调度执行、内存管理、设备管理,实现客户模式的切换、处理从客户模式的退出,KVM内核模块运行在这个模式下
- 以下为三种模式层次关系图
3. KVM工作原理
用户模式的qemu利用libkvm通过ioctl(input/output control 专用于设备输入输出操作的系统调用)进入内核模式,kvm模块为虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模式,加载guest os并执行。
如果Guest OS发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行并保存当前操作,同时退出客户模式来进行异常处理。内核模式处理这些异常时如果不需要I/O 则处理完成后重更新进入客户模式,如果需要I/O 则进入到用户模式,由Qemu来处理I/O,处理完成后进入内核模式,再进入客户模式,以下为工作流程图:
二、GFS 概述
- GFS全称为Google File System,为了满足Google迅速增长的数据处理要求,google设计并且实现了google文件系统(GFS)。Google文件系统是一个可扩展的分布式文件系统,用于大型的,分布式的,对大量数据进行访问的应用
- 它运行于廉价的普通硬件上, 并提供容错功能。 它可以给大量的用户提供总体性能较高的服务。
- Glusterfs 文件系统是由 Gluster 公司的创始人兼首席技术官 Anand Babu Periasamy编写。 一个可扩展的分布式文件系统, 用于大型的、 分布式的、 对大量数据进行访问的应用。
- 它运行于廉价的普通硬件上, 并提供容错功能。 它可以给大量的用户提供总体性能较高的服务。
- Glusterfs 可以根据存储需求快速调配存储, 内含丰富的自动故障转移功能, 且摒弃集中元数据服务器的思想。
- 适用于数据密集型任务的可扩展网络文件系统, 免费开源。
- Gluster于 2011 年 10 月 7 日被 red hat 收购。
1.Glusterfs 特点
1.Glusterfs 体系结构, 将计算、 存储和 I/O 资源聚合到全局名称空间中, 每台服务器都被视为节点, 通过添加附加节点或向每个节点添加额外存储来扩展容量。 通过在更多节点之间部署存储来提高性能。
2.Glusterfs 支持基于文件的镜像和复制、 分条、 负载平衡、 故障转移、 调度、 磁盘缓存、存储配额、 卷快照等。
3.Glusterfs 各客户端之间无连接, 本身依赖于弹性哈希算法, 而不是使用集中式或分布式元数据模型。
4.Glusterfs 通过各种复制选项提供数据可靠性和可用性: 复制卷、 分布卷。
2.GFS 架构
GFS 基本架构详解
- GFS文件系统为分布式结构,主要chunkserver(大块设备)由一个master和众多chunkserver构成的
- GFS特点包括:扩展性和高性能、高可用性、全局统一命名空间、弹性卷管理、基于标准协议
- GFS通过弹性HASH算法地址空的唯一性
- 基本架构如下图:
3. GFS工作流程原理
① 客户端使用固定大小的块将应用程序指定的文件名和字节偏移转换成文件的一个块索引,向master(主)发送包含文件名和块索引的请求
② master收到客户端发来的请求,master向块服务器发出指示,同时时刻监控众多chunkserver的状态。Chunkserver缓存master从客户端收到的文件名和块索引等信息。
③ master通过和chunkserver的交互,向客户端发送chunk-handle和副本位置。其中文件被分成若干个块,而每个块都是由一个不变的,全局唯一的64位的chunk-handle标识。Handle是由master在块创建时分配的。而出于安全性考虑,每一个文件块都要被复制到多个chunkserver上,一般默认3个副本;
④ 客户端向其中的一个副本发出请求,请求指定了chunk handle(chunkserver以chunk handle标识chunk)和块内的一个字节区间。
⑤ 客户端从chunkserver获得块数据,任务完成。
4.GFS架构体系
- 一个GFS群集由一台master服务器(有备份),多台chunk服务器组成,客户端,架构上比较简单
- chunkserver:数据存储节点,文件被分割为固定大小的chunk,每个chunk被唯一标识,默认情况下chunk存储3个副本
- chunk:每个·文件至少存储为一个chunk,每个chunk以普通的Linux文件存储,chunk尺寸大小选择是一个关键的设计参数,默认为64MB,每个chunk有全局64位唯一标识符
- GFS文件系统是可以被多个用户同时访问,一般情况下,Application和chunkserver是可以在同一台机子上,主要的数据流量是通过Application和hunkserver之间,由于数据访问的是本地减少了Application和master之间的交互访问,减少了master的负荷量,提高了master的利用性能
- master中保存着三类元数据(metadata):文件名和块的名称空间、从文件到块的映射、副本位置。所有metadata都放在内存中。操作日志的引入可以更加简单、可靠地更新master的信息
- master作为GFS的控制和神经系统,副本为master的备份,chunk主要用和用户交换数据,网络中的主机瘫痪,不会对整个系统造成大的影响,替换上去的主机会自动重建数据。即使master的瘫痪,也会有shadow作为替补,并且shadow在一定的时候也会充当master来提供控制和数据交换.
5.GFS 卷类型
① 分布式卷
相当于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(大规模并行计算) 应用
实验部分:
实验环境:
node1:192.168.1.10
node2:192.168.1.11
node3:192.168.1.12
node4:192.168.1.13
kvm(兼GFS客户端):192.168.1.61
一、部署GFS分布式存储
实验步骤:
准备环境(以node1为例,其他节点步骤略,请自行配置)
(1)按照表中所示,为node节点添加相应数量和大小的磁盘,并重启系统
(2)为所有节点的新磁盘分区
用fdisk命令为每个磁盘分区
node1-4:
[[email protected] ~]# fdisk /dev/sdb
[[email protected] ~]# fdisk /dev/sdc
[[email protected] ~]# fdisk /dev/sdd
[[email protected] ~]# fdisk /dev/sde
(2)为每个节点的每个磁盘格式化
node1-4:
[[email protected] ~]# mkfs -t ext4 /dev/sdb1
[[email protected] ~]# mkfs -t ext4 /dev/sdc1
[[email protected] ~]# mkfs -t ext4 /dev/sdd1
[[email protected] ~]# mkfs -t ext4 /dev/sde1
(3)创建挂载点
node1-4:
[[email protected] ~]# mkdir /b1
[[email protected] ~]# mkdir /c1
[[email protected] ~]# mkdir /d1
[[email protected] ~]# mkdir /e1
(4)挂载磁盘
node1-4:
[[email protected] ~]# mount /dev/sdb1 /b1
[[email protected] ~]# mount /dev/sdc1 /c1
[[email protected] ~]# mount /dev/sdd1 /d1
[[email protected] ~]# mount /dev/sde1 /e1
(5)修改fstab文件,使挂载永久生效
[[email protected] ~]# vi /etc/fstab
在末尾添加
/dev/sdb1 /b1 ext4 defaults 0 0
/dev/sdc1 /c1 ext4 defaults 0 0
/dev/sdd1 /d1 ext4 defaults 0 0
/dev/sde1 /e1 ext4 defaults 0 0
2:在所有节点上关闭防火墙和selinux
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# setenforce 0
3:在所有节点上修改hosts文件
node1-4:
[[email protected] ~]# vi /etc/hosts
192.168.1.10 node1
192.168.1.11 node2
192.168.1.12 node3
192.168.1.13 node4
192.168.1.61 kvm
4:在所有节点安装软件
(1)配置yum仓库
将GFS所需的rpm仓库的gfsrepo目录拷贝到linux系统的/opt下,并修改仓库文件(暂时注释)
node1-4:
[[email protected] ~]# vi /etc/yum.repos.d/CentOS-Media.repo
#[c7-media]
#name=CentOS-$releasever - Media
#baseurl=file:///media/cdrom/
#gpgcheck=1
#enabled=1
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[gfsrepo]
name=GFS
baseurl=file:///root/GFS
gpgcheck=0
enabled=1
[[email protected] ~]# yum clean all
(2)在所有节点上安装gfs
node1-4:
[[email protected] ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
5:在所有节点上启动GFS
node1-4:
[[email protected] ~]# systemctl start glusterd.service
[[email protected] ~]# systemctl enable glusterd.service
6:添加节点(只在node1节点上)
[[email protected] ~]# gluster peer probe node1
peer probe: success. Probe on localhost not needed
[[email protected] ~]# gluster peer probe node2
peer probe: success.
[[email protected] ~]# gluster peer probe node3
peer probe: success.
[[email protected] ~]# gluster peer probe node4
peer probe: success.
二、kvm(兼GFS客户端)
实验环境:
关机状态设置虚拟机CPU
修改hosts解析文件:
[[email protected] ~]# vi /etc/hosts
192.168.1.10 node1
192.168.1.11 node2
192.168.1.12 node3
192.168.1.13 node4
192.168.1.61 kvm
安装所需软件:
yum -y install groupinstall "desktop" qemu-kvm.x86_64 qemu-kvm-tools.x86_64 qemu-img.x86_64 bridge-utils.x86_64 libvirt virt-manager glusterfs glusterfs-fuse
查看cpu是否支持虚拟化:
cat /proc/cpuinfo | grep vmx
检查kvm模块是否安装:
lsmod | grep kvm
安装完成后还需要开启 libvirtd 服务,以开启相关支持:
systemctl start libvirtd
systemctl enable libvirtd
桥接模式
宿主机:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
添加修改以下内容:
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
#GATEWAY=192.168.10.254
#DNS1=192.168.10.254
#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=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.61
PREFIX=24
IPV6INIT=no
BRIDGE=br0
vim /etc/sysconfig/network-scripts/ifcfg-br0
添加修改以下内容:
TYPE=bridge
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
#GATEWAY=192.168.10.254
#DNS1=192.168.10.254
#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.1.61
PREFIX=24
IPV6INIT=no
重启网卡服务生效:
systemctl restart network
确认IP信息
ifconfig
启动软件
virt-manager
创建挂载目录,并挂载卷
mkdir /kvmdata
mount -t glusterfs node1:models /kvmdata/
查看挂载卷
df -h
创建存储池目录
mkdir /kvmdata/data
mkdir /kvmdata/iso(放系统镜像)
验证:
创建完成后,去四台node节点服务器
ll -h
验证高可用:
挂起或关闭两台中一台存储了虚拟机文件,看看kvm虚拟机还能否正常运行