集群
集群的定义:大于等于两台的主机形成HA高可用集群,在一起实现商业目标。
HA解决了业务连续性的问题,不再受制于一台物理服务器故障业务中断的风险,实现秒级切换业务,用户无感知。
VRM:Virtual Resource Management 虚拟资源管理
功能:1实现管理页面功能 2对集群的监控管理功能 3提供心跳
环境:1管理的CNA节点大于50台,建议建立在物理机上 2管理的CNA节点小于50,建议虚拟化部署
通过VRM管理CNA,同时VRM是部署在CNA上的
CNA:Compute Node Agent 计算节点代理
功能:1提供计算、网络资源 2提供本地存储
本质:OS(功能是优化加固,无图形化界面) + KVM虚拟化套件
6.3.0以前是CentOS,6.3.0以后是EulerOS
服务器远程管理卡BMC:默认密码root/Huaiwei@123
CNA底层:gandalf / IaaS@OS-CLOUD9!
VM:运行在CNA上的虚拟机
本质:OVA文件 或 OVF文件+VHD磁盘映像文件(配置文件 + 磁盘文件)
共享存储:实现HA等高级特性(迁移、DRS),为CNA提供共享硬盘
HA实现原理:VRM和VRM,VRM和CNA,CNA通过tools和VM之间通过心跳线判断节点是否故障,每50ms发送一次心跳报文确认各个主机状态,一旦失去心跳,立刻切换。
VRM主机一直处于工作状态,备机不工作,一直同步来自主机的数据,当触发HA时,切换。如果主备节点同时工作,会导致脑裂(所得数据不一致)。
注意:为了避免意外触发HA,必须要保证节点间的延迟时间小于等于2ms。
在同一套fusioncompute里根据多种情况划分多个集群
1根据业务不同(资源隔离,保证部分业务故障,不影响整体)
2根据硬件不同(不同物理服务器的CPU内存不能在一个集群中)
3根据指令集(x86或ARM互相不兼容)
全虚拟化
用虚拟化软件翻译指令,虚拟机通过虚拟化软件找物理CPU内存要资源,物理机分配资源给虚拟化软件,再由虚拟化软件分配给虚拟机,导致效率很低,
半虚拟化
在内核中加入system call 进行指令集拦截和翻译。
硬件辅助虚拟化
CPU和内存基于硬件辅助虚拟化
VT-X用于标记VM是一台虚拟机,则VM大部分指令可以直接运行在CPU之上,只有19条敏感指令集需要经过VMM(内存管理单元)拦截并转换,丢给物理内核来运行。
VirtIO半虚拟化硬件
网卡和硬盘是基于半虚拟化驱动VIRTIO PV Drive
特殊的驱动,让虚拟机知道自身是虚拟机,从而对虚拟网卡和硬盘进行优化。
磁盘-总线类型-VirtIO
==================================================================================
创建集群
1开启内存复用
作用:在整个集群中开启的虚拟机分配的内存超过物理主机的内存之和(已分配>总容量)
原理:一块物理内存可能提供给多台虚拟机使用,按需分配内存资源
限制:生产环境超分比例不能超过150%
开启优势:提高虚拟机开机密度 关闭优势:提高虚拟机的性能
2虚拟机启动策略
负载均衡:系统会根据所有CNA的CPU和内存的权重,选择资源使用最少的主机来运行(适用于空闲资源较多时)
自动分配:选择一个能满足该虚拟机开机的主机来运行(适用于所有主机的资源占用都比较满的情况下)
3虚拟机NUMA架构自动调整
UMA:一致性内存访问(Unified Memory Architeture )
NUMA:非一致性内存访问
1过去内存和CPU交换资源的瓶颈在FSB前端总线,可以理解为出行高峰时车挤满了道路,堵塞交通,运算能力降低。为了解决这个问题将FSB改进成了QPI,可以理解为不走一条道路而是划分了很多条“井”字路,某一个十字节点故障后,仍然可以从其它道路走,从而提高CPU和内存的利用率。
2QPI是把CPU和内存绑定在一个区域里获取资源,这个区域叫做NUMA NODE,在同一区域内会尽量满足本区域的资源需求,发现实在不够的情况下,才会向其它区域申请资源,保证了整体业务的稳定性。
4主机相关故障和响应策略
HA虚拟机:主机故障后,将虚拟机迁移到其它正常主机节点跑VM(默认)
原主机恢复虚拟机:主机故障后,VM不迁移,等主机恢复后,VM恢复
5主机数据存储故障策略
不处理:主机故障后,不进行任何操作(默认,适用于共享存储)
HA虚拟机:主机故障后,将虚拟机数据迁移到其它正常主机节点
6延迟策略
在CNA和共享存储之间的心跳线,实时确认彼此状态,来判断是否触发策略。
1如果设置延迟策略X分钟,心跳中断的时间小于X分钟,就不触发上述策略。
2如果设置延迟策略X分钟,心跳中断的时间大于X分钟,就触发策略
3生产环境会有某个时间点存在间歇性故障(数据量大、压力大,但几分钟后就恢复正常了)所以设置的延迟策略时间过短会导致资源浪费和反复HA导致集群性能下降。
7虚拟机故障和响应策略
1不处理 2重启 3HA 4关闭
前提条件:虚拟机必须安装tools(虚拟机驱动程序),运行tools来监控和管理CPU、内存和磁盘资源,根据VRM上资源的利用率可以判断是否安装tools,利用率都为0就是没有安装。
实现原理:CNA通过向tools发心跳报文实现,再由CNA回包给VRM实现(没有tools的VM不能和CNA/VRM通讯)
8接入控制
HA资源预留设置:预留总资源的百分比,预留资源越多,利用率就越低,适用于预留超过两台太浪费资源,预留一台资源利用率太低。
集群允许主机故障设置:可以设置故障主机数,如果有10主机,设置1故障主机数,那么每一台主机只能使用总资源的90%,一旦超过90%,集群不允许虚拟机开机。可以自定义设置预留的CPU、内存的插槽数目。
华为官方建议每10台主机预留1台主机,数量越大,预留的主机数量可以相应减少,例如100台预留3台即可,因为同时损坏3台主机概率极低。
9群体性故障控制
如上,是理想环境下损坏预留主机数以内的,不影响业务。如果一旦损坏多台设备,集群的处理措施。
故障控制时间:在X小时内,完成CNA上所有虚拟机的迁移
允许处理的虚拟机个数:
1同时损坏多台设备,随机挑选两个CNA上的所有虚拟机进行迁移恢复到其它主机。
2多台设备一台台损坏,恢复最先损坏的两台主机设备。
10分布式资源调度
DRS: Distributed Resource Scheduler 解决主机负载不均衡的问题,互相迁移,保持CNA主机均衡
手动:检测到不均衡,提示用户将某虚拟机迁移到主机上,需要人工确认执行。
自动:检测到不均衡,自动迁移,无需确认。
调度基线:CPU、内存、CPU和内存(两者满足其中一个即可)配置触发DRS的资源比例
迁移阈值:保守(能不迁移就不迁移)<-----中等------>激进(能迁移就迁移)可以根据时间段划分(时、日、月)
11分布式电源管理
DPM:Distributed Power Management
解决节能问题,例如1000CNA,10000VM在忙碌时集群利用率很高,在空闲时可能只需要不到一半的CNA,整体利用率很低,很浪费资源,所以在空闲时检测资源利用率过低,触发DPM,关闭部分CNA主机节约能源。
前提条件:在添加CNA主机时,配置BMC
迁移阈值:保守(能不关机就不关机)<-----中等------>激进(能不开机就不开机)可以根据时间段划分(时、日、月)
12不兼容迁移集群
IMC:incompatible migration cluster
Intel在两年的周期里,会对CPU进行升级换代,一年升级架构,一年升级生产工艺。两年后,客户需要扩容新的服务器时,解决新服务器imc模式能向下兼容老服务器的功能。
13全虚拟化和半虚拟化
内核是个大管家,想象你的机器上跑着很多的程序,有word,有excel,看着视频,听着音乐,每个程序都要使用CPU和内存,都要上网,都要存硬盘,如果没有一个大管家管着,大家随便用,就乱了。所以需要管家来协调调度整个资源,谁先用,谁后用,谁用多少,谁放在这里,谁放在那里,都需要管家操心。
所以在这个计算机大家庭里面,管家有着比普通的程序更高的权限,运行在内核态,而其他的普通程序运行在用户态,用户态的程序一旦要申请公共的资源,就需要向管家申请,管家帮它分配好,它才能用。
为了区分内核态和用户态,CPU专门设置四个特权等级0,1,2,3 来做这个事情。
当时写Linux内核的时候,估计大牛们还不知道将来虚拟机会大放异彩,大牛们想,一共两级特权,一个内核态,一个用户态,却有四个等级,好奢侈,好富裕,就敞开了用,内核态运行在第0等级,用户态运行在第3等级,占了两头,太不会过日子了。
大牛们在写Linux内核的时候,如果用户态程序做事情,就将扳手掰到第3等级,一旦要申请使用更多的资源,就需要申请将扳手掰到第0等级,内核才能在高权限访问这些资源,申请完资源,返回到用户态,扳手再掰回去。
这个程序一直非常顺利的运行着,直到虚拟机的出现。
如果大家用过Vmware桌面版,或者Virtualbox桌面版,你可以用这个虚拟化软件创建虚拟机,在虚拟机里面安装一个Linux或者windows,外面的操作系统也可以是Linux或者Windows。
当你使用虚拟机软件的时候,和你的excel一样,都是在你的任务栏里面并排的放着,是一个普通的应用。
当你进入虚拟机的时候,虚拟机里面的excel也是一个普通的应用。
但是当你设身处地的站在虚拟机里面的内核的角度思考一下人生,你就困惑了,我到底个啥?
在硬件上的操作系统来看,我是一个普通的应用,只能运行在用户态。可是大牛们生我的时候,我的每一行代码,都告诉我,我是个内核啊,应该运行在内核态,当虚拟机里面的excel要访问网络的时候,向我请求,我的代码就要努力的去操作网络资源,我努力,但是我做不到,我没有权限!
我分裂了。
虚拟化层,也就是Vmware或者Virtualbox需要帮我解决这个问题。
第一种方式,完全虚拟化,其实就是骗我。虚拟化软件模拟假的CPU,内存,网络,硬盘给我,让我自我感觉良好,终于又像个内核了。
真正的工作模式是这样的。
虚拟机内核:我要在CPU上跑一个指令!
虚拟化软件:没问题,你是内核嘛,可以跑
虚拟化软件转过头去找物理机内核:报告管家,我管理的虚拟机里面的一个要执行一个CPU指令,帮忙来一小段时间空闲的CPU时间,让我代他跑个指令。
物理机内核:你等着,另一个跑着呢。好嘞,他终于跑完了,该你了。
虚拟化软件:我代他跑,终于跑完了,出来结果了
虚拟化软件转头给虚拟机内核:哥们,跑完了,结果是这个,我说你是内核吧,绝对有权限,没问题,下次跑指令找我啊。
虚拟机内核:看来我真的是内核呢。可是哥,好像这点指令跑的有点慢啊。
虚拟化软件:这就不错啦,好几个排着队跑呢。
内存的申请模式如下。
虚拟机内核:我启动需要4G内存,我好分给我上面的应用。
虚拟化软件:没问题,才4G,你是内核嘛,马上申请好。
虚拟化软件转头给物理机内核:报告,管家,我启动了一个虚拟机,需要4G内存,给我4个房间呗。
物理机内核:怎么又一个虚拟机啊,好吧,给你90,91,92,93四个房间。
虚拟化软件转头给虚拟机内核:哥们,内存有了,0,1,2,3这个四个房间都是你的,你看,你是内核嘛,独占资源,从0编号的就是你的。
虚拟机内核:看来我真的是内核啊,能从头开始用。那好,我就在房间2的第三个柜子里面放个东西吧。
虚拟化软件:要放东西啊,没问题。心里想:我查查看,这个虚拟机是90号房间开头的,他要在房间2放东西,那就相当于在房间92放东西。
虚拟化软件转头给物理机内核:报告,管家,我上面的虚拟机要在92号房间的第三个柜子里面放个东西。
好了,说完了CPU和内存的例子,不细说网络和硬盘了,也是类似,都是虚拟化软件模拟一个给虚拟机内核看的,其实啥事儿都需要虚拟化软件转一遍。
这种方式一个坏处,就是慢,往往慢到不能忍受。
半虚拟化
于是虚拟化软件想,我能不能不当传话筒,还是要让虚拟机内核正视自己的身份,别说你是内核,你还真喘上了,你不是物理机,你是虚拟机。
但是怎么解决权限等级的问题呢?于是Intel的VT-x和AMD的AMD-V从硬件层面帮上了忙。当初谁让你们这些写内核的大牛用等级这么奢侈,用完了0,就是3,也不省着点用,没办法,只好另起炉灶弄一个新的标志位,表示当前是在虚拟机状态下,还是真正的物理机内核下。
对于虚拟机内核来讲,只要将标志位设为虚拟机状态,则可以直接在CPU上执行大部分的指令,不需要虚拟化软件在中间转述,除非遇到特别敏感的指令,才需要将标志位设为物理机内核态运行,这样大大提高了效率。
所以安装虚拟机的时候,务必要将物理CPU的这个标志位打开,是否打开对于Intel可以查看grep “vmx” /proc/cpuinfo,对于AMD可以查看grep “svm” /proc/cpuinfo
这叫做硬件辅助虚拟化。
另外就是访问网络或者硬盘的时候,为了取得更高的性能,也需要让虚拟机内核加载特殊的驱动,也是让虚拟机内核从代码层面就重新定位自己的身份,不能像访问物理机一样访问网络或者硬盘,而是用一种特殊的方式:我知道我不是物理机内核,我知道我是虚拟机,我没那么高的权限,我很可能和很多虚拟机共享物理资源,所以我要学会排队,我写硬盘其实写的是一个物理机上的文件,那我的写文件的缓存方式是不是可以变一下,我发送网络包,根本就不是发给真正的网络设备,而是给虚拟的设备,我可不可以直接在内存里面拷贝给他,等等等等。
一旦我知道我不是物理机内核,痛定思痛,只好重新认识自己,反而能找出很多方式来优化我的资源访问。
VT-X用于标记VM是一台虚拟机,则VM大部分指令可以直接运行在CPU上,只有19条敏感指令集需要经过VMM拦截并转换,丢给物理内核来处理(ring0)
内存可以直接运行在物理内存之上,不需要经过虚拟化软件来处理,内存分配也是由CPU来实现的,MMU(内存管理单元)处理内核映射
————————————————
版权声明:本文部分为CSDN博主「粥粥同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gui951753/article/details/81507924