1、走进云计算
云计算:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源可以被快速提供,只需投入不多的管理工做,或与服务供应商进行不多的交互。python
1.1 云计算的特色和优点linux
1)云计算是一种使用模式ios
2)云计算必须经过网络访问web
3)弹性计算,按需付费算法
1.2 在云计算以前的模式或技术
1)IDC托管docker
2)IDC租用数据库
3)虚拟主机(卖空间的)express
4)v1p1s:虚拟专有主机,openvz超卖很坑人的,xen不支持超卖vim
1.3 相对于云计算,传统数据中心面临的问题
1)资源利用率低(大部分机器cpu所占比率低于15%)windows
2)资源分配不合理
举例:因为某个活动,上线各类服务器,可是并未达到实际效果,致使服务器资源浪费
3)很难实现真正的运维自动化
1.4图解云计算的三层服务
基础设施:计算,存储,网络服务
平台服务:对象存储,身份认证,运行环境,消息队列,数据库服务
应用平台:监控,内容,合做,通讯,财务
2、云计算与虚拟化
2.1 公有云、私有云和混合云
公有云(Public Cloud)
一般指第三方提供商为用户提供的可以使用的云,公有云通常可经过 Internet 使用,多是免费或成本低廉的,公有云的核心属性是共享资源服务。这种云有许多实例,可在当今整个开放的公有网络中提供服务。例如:aws,阿里云,青云,百度云,腾讯云。
优势:价格低廉,使用方便
私有云(Private Clouds)
是为一个客户单独使用而构建的,于是提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并能够控制在此基础设施上部署应用程序的方式。私有云可部署在企业数据中心的防火墙内,也能够将它们部署在一个安全的主机托管场所,私有云的核心属性是专有资源。
优势:可控,数据安全(银行必然使用私有云
混合云(Hybrid Cloud)
混合云融合了公有云和私有云,是近年来云计算的主要模式和发展方向。咱们已经知道私企业主要是面向企业用户,出于安全考虑,企业更愿意将数据存放在私有云中,可是同时又但愿能够得到公有云的计算资源,在这种状况下混合云被愈来愈多的采用,它将公有云和私有云进行混合和匹配,以得到最佳的效果,这种个性化的解决方案,达到了既省钱又安全的目的,例如在一次活动中,只须要暂时几台机器,在私有云存在的状况,考虑混合云的使用,是最合理化的。
优势:集合的使用方式更完美,可扩展,更节省
2.2云计算的层次
SaaS
提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户能够在各类设备上经过客户端界面访问,如浏览器。消费者不须要管理或控制任何云计算基础设施,包括网络、服务器、操做系统、存储等等;平时使用的邮件服务器,即属于SaaS服务。
PaaS
提供给消费者的服务是把客户采用提供的开发语言和工具(例如Java,python, .Net等)开发的或收购的应用程序部署到供应商的云计算基础设施上去。客户不须要管理或控制底层的云基础设施,包括网络、服务器、操做系统、存储等,但客户能控制部署的应用程序,也可能控制运行应用程序的托管环境配置;更适合提供给开发人员使用,在这里也可使用docker容器技术实现
IaaS
提供给消费者的服务是对全部计算基础设施的利用,包括处理CPU、内存、存储、网络和其它基本的计算资源,用户可以部署和运行任意软件,包括操做系统和应用程序。消费者无论理或控制任何云计算基础设施,但能控制操做系统的选择、存储空间、部署的应用,也有可能得到有限制的网络组件(例如路由器,防火墙、负载均衡器等)的控制。更适合提供给运维人员使用
2.3 虚拟化的优点
虚拟化能够虚拟出来多个操做系统:每一个操做系统之间是相互独立的,因此每一个操做系统上所跑的应用天然是相互不影响的。在这里用一个经典的例子说明,一台物理机跑8个tomcat和8个虚拟机上各跑一个tomcat,跑8个tomcat的物理机,若是其中一个tomcat出问题(内存有问题,jvm有问题等),势必会影响到其余7个tomcat,可是在8个虚拟机上跑分别各跑一个tomcat,他们之间是互不影响的,因为虚拟化一层缘由占用了一些资源,效果并无直接一台物理机跑8个tomcat效果好,可是虚拟机的互相独立互不影响是更重要的,并且便于管理,每一个tomcat实例都会起3个端口(8080:对外服务端口,8009:AJP端口,8005:关闭端口),使用虚拟机以后,就不会担忧多个tomcat端口冲突的状况。
支持异构 :linux系统能够虚拟化windows系统,方便不一样场景系统的使用
支持快照功能和克隆等功能:快照功能在某个物理机不知运行什么,是否正在运行的状况下,若是是一台虚拟机就好办了,直接停了该虚拟机,只不过是占了一些磁盘空间而已。
2.4 虚拟化和云计算的简单总结
虚拟化是一种技术,云计算是经过虚拟化技术实现的一种经过网络访问获取资源,流量,交付的使用模式,二者并不能相互比较,虚拟化至关于实干家,而云计算是思想家。
3、虚拟化的分类
3.1 全虚拟化与半虚拟化
全虚拟化
又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层–Hypervisor,或者叫作虚拟机管理程序(VMM)。hypervisor 能够划分为两大类。首先是类型 1,这种 hypervisor 是直接运行在物理硬件之上的。其次是类型 2,这种 hypervisor 运行在另外一个操做系统(运行在物理硬件之上)中。类型 1 hypervisor 的一个例子是基于内核的虚拟机(KVM —— 它自己是一个基于操做系统的 hypervisor)。类型 2 hypervisor 包括 QEMU 和 WINE。由于运行在虚拟机上的操做系统经过Hypervisor来最终分享硬件,因此虚拟机发出的指令需通过Hypervisor捕获并处理。为此每一个客户操做系统(Guest OS)所发出的指令都要被翻译成CPU能识别的指令格式,这里的客户操做系统便是运行的虚拟机,因此Hypervisor的工做负荷会很大,所以会占用必定的资源,因此在性能方面不如裸机。可是运行速度要快于硬件模拟。全虚拟化最大的优势就是运行在虚拟机上的操做系统没有通过任何修改,惟一的限制就是操做系统必须可以支持底层的硬件,不过目前的操做系统通常都能支持底层硬件,因此这个限制就变得微不足道了。
半虚拟化
半虚拟化技术是后来才出现的技术,半虚拟化技术英文是paravirtualization,也叫作准虚拟化技术,如今比较热门,它就是在全虚拟化的基础上,把客户操做系统进行了修改,增长了一个专门的API,这个API能够将客户操做系统发出的指令进行最优化,即不须要Hypervisor耗费必定的资源进行翻译操做,所以Hypervisor的工做负担变得很是的小,所以总体的性能也有很大的提升。不过缺点就是,要修改包含该API的操做系统,可是对于某些不含该API的操做系统(主要是windows)来讲,就不行能用这种方法,Xen就是一个典型的半虚拟化的技术。
3.2服务器虚拟化,桌面虚拟化,应用虚拟化
服务器虚拟化
数量少的状况推荐使用ESXI,XenServer
数量大的状况推荐使用KVM,RHEV(并不开源),oVirt,Openstack,Vmvare vshpere
桌面虚拟化
桌面虚拟化依赖于服务器虚拟化,在数据中心的服务器上进行服务器虚拟化,生成大量的独立的桌面操做系统(虚拟机或者虚拟桌面),同时根据专有的虚拟桌面协议发送给终端设备。用户终端经过以太网登录到虚拟主机上,只须要记住用户名和密码及网关信息,便可随时随地的经过网络访问本身的桌面系统,从而实现单机多用户。多用于IP外包,呼叫中心,银行办公、移动桌面。
应用虚拟化
技术原理是基于应用/服务器计算A/S架构,采用相似虚拟终端的技术,把应用程序的人机交互逻辑(应用程序界面、键盘及鼠标的操做、音频输入输出、读卡器、打印输出等)与计算逻辑隔离开来。在用户访问一个服务器虚拟化后的应用时,用户计算机只须要把人机交互逻辑传送到服务器端,服务器端为用户开设独立的会话空间,应用程序的计算逻辑在这个会话空间中运行,把变化后的人机交互逻辑传送给客户端,而且在客户端相应设备展现出来,从而使用户得到如同运行本地应用程序同样的访问感觉。
3)硬件虚拟化和软件虚拟化
4、虚拟化之KVM
4.1kvm的虚拟化特性
1)嵌入到linxu正式kernel(提升了兼容性)
2)代码级资源调用(提升性能)
3)虚拟机就是一个进程(内存易于管理)
4)直接支持NUMA技术(提升扩展性)
5)虽然被Redhat收购了,可是依然保持着开源发展模式,社区活跃
6)更好的商业支持及服务保障
7)Centos7较Centos6默认支持cpu热添加,内存的热添加,大页内存默认都是开启的
4.2 支持虚拟化的条件
inter的cpu:vmx
AMD的cpu:svm
本文使用的是vmvare,须要开启以下两个条件便可,若是是物理机,须要在bios里面设置,默认都是开启状态。
在cpuinfo中能够查看具体的支持虚拟化的信息
[root@chuck~]`# grep -E "svm|vmx" /proc/cpuinfo
4.3 kvm安装实战
安装kvm
[root@chuck~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt -y
kvm: linux内核的一个模块,模块不须要安装,只须要加载
qemu:虚拟化软件,能够虚拟不一样的CPU,支持异构(x86的架构能够虚拟化出不是x86架构的)
qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的
建立一个虚拟磁盘,-f 指定格式,路径是/opt/CentOS-7.1-x86_64.raw,大小为10G
[root@chuck opt]# qemu-img create -f raw /opt/CentOS-7.1-x86_64.raw 10G Formatting /opt/CentOS-7.1-x86_64.raw', fmt =raw size=10737418240
显示内核中kvm的状态
[root@chuck opt]``# lsmod|grep kvm
kvm_intel 148081 0
kvm 461126 1 kvm_intel
启动libvirt,查看状态,关键字:active
4.4 开始装一台虚拟机
在vmvare上挂载一个镜像
导入到宿主机中,固然时间可能较长
[root@localhost opt]# dd if=/dev/cdrom of=/opt/CentOS-7.1-x86_64.iso
[root@localhost opt]``# ls /opt/
CentOS-7.1-x86_64.iso CentOS-7.1-x86_64.raw rh
使用命令建立一台虚拟机
首先学virt-install命令,在这里使用–help查看,而且只学习重要的,其余的稍后会有提供
virt-install –help
-n(Name):指定虚拟机的名称
–memory(–raw):指定内存大小
–cpu:指定cpu的核数(默认为1)
–cdrom:指定镜像
–disk:指定磁盘路径(即上文建立的虚拟磁盘)
–virt-type:指定虚拟机类型(kvm,qemu,xen)
–network:指定网络类型
执行建立虚拟机命令
[root@chuck ~]# virt-install --name CentOS-7.1-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.1-x86 --cdrom=/opt/CentOS-7.1-x86_64.iso --disk path=/opt/CentOS-7.1-x86_64.raw --nehics vnc,listen=0.0.0.0 --notwork network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
4.5 虚拟机基本操做学习
生成kvm虚拟机:virt-install
查看在运行的虚拟机:virsh list
查看全部虚拟机:virsh list –all
查看kvm虚拟机配置文件:virsh dumpxml name
启动kvm虚拟机:virsh start name
正常关机:virsh shutdown name
非正常关机(至关于物理机直接拔掉电源):virsh destroy name
删除:virsh undefine name(完全删除,找不回来了,若是想找回来,须要备份/etc/libvirt/qemu的xml文件)
根据配置文件定义虚拟机:virsh define file-name.xml
挂起,终止:virsh suspend name
恢复挂起状态:virsh resumed name
启动刚才建立的虚拟机
[root@chuck ~]# virsh start CentOS-7.1-x86_64
Domain CentOS-7.1-x86_64 started
4.6 编辑kvm的xml文件,更改虚拟机CPU配置
配置虚拟机的cpu,两种方式(启动的时候指定核数,更改xml)
第一种方法:为了实现cpu的热添加,就须要更改cpu的最大值,固然热添加的个数不能超过最大值
[root@chuck ~]# virsh edit CentOS-7.1-x86_64
<vcpu placement='auto'current="1">4</vcpu> 当前为1,自动扩容,最大为4
重启虚拟机
[root@chuck ~]# virsh shutdown CentOS-7.1-x86_64
Domain CentOS-7.1-x86_64 is being shutdown
[root@chuck ~]# virsh start CentOS-7.1-x86_64
Domain CentOS-7.1-x86_64 started
登陆虚拟机上,查看cpu信息,确认cpu的个数,下面开始进行cpu热添加
cpu的热添加(cpu只支持热添加,不支持热减小)
[root@chuck ~]# virsh setvcpus CentOS-7.1-x86_64 2 --live
再到虚拟机中查看cpu信息
kvm版本较高,并不须要echo “1”到/sys/devices/system/cpu/cpu1/online 进行激活,自动能够激活。
[root@chuck ~]# cat /sys/devices/system/cpu/cpu1/online
1
第二种方法:安装的时候指定
virt-install –vcpus 5 –vcpus 5,maxcpus=10,cpuset=1-4,6,8 –vcpus sockets=2,cores=4,thread=2
4.7 编辑kvm的xml文件,更改虚拟机内存配置
内存的设置拥有一个“气球(balloon)机制”,能够增大减小,可是也要设置一个最大值,默认并无设置最大值,也能够在安装的时候指定,这里再也不重复此方法
[root@chuck ~]# virsh edit CentOS-7.1-x86_64
<memory unit='KiB'>4194304</memory>把最大内存改成4G
<currentMemory unit='KiB'>1048576</currentMemory>当前内存为1G
重启虚拟机并查看当前状态的内存使用状况
[root@chuck ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info balloon
balloon: actual=1024
对内存进行热添加并查看
[root@chuck ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd balloon
unexpected end of expression
[root@chuck ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info balloon
balloon: actual=2000
更改虚拟机中存储,硬盘设置(不建议在生产环境使用硬盘的扩大收缩模式,很容易产生故障)
[root@chuck ~]# qemu-img --help |grep -i "formats:"
Supported formats: vvfat vpc vmdk vhdx vdi sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg cloop bochs blkverify blkdebug
从结果看出,kvm支持不少种硬盘格式
硬盘格式整体上分为两种:1为全镜像格式,2为稀疏格式
全镜像格式(典型表明raw格式),其特色:设置多大就是多大,写入速度快,方便的转换为其余格式,性能最优,可是占用空间大
稀疏模式(典型表明qcow2格式),其特色:支持压缩,快照,镜像,更小的存储空间(即用多少占多少)
硬盘格式均可以经过qemu-img管理,详情qemu-img –help
4.8 编辑kvm的xml文件,更改虚拟机网桥链接配置
默认状况是NAT状况,可是在生产状况,使用更多的是桥接模式,更改虚拟机为网桥模式,原理图以下,网桥的基本原理就是建立一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据
修改eth0(这里Centos7的eth0在装机的时候就指定,不须要特地指定了)
添加一个网桥并查看
[root@chuck ~]# brctl addbr br0
把eth0加入网桥,使用桥接模式,给br设置ip,添加路由网关,关闭防火墙
[root@chuck ~]# brctl addif br0 eth0 && ip addr del dev eth0 10.0.0.123/24 && ifconfig br0 10.0.0.123/24 up && route add default gw 10.0.0.2 && iptables -F
编辑虚拟机的网络配置使用br0网桥模式
[root@chuck ~]# virsh edit CentOS-7.1-x86_64
<interface type="bridge"> <!--虚拟机网络链接方式-->
<source bridge="br0" /> <!-- 当前主机网桥的名称-->
<mac address="00:16:e4:9a:b3:6a" /> <!--为虚拟机分配mac地址,务必惟一,若是是dhcp得到一样ip,引发冲突-->
</interface>
重启虚拟机,网桥模式生效,此时使用crt即可以连接到所建立的虚拟机了,在vmvare机器上使用ifconfig查看详情
[root@chuck ~]# ifconfig
5、KVM的优化
5.1 cpu的优化
inter的cpu的运行级别,按权限级别高低Ring3->Ring2->Ring1->Ring0,(Ring2和Ring1暂时没什么卵用)Ring3为用户态,Ring0为内核态
Ring3的用户态是没有权限管理硬件的,须要切换到内核态Ring0,这样的切换(系统调用)称之为上下文切换,物理机到虚拟机屡次的上下文切换,势必会致使性能出现问题。对于全虚拟化,inter实现了技术VT-x,在cpu硬件上实现了加速转换,CentOS7默认是不须要开启的。
cpu的缓存绑定cpu的优化
[root@chuck ~]# lscpu|grep cache
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
L1 L2 L3 三级缓存和CPU绑定
L1是静态缓存,造价高,L2,L3是动态缓存,经过脉冲的方式写入0和1,造价较低。cache解决了cpu处理快,内存处理慢的问题,相似于memcaced和数据库。若是cpu调度器把进程随便调度到其余cpu上,而不是当前L1,L2,L3的缓存cpu上,缓存就不生效了,就会产生miss,为了减小cache miss,须要把KVM进程绑定到固定的cpu上,可使用taskset把某一个进程绑定(cpu亲和力绑定,能够提升20%的性能)在某一个cpu上,例如:taskset -cp 1 25718(1指的是cpu1,也能够绑定到多个cpu上,25718是指的pid).
cpu绑定的优势:提升性能,20%以上
cpu绑定的缺点:不方便迁移,灵活性差
5.2内存的优化
内存寻址:宿主机虚拟内存 -> 宿主机物理内存
虚拟机的虚拟内存 -> 虚拟机的物理内存
之前VMM经过采用影子列表解决内存转换的问题,影子页表是一种比较成熟的纯软件的内存虚拟化方式,但影子页表固有的局限性,影响了VMM的性能,例如,客户机中有多个CPU,多个虚拟CPU之间同步页面数据将致使影子页表更新次数幅度增长,测试页表将带来异常严重的性能损失。以下图为影子页表的原理图
在此之际,Inter在最新的Core I7系列处理器上集成了EPT技术(对应AMD的为RVI技术),以硬件辅助的方式完成客户物理内存到机器物理内存的转换,完成内存虚拟化,并以有效的方式弥补了影子页表的缺陷,该技术默认是开启的,以下图为EPT技术的原理
KSM内存合并
宿主机上默认会开启ksmd进程,该进程做为内核中的守护进程存在,它按期执行页面扫描,识别副本页面并合并副本,释放这些页面以供它用,CentOS7默认是开启的
[root@chuck ~]# ps aux|grep ksmd|grep -v grep
root 286 0.0 0.0 0 0 ? SN 12:32 0:00 [ksmd]
大页内存,CentOS7默认开启的
[root@chuck ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root@chuck ~]# ps aux |grep khugepage|grep -v grep
root 287 0.2 0.0 0 0 ? SN 12:32 0:21 [khugepaged]
Linux平台默认的内存页面大小都是4K,HugePage进程会将默认的的每一个内存页面能够调整为2M。
5.3 磁盘IO的优化
IO调度算法,也叫电梯算法
① Noop Scheduler:简单的FIFO队列,最简单的调度算法,因为会产生读IO的阻塞,通常使用在SSD硬盘,此时不须要调度,IO效果很是好
② Anticipatory IO Scheduler(as scheduler)适合大数据顺序顺序存储的文件服务器,如ftp server和web server,不适合数据库环境,DB服务器不要使用这种算法。
③ Deadline Schedler:按照截止时间的调度算法,为了防止出现读取被饿死的现象,按照截止时间进行调整,默认的是读期限短于写期限,就不会产生饿死的情况,通常应用在数据库
④ Complete Fair Queueing Schedule:彻底公平的排队的IO调度算法,保证每一个进程相对特别公平的使用IO
查看本机Centos7默认所支持的调度算法
[root@chuck ~]# dmesg|grep -i "scheduler"
[ 11.312549] io scheduler noop registered
[ 11.312555] io scheduler deadline registered (default)
[ 11.312606] io scheduler cfq registered
临时更改某个磁盘的IO调度算法,将deadling模式改成cfq模式
[root@chuck ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
[root@chuck ~]# echo cfq >/sys/block/sda/queue/scheduler
[root@chuck ~]# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
使更改的IO调度算法永久生效,须要更改内核参数
[root@chuck ~]# vim /boot/grub/menu.lst
kernel /boot/vmlinuz-3.10.0-229.el7 ro root=LABEL=/ elevator=deadline rhgb quiet
5.4 cache的优化
关于write through和write back,默认write through便可
Write-back
在这种策略下,当数据被写到raid卡的cache中,控制器就向IO调度器返回了写操做完成信号; 双刃剑,它虽然带来了IO性能的提高,可是随之而来的风险:由于cache是ROM,假设服务器忽然断电,则cache中的数据可能丢失; 为了解决这个问题,raid卡加加装一块锂电池(BBU),即当服务器断电时,能把cache中的数据刷到磁盘上;一样的道理,BBU又成为一个风险点,由于锂电池须要保证始终有足够的电量来保证能将cache中的数据写到磁盘上,raid卡会加入一个BBU的管理策略,learn cycle(充放电周期,通常有30/90天,让电池充放电一次,持续约6小时),那么这6小时又称为一个风险点;因此raid卡又会增长一个策略:No WB when bad bbu,即当BBU坏掉,或者BBU正在充放电时,禁用write-back,此时Write policy就会变成:write-through。
Write through
只有当数据被写到物理磁盘中,控制器才向IO调度器返回了写操做完成信号; 这种策略以牺牲IO性能,来保证数据安全性,淘宝这边的策略:由于Write-Through的io性能没法知足业务的需求,因此咱们这边会采用另外一个模式:WB when bad bbu,即无论bbu状态是否正常,咱们都会采用write-back,那数据安全怎么办?服务器异常断电的状况,在咱们这边几率极低;即使很不幸的咱们IDC局部断电了,咱们也有主备模式来保证数据的相对安全;咱们会监控BBU的状态,一旦发生了BBU failed,咱们会将安排停机更换
6、建立虚拟机镜像
6.1 虚拟磁盘及镜像
因为在一开始建立了虚拟磁盘,并命名为CentOS-7.1-x86_64.raw,这就是虚拟机的镜像喽。
[root@chuck ~]# cd /opt/[root@chuck opt]# lsCentOS-7.1-x86_64.iso CentOS-7.1-x86_64.raw rh6.2 镜像制做原则分区的时候,只分一个/根分区,并不须要swap分区,因为虚拟机的磁盘性能就很差,若是设置了swap分区,当swap工做的时候,性能会更差。例如阿里云主机,就没有交换分区。镜像制做须要删除网卡(eth0)中的UUID,若是有udev(/etc/udev/rules.d/70-persistent-ipoib.rules)的规则也要删除关闭selinux,关闭iptables安装基础软件的包:net-tools lrzsz screen tree vim wget