雲端計算和虛擬機器基礎梳理

散盡浮華發表於2016-03-08

 

雲端計算介紹
雲端計算是一種按使用量付費的模式,這種模式提供可用的、便捷的、按需的網路訪問,進入可配置的計算資源共享池,(資源包括網路、伺服器、儲存、應用軟體、服務),這些資源能夠被快速提供,需要投入很少的管理工作,或與服務供應商進行很少的互動。

1)雲端計算之前的使用模式
IDC 託管
IDC 租用
虛擬主機(買空間)
VPS:虛擬專用主機
2)傳統資料中心面臨的問題
資源使用率低
資源分配不均
自動化能力差
3)雲端計算的優勢
雲端計算是一種使用模式,不是一種技術
雲端計算的使用方式:通過網路訪問
雲端計算的優勢:彈性計算、按需計費
4)雲端計算的特點
資源池化
無處不在的網路訪問
可隨時調節的自助服務
可測量的服務量
快速的變化伸縮
5)雲端計算的服務模式

1--支撐服務
由支撐網路來提供,雲端計算模式實現的使用的方式。
2--IaaS基礎設施即服務
消費者通過支撐網路可以從完善的計算機基礎設施獲得服務。這類服務稱為基礎設施即服務,基於 Internet 的服務(如儲存和資料庫)是 IaaS的一部分。
3--PaaS平臺即服務
PaaS(Platform-as-a-Service:平臺即服務)是指將軟體研發的平臺作為一種服務,以SaaS的模式提交給使用者。因此,PaaS也是SaaS模式的一種應用。
4--SaaS
它是一種通過Internet提供軟體的模式,廠商將應用軟體統一部署在自己的伺服器上,客戶可以根據自己實際需求,通過網際網路向廠商定購所需的應用軟體服務,按定購的服務多少和時間長短向廠商支付費用,並通過網際網路獲得廠商提供的服務。使用者不用再購買軟體,而改用向提供商租用基於Web的軟體,來管理企業經營活動,且無需對軟體進行維護,服務提供商會全權管理和維護軟體,軟體廠商在向客戶提供網際網路應用的同時,也提供軟體的離線操作和本地資料儲存,讓使用者隨時隨地都可以使用其定購的軟體和服務。對於許多小型企業來說,SaaS是採用先進技術的最好途徑,它消除了企業購買、構建和維護基礎設施和應用程式的需要。
6)雲端計算的型別
1--公有云
公有云通常指第三方提供商為使用者提供的能夠使用的雲,公有云一般可通過 Internet 使用,可能是免費或成本低廉的,公有云的核心屬性是共享資源服務。這種雲有許多例項,可在當今整個開放的公有網路中提供服務。例如:阿里雲、騰訊雲、青雲、百度雲、盛大雲、迅達雲、等等。
2--私有云
私有云(Private Clouds)是為一個客戶單獨使用而構建的,因而提供對資料、安全性和服務質量的最有效控制。該公司擁有基礎設施,並可以控制在此基礎設施上部署應用程式的方式。私有云可部署在企業資料中心的防火牆內,也可以將它們部署在一個安全的主機託管場所,私有云的核心屬性是專有資源。
3--混合雲
混合雲融合了公有云和私有云,是近年來雲端計算的主要模式和發展方向。我們已經知道私企業主要是面向企業使用者,出於安全考慮,企業更願意將資料存放在私有云中,但是同時又希望可以獲得公有云的計算資源,在這種情況下混合雲被越來越多的採用,它將公有云和私有云進行混合和匹配,以獲得最佳的效果,這種個性化的解決方案,達到了既省錢又安全的目的。

虛擬化介紹
擬化,是指通過虛擬化技術將一臺計算機虛擬為多臺邏輯計算機。在一臺計算機上同時執行多個邏輯計算機,每個邏輯計算機可執行不同的作業系統,並且應用程式都可以在相互獨立的空間內執行而互不影響,從而顯著提高計算機的工作效率。
虛擬化使用軟體的方法重新定義劃分IT資源,可以實現IT資源的動態分配、靈活排程、跨域共享,提高IT資源利用率,使IT資源能夠真正成為社會基礎設施,服務於各行各業中靈活多變的應用需求。

0)幾種主要的虛擬化

ESXi是VMware公司研發的虛擬機器伺服器,ESXi已經實現了與Virtual Appliance Marketplace的直接整合,使使用者能夠即刻下載並執行虛擬裝置。這為
即插即用型軟體的交付與安裝提供了一種全新和極其簡化的方式。
通過iso映象(比如VMWare ESXi 5.5.iso)在伺服器上安裝ESXi虛擬化服務,接著在本地PC機(win10)上安裝VMware vSphere Clent客戶端工具去連
接遠端的ESXi伺服器,然後在VMware vSphere Clent工具介面裡進行虛擬機器的建立和管理。
------------------------------------------------------------------------------------------------------------------------------------
XenServer是思傑公司基於Xen的虛擬化伺服器,Citrix XenServer是一種全面而易於管理的伺服器虛擬化平臺,基於強大的Xen Hypervisor程式之上。
通過iso映象(比如XenServer-7.1.1-install-cd.iso)在伺服器上安裝XenServer服務,接著在本地PC機(win10)上安裝Citrix XenCenter客戶端
工具去連線遠端的XenServer伺服器,然後在Citrix XenCenter工具介面裡進行虛擬機器的建立和管理。
------------------------------------------------------------------------------------------------------------------------------------
KVM(Kernel-based Virtual Machine)是一個開源的系統虛擬化模組,自Linux 2.6.20之後整合在Linux的各個主要發行版本中。它使用Linux自身
的排程器進行管理,所以相對於Xen,其核心原始碼很少。KVM目前已成為學術界的主流VMM之一。KVM的虛擬化需要硬體支援(如Intel VT技術或者AMD V技術),
是基於硬體的完全虛擬化。而Xen早期則是基於軟體模擬的Para-Virtualization,新版本則是基於硬體支援的完全虛擬化。但Xen本身有自己的程式排程器,
儲存管理模組等,所以程式碼較為龐大。廣為流傳的商業系統虛擬化軟體VMware ESX系列是基於軟體模擬的Full-Virtualization。

KVM虛擬化部署有以下幾種方法:
方法一:通過自身的virt-manager工具進行虛擬機器的建立和管理
方法二:通過WebVirtMgr工具進行虛擬機器的建立和管理
方法三:通過OpenStack工具進行虛擬機器的建立和管理。

以上三種方法的部署在部落格中都會一一介紹。

1)虛擬化的分類
全虛擬化:直接使用底層的硬體 比如:KVM
半虛擬化:通過一箇中介軟體,來呼叫底層的硬體 比如:xen
平臺虛擬化
硬體虛擬化(Inter vt-x/EPT) (AMD AMD-v /RVI)
軟體虛擬化
桌面虛擬化
應用虛擬化
儲存虛擬化
網路虛擬化
2)虛擬化的優勢
虛擬化可以虛擬出不同的虛擬作業系統。
虛擬機器之間是相互獨立互不影響的。
支援異構。
支援快照、克隆、還原等操作
雲端計算與虛擬化的區別與聯絡

雲端計算與虛擬化的區別與聯絡
1)虛擬化是一種技術,雲端計算是一種使用模式。
2)虛擬化是指將物理的實體,通過軟體模式,形成若干虛擬存在的系統,其實真是運作還是在實體上,只是劃分了若干區域或者時域劃分。
3)雲端計算的基礎是虛擬化,但虛擬化只是雲端計算的一部分,雲端計算其實就是在虛擬化出若干資源池以後的應用,但虛擬化並不是只對應雲端計算的。

KVM虛擬化
KVM是開源軟體,全稱是kernel-based virtual machine(基於核心的虛擬機器)。
KVM是x86架構且硬體支援虛擬化技術(如 intel VT 或 AMD-V)的Linux全虛擬化解決方案。
它包含一個為處理器提供底層虛擬化 可載入的核心模組kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
KVM還需要一個經過修改的QEMU軟體(qemu-kvm),作為虛擬機器上層控制和介面。
KVM能在不改變linux或windows映象的情況下同時執行多個虛擬機器,(它的意思是多個虛擬機器使用同一映象)併為每一個虛擬機器配置個性化硬體環境(網路卡、磁碟、圖形介面卡……)。
1)KVM的優勢
嵌入到Linux的Kernel中 (提高相容性)
程式碼級資源呼叫(提高效能)
虛擬機器就是一個程式
直接支援MUMA技術(NUMA(Non Uniform Memory Access Architecture)技術可以使眾多伺服器像單一系統那樣運轉,同時保留小系統便於程式設計和管理的優點。
2)KVM安裝前提
CPU要支援虛擬化,伺服器上預設一般是開啟的,虛擬機器要自己啟動VT-EPT技術
[root@oldboy-node1 ~]# grep -E "(vmx|svm)" /proc/cpuinfo
Inter處理器對應:VMX
AMD處理器對應:SVM
3)KVM虛擬機器安裝
檢視系統版本
[root@linux-node1~]# cat /etc/redhat-release
CentOSLinux release 7.1.1503 (Core)

安裝KVM相關的元件
[root@oldboy-node1 ~]# yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install
kvm:linux核心中的一個模組,不需要安裝只要載入就行,通過使用者態程式來管理。
qemu:虛擬化軟體,支援多種架構,可擴充套件,可移植
qemu-kvm:使用者態管理KVM,網路卡、音效卡、PCI裝置等的管理
libvirt:是一個虛擬化 API 和虛擬機器(VMs)管理後臺,支援遠端或本地訪問,支援多種虛擬化後端 (QEMU/KVM, VirtualBox, Xen,等等) 。

檢查KVM是否載入
[root@oldboy-node1 ~]# lsmod | grep kvm
kvm_intel 148081 0
kvm 461126 1 kvm_intel

啟動並設定開機啟動libvirt
[root@linux-node1~]# systemctl enable libvirtd.service
[root@linux-node1~]# systemctl start libvirtd.service
[root@oldboy-node1 ~]# systemctl status libvirtd.service

建立虛擬機器
1--虛擬機器的建立命令
–virt-type:指定虛擬機器型別(kvm、qemu、xen)
–name:指定虛擬機器的名稱
–raw:指定記憶體大小
–cpu:指定cpu的核數(預設為1)
–cdrom:指定映象
–disk:指定磁碟路徑(即上文建立的虛擬磁碟)
–network:指定網路類

2--建立硬碟(建立虛擬磁碟,-f指定格式,路徑/opt/CentOS-7.1-x86_64.raw,大小10G)
[root@oldboy-node1 ~]# 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
3--映象的拷貝
[root@oldboy-node1 ~]# dd if=/dev/cdrom of=/opt/CentOS-7.1.iso
4--虛擬機器的建立
[root@oldboy-node1 ~]# virt-install --name CentOS-7.1-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.1.iso --disk path=/opt/CentOS-7.1-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
5--使用VNC連線虛擬機器
使用VNC客戶端連線虛擬機器 物理機的地址:5900 預設是從5900開始,以此類推。也可以通過埠grep vnc檢視。
6--修改網路卡的名稱
因為CentOS7以後,網路卡的命名發生改變。可以在安裝的時候就做出修改

按下Tab鍵,然後在quiet後面新增 net.ifnames=0 biosdevname=0
至此,一臺KVM虛擬機器安裝成功。

KVM的日常應用管理
1--虛擬機器的檢視
# 當前正在執行中的虛擬機器
[root@linux-node1 opt]# virsh list
Id Name State
—————————————————-
1 CentOS-7-x86_64running
# 當前物理機中的所有的虛擬機器
[root@linux-node1 opt]# virsh list --all
也可以在物理機程式中檢視,KVM虛擬機器就是一個KVM程式在執行
2--虛擬機器的開關
關閉虛擬機器
[root@oldboy-node1 ~]# virsh shudown CentOS-7.1-x86_64(主機名)
[root@oldboy-node1 ~]# virsh destroy CentOS-7.1-x86_64(主機名)
開啟虛擬機器
[root@oldboy-node1 ~]# virsh start CentOS-7.1-x86_64
刪除虛擬機器
[root@oldboy-node1 ~]# virsh undefine CentOS-7.1-x86_64
掛起
[root@oldboy-node1 ~]# virsh suspended CentOS-7.1-x86_64
恢復
[root@oldboy-node1 ~]# virsh resume CentOS-7.1-x86_64
3--虛擬機器CPU的擴容
編輯虛擬機器
virsh edit CentOS-7.1-x86_64
# 為了實現CPU的熱新增,就需要更改Cpu的最大值,當然熱新增值不能超過最大值
# 當前為1,自動擴容最大為4
[root@linux-node1 opt]# virsh edit CentOS-7-x86_64
<vcpu placement=’auto’ current=”1″>4</vcpu>
# 熱修改為2個cpu(不知減少),高版本自動啟用
[root@linux-node1 opt]# virsh setvcpus CentOS-7-x86_64 2 –live
# 通過vnc登入KVM虛擬機器檢視是否擴容成功
[root@KVM]# grep processor /proc/cpuinfo |wc -l
# 在建立虛擬機器時指定cpu
[root@linux-node1 ~]# virt-install –help|grep vcpus
–vcpus VCPUS
"""
為虛擬機器配置的 vcpus 數。
例如:
–vcpus 5
–vcpus 5,maxcpus=10,cpuset=1-4,6,8
–vcpus sockets=2,cores=4,threads=2,
"""
4--記憶體熱膨脹和壓縮
# 檢視當前KVM記憶體大小
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7-x86_64 –hmp –cmd info balloon
balloon: actual=1024
# 熱新增600M
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 –hmp –cmd balloon 600
# 在配置檔案中修改
[root@linux-node1 network-scripts]# virsh edit CentOS-7.1-1-x86_64
最大記憶體<memory unit='KiB'>4048576</memory>
當前記憶體<currentMemory unit='KiB'>1048576</currentMemory>
5--硬碟的模式
生產中不建議對線上的伺服器的硬碟進行更改,因此直接不對此贅述。
硬碟格式:
RAW:全映象格式:設定多大就是多大,寫入速度快,可以隨便轉換成其他的格式。效能最優。但是佔用空間大。
QCOW2:稀疏格式:支援寫時拷貝(Cow,copy-on-write)壓縮,快照,映象,更小的儲存空間。(用多少給多少)可選擇基於Zlib的壓縮方式,可以選擇AES加密
建立qcow2和raw檔案
[root@linux-node1 ~]# qemu-img create -f qcow2 test.qcow2 10G
Formatting 'test.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
[root@linux-node1 ~]# qemu-img create -f raw test.raw 10G
Formatting 'test.raw', fmt=raw size=10737418240
空間使用情況對比
[root@linux-node1 ~]# ll -sh test.*
200K -rw-r--r-- 1 qiaoliyong qiaoliyong 193K 5 月 6 10:29 test.qcow2
0 -rw-r--r-- 1 qiaoliyong qiaoliyong 10G 5 月 6 10:28 test.raw
[root@linux-node1 ~]# stat test.raw
檔案:"test.raw"
大小:10737418240 塊:0 IO 塊:4096 普通檔案
[root@linux-node1 ~]# stat test.qcow2
檔案:"test.qcow2"
大小:197120 塊:400 IO 塊:4096 普通檔案

6--網路卡的配置
# 先建立一個虛擬網路卡,名稱為br0(可以看做是一個邏輯網段,也可以看做是一個VLAN名稱)
[root@linux-node1~]# brctl addbr br0
# 檢視網路卡資訊
[root@linux-node1 ~]# brctl show
bridge
name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.5254009f0311 yes virbr0-nic
# 把eth0加入網橋,使用橋接模式,給br0設定ip段,新增路由閘道器,關閉防火牆
[root@linux-node1 ~]# brctl addif br0 eth0 && ip addr del dev eth0 192.168.56.111/24 && ifconfig br0 192.168.56.111/24 up && route add default gw192.168.56.2 && iptables -F
# 檢視網橋的IP
[root@linux-node1~]# ifconfig br0
br0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.56.111 netmask 255.255.255.0 broadcast 192.168.56.255
inet6 fe80::20c:29ff:fe5d:cc27 prefixlen 64scopeid 0x20<link>
ether 00:0c:29:5d:cc:27 txqueuelen 0(Ethernet)
RX packets 4813 bytes 472527 (461.4 KiB)
RX errors 0 dropped 0overruns 0 frame 0
TX packets 2705 bytes 510369 (498.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0collisions 0
# 編輯虛擬機器的網路配置使用br0網橋模式
[root@linux-node1 ~]# virsh edit CentOS-7-x86_64
<interface type=’bridge’>        #虛擬機器網路連線方式
<mac address=’52:54:00:22:04:0f’/>        #為虛擬機器分配MAC地址,務必唯一,如果是dhcp獲得同樣IP會引起衝突
<source bridge=’br0’/>        #當前主機網橋名稱
# 重啟虛擬機器
# 關閉KVM虛擬機器
[root@linux-node1 opt]# virsh shutdown CentOS-7-x86_64
Domain CentOS-7-x86_64 is being shutdown
# 啟動KVM虛擬機器
[root@linux-node1 opt]# virsh start CentOS-7-x86_64
Domain CentOS-7-x86_64 started
# 然後配置靜態IP地址,重啟網路卡,即可以通過xshell連線上KVM虛擬機器了。

KVM效能優化
1)CPU的優化
Inter的cpu執行級別,按許可權級別高低Ring3->Ring1->Ring0(Ring2和Ring1暫時不使用)Ring3為使用者態;Ring0為核心態

Ring3的使用者態是沒有許可權管理硬體的,需要切換到核心態Ring0,這樣的切換(系統呼叫)稱為上下文切換,物理機到虛擬機器多次的上下文切換,勢必會導致效能出現問題。對於全虛擬化,inter實現了技術VT-x,在CPU硬體上實現了加速轉換,CentOS7預設是不需要開啟的。
2)CPU快取繫結
[root@linux-node1 ~]# lscpu|grep cache
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K

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 125718(1指的是cpu1,也可以繫結到多個cpu上,25718是指的pid).
cpu繫結的優點:提高效能,20%以上
cpu繫結的缺點:不方便遷移,靈活性差
3)記憶體優化
原本實現方式:
虛擬機器的虛擬記憶體===>虛擬機器的實體記憶體
宿主機的虛擬記憶體===>宿主機的實體記憶體

現在實現方式:EPT(inter)
虛擬機器的虛擬記憶體=====EPT=====宿主機的實體記憶體
VMM通過採用影子列表解決記憶體轉換的問題,影子頁表是一種比較成熟的純軟體的記憶體虛擬化方式,但影子頁表固有的侷限性,影響了VMM的效能,例如,客戶機中有多個CPU,多個虛擬CPU之間同步頁面資料將導致影子頁表更新次數幅度增加,測試頁表將帶來異常嚴重的效能損失。如下圖1-1為影子頁表的原理圖:

在此之際,Inter在最新的Core I7系列處理器上整合了EPT技術(對應AMD的為RVI技術),以硬體輔助的方式完成客戶實體記憶體到機器實體記憶體的轉換,完成記憶體虛擬化,並以有效的方式彌補了影子頁表的缺陷,該技術預設是開啟的,如下圖1-2為EPT技術的原理。

KSM記憶體合併
宿主機上預設會開啟ksmd程式,該程式作為核心中的守護程式存在,它定期執行頁面掃描,識別副本頁面併合並副本,釋放這些頁面以供它用,CentOS7預設是開啟狀態
[root@linux-node1 ~]# ps aux |grep ksmd
root 280 0.0 0.0 0 0 ? SN 20:37 0:00 [ksmd]

大頁記憶體
Linux預設的記憶體頁面大小都是4K,HugePage程式會將預設的每個記憶體頁面可以調整為2M,CentOS7預設開啟的
[root@linux-node1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root@linux-node1 ~]# ps aux|grep hugepage|grep -v grep
root 2810.0 0.0 00 ? SN 04:220:03 [khugepaged]

4)磁碟IO優化
IO排程演算法,也叫電梯演算法,詳情請看趙班長部落格:http://www.unixhot.com/article/4
1--Noop Scheduler:簡單的FIFO佇列,最簡單的排程演算法,由於會產生讀IO的阻塞,一般使用在SSD硬碟,此時不需要排程,IO效果非常好
2--Anticipatory IO Scheduler(as scheduler)適合大資料順序順序儲存的檔案伺服器,如ftp server和web server,不適合資料庫環境,DB伺服器不要使用這種演算法。
3--Deadline Schedler:按照截止時間的排程演算法,為了防止出現讀取被餓死的現象,按照截止時間進行調整,預設的是讀期限短於寫期限,就不會產生餓死的狀況,一般應用在資料庫
4--Complete Fair Queueing Schedule:完全公平的排隊的IO排程演算法,保證每個程式相對特別公平的使用IO
# 檢視本機Centos7預設所支援的排程演算法
[root@linux-node1 ~]# dmesg|grep -i “scheduler”
[ 1.332147] io scheduler noop registered
[ 1.332151] io scheduler deadline registered (default)
[ 1.332190] io scheduler cfq registered
# 臨時更改某個磁碟的IO排程演算法,將deadling模式改為cfq模式
[root@linux-node1 ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
[root@linux-node1 ~]# echo cfq >/sys/block/sda/queue/scheduler
[root@linux-node1 ~]# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
# 使更改的IO排程演算法永久生效,需要更改核心引數
[root@linux-node1 ~]# vim /boot/grub/menu.lst
kernel /boot/vmlinuz-3.10.0-229.el7 ro root=LABEL=/ elevator=deadline rhgb quiet

相關文章