云计算概述:
云计算不是一个新的技术,它是通过虚拟化技术,将物理硬件资源虚拟化成为多个能独立运行且相同的,能为多个虚拟机提供服务。最开始云计算由亚马逊提出,并完成了云计算的初步架构,但是,亚马逊云是私有的,未公布其代码与实现原理。而后来开源社区Openstack的由来,是一开始由NASA和Rackspace公司联合完成,起初只有两个模块,一个是Nova(计算),一个是Swift(存储)。后来随着更多的公司与优秀的工程师的加入,逐渐发展与壮大,现在Openstack是全球最大的社区。(Openstack是一个操作系统,是一个大规模云操作系统)Openstack每6个月更新一次版本,以26个字母为序列,现在已更新到Q版,每一个版本都会增加很多服务,或删除。
云计算的特性:无处不在的网络服务;按需使用的弹性服务;自助服务等。
在了解云计算之前,首先明白传统的PC架构:
可以看到,在传统的PC架构中,硬件层之上,就是操作系统,由操作系统提供一个接口将物理资源分配给运行在OS之上的APP来使用,也就是说OS独占了这个物理硬件资源的使用或管理。
虚拟化架构:
如图所示,虚拟化架构可以很明确的看到,不是操作系统直接使用物理硬件,而是加入了一层新的VMM层( Virtual Machine Manager,虚拟机监控器),由VMM来管理分配硬件资源,并管理VM(虚拟机)。此时可以看到,OS并不是直接运行在硬件层上而是运行在通过VMM虚拟出来的“物理硬件”(VM)之上,我们称这样的OS为GuestOS。但是这导致了一个问题,要想知到是什么问题,还要了解一点:X86架构指令集。
X86架构的级别:分为了Ring0/1/2/3级别。
Ring0:内核态,是权限最高,通常都是操作系统运行在这里。(特权指令)
Ring1/2:在X86架构下很少使用。
Ring3:用户态,APP通常是运行在这里。(非特权指令)
在未虚拟化之前,OS是运行在内核态的。因为此时只有一个用户在使用这些物理资源,OS可以对物理资源做任何的修改。但是,通过VMM实现硬件的虚拟化之后,形成多个VM,OS运行在VM上。因为多个VM共享一个物理硬件,如果,一个VM更改了物理硬件,必然会影响到其他的VM,(比如,更改了物理网卡的信息或关机等)这是不能被允许的。
OS运行在内核态,发出的都是特权指令(关机,修改配置信息等),用户APP运行在Ring3级别下,发出的都是非特权指令。为了解决VM的GuestOS,发出特权指令影响其他的VM,所以需要VMM来对VM的GuestOS下发的特权指令,进行“特权解除—陷入模拟”。
“特权解除—陷入模拟”:是指,运行在VM上的GuestOS不知道自己的级别已从Ring0改为Ring3,GuestOS是无感知的,GuestOS会以为自己仍然处在Ring0级别下,继续下发特权指令。VMM会截获GuestOS下发的特权指令,进行处理之后(将一些影响到其他VM的特权指令处理成为不影响其他VM的指令),再转发给物理硬件,并且VMM会模拟出此特权指令的“结果”返回给GuestOS。
但是,VMM只能拦截在Ring0级别下的特权指令,在X86设计之初未曾考虑过虚拟化的问题,有一些非特权指令也会有特权指令的效果,VMM不能拦截非特权指令,APP可以直接发送非特权指令到物理硬件。特权指令和非特权指令也有特权指令的效果(19条运行在非特权级别下的特权指令),我们称为“敏感指令”。特权指令一定是敏感指令,但敏感指令不一定是特权指令。
为了解决敏感指令的问题,VMM有三种解决方案:1.半虚拟化,2.全虚拟化,3.硬件辅助虚拟化。
半虚拟化:在内核中将19条敏感指令改为不敏感。(需要更改内核只能用于Linux)
全虚拟化:将无论是否是特权指令还是非特权指令都拦截,进行处理,对VMM资源消耗过大。
硬件辅助虚拟化:支持硬件辅助虚拟化的硬件,硬件可以筛选出来19条敏感指令,将19条敏感指令返回给VMM,由VMM处理之后,在返回给硬件。效率高,占用主机资源小。
在XEN架构下可以用这三种解决方案,而在KVM下只用全虚拟化,所以不存在19条敏感指令的问题。
虚拟化技术:
通过虚拟化技术,将底层物理硬件虚拟化为资源池,提供给上层的每个VM使用。
虚拟化的特性:1.分区,2.隔离,3.封装,4.与硬件解耦。
虚拟化的类型:
1.寄居虚拟化,在宿主操作系统之上。简单,易实现,占用了宿主操作系统的资源,开销较大,在虚拟化层之上可以装任意的OS(VMware)
2.裸金属虚拟化,直接在硬件层之上装虚拟化层,开发难度较大,但是性能较好。(XEN)
3.操作系统虚拟化,在硬件层之上装入宿主操作系统(Linux),在宿主操作系统之上,装“容器”,在装容器时需要用到一个LXC的组件,而这个组件只有Linux有。容器里面的库,必须和Linux一样。(Docker)
4.混合虚拟化,在硬件层之上装宿主操作系统(Linux),在Linux操作系统中有一个虚拟化模块(KVM.KO),用于给VM提供服务。VM在宿主操作系统之上。
如图:
XEN架构与KVM架构的区别:
1.KVM架构是混合虚拟化类型,XEN是裸金属虚拟化类型。
XEN架构:在XEN架构中,有一台运行在特权级别下的虚拟机(不是一台真正的VM),它有两个模块,后端驱动模块用于和Domain U相连,设备驱动用于和硬件相连,用户VM通过前端驱动与Domain0的后端驱动将IO流发给Domain0。再由Domain0的设备驱动完成对硬件的访问。由Domain0实现虚拟化。
缺点:IO路径过长。
KVM架构:在硬件层之上,装Linux操作系统,Linux操作系统有一个KVM.KO虚拟化模块。因为VM在Linux上只是一个文件的方式存在(进程),VM下发的指令没办法直接被Linux识别,所以需要用到QEMU(模拟仿真软件)用于和Linux进行通信。QEMU在VM和Linux中都装有。
缺点:不安全,没有VM控制台。
XEN与KVM的IO环:XEN的IO环:
XEN架构下的IO环:首先如果VM1想要发送“hello”给VM2,那么首先,VM1会通过事件通道先去找到Domain0,对Domain0说“我要在内存共享区域的某一个地址写入‘hello’,是给VM2的”,在Domain0允许后,VM1才能写入,之后Domain0会通过IO环通知VM2,在内存共享区域的某个位置有你的数据,然后VM2在去取出数据。
KVM的IO环:
在KVM的IO环中,没有Domain0,此共享区域变成了真正的共享区域,由VM1直接写入“hello”,再由VM2直接读出即可。
KVM和XEN对于应用层来说都是“重”量级虚拟化。
未来虚拟化的主流—Docker。Docker是轻量级虚拟化。
Docker
Docker自身包里面有运行的程序包和环境变量,再利用硬件之上安装Linux,在Linux中有一个LXC模块,这个模块提供了”Runtime“(运行环境),就可以让Docker程序提供服务。
QOS:
计算:CPU,内存,IO
存储:IOPS,BPS
网络:平均带宽和峰值带宽,突发大小。
虚拟磁盘配置模式:
普通
普通延迟置零
精简
HA:
VM或主机故障,VRM判断VM是否有HA属性,如果有则在根据保存的VM信息,选择可用的CNA启动VM。CNA受到请求后根据之前的信息创建一台配置一样的VM,之后将VM之前的卷信息挂在过来(经过主机挂载过来)。
快照:
全拷贝快照
差分:ROW(FS),COW(生产存储为虚拟化存储)
快照还原ROW直接将快照空间删除即可,而COW则将快照空间写回原卷。