Azure的VM的設(shè)計(jì)中,Disk相關(guān)的設(shè)計(jì)是非常重要的一個內(nèi)容,本文將介紹Azure上的VM的Disk相關(guān)的一些最佳實(shí)踐和一些小的技巧。
一、Azure VM中Disk的存儲賬戶設(shè)計(jì)
1. Storage類型的選擇
Azure VM的Disk服務(wù)是Azure Storage中blob存儲服務(wù)中的Page Blob。Azure的Storage服務(wù)的種類有:
目前,國內(nèi)還只有LRS、GRS和RA-GRS三種模式。由于LRS的Ingress和Egress的吞吐量比GRS都要大(請參考下面Storage Account的limitation表格),因此如果存儲賬戶是用做VM的Disk,除非有特殊用途,建議采用LRS的模式。
2. Storage Account的名字的設(shè)計(jì)
Storage Account Name是Storage Account的標(biāo)識。具體Storage Account在后臺的邏輯拓?fù)浣Y(jié)構(gòu)如下:
而Storage Account的負(fù)載均衡是通過Storage Account實(shí)現(xiàn)的。不同的Storage Account Name通過DNS解析,到不同的Storage Stamp。因此Storage Account Name的選擇在某種程度上會影響Disk的性能。這主要是因?yàn)椋?/p>
a. Azure存儲使用分區(qū)(Partition)的方案來擴(kuò)展和負(fù)載平衡。
就是說,一部分Storage Account在一個分區(qū)內(nèi),有可能多個Storage Account解析出來的IP地址都是一個,就是說這些Storage Account在一個分區(qū)內(nèi)。而分區(qū)的劃分是基于'鍵'的。而鍵是由Storage Account Name來決定的。如果客戶選擇Storage Account的名字比較相似,比如:msftpayroll, msftperformance, msftemployees,或者帶時間戳的:log20160101, log20160102, log20160102,這些Storage Account有可能都被分配到同一個partition下。
b. Azure的partition是可以動態(tài)調(diào)整的。
Azure Storage有自動Balance的功能,當(dāng)某一個Container的負(fù)載過高時,系統(tǒng)會自動進(jìn)行負(fù)載的調(diào)整,實(shí)現(xiàn)負(fù)載均衡。但這個調(diào)整的過程中,存儲的調(diào)用等的時延會增加。
c. 基于上面的討論,建議在存儲賬戶的設(shè)計(jì)時,就考慮這些因素。
最佳實(shí)踐是:仔細(xì)檢查帳戶、容器、blob的命名約定。應(yīng)該考慮使用散列函數(shù)給某些帳戶名稱前添加3位散列值。比如:5sx-msftpayroll, 79h-msftperformance, n2a-msftemployees,如果企業(yè)命名規(guī)定中必須使用時間戳或數(shù)字標(biāo)識,建議不要采用簡單的前綴添加或后綴添加,這樣有可能使所有訪問集中到一個Partition上。如果采用時間,建議采用ssmmhh的模式,或在時間前加3位散列值。如果采用數(shù)字標(biāo)識,建議在數(shù)字標(biāo)識前加3位散列值,比如:jha-log20160101, a9g-log20160102, i76-log20160102。在linux bash里,可以通過下面的命令實(shí)現(xiàn)隨機(jī)數(shù):
cat /proc/sys/kernel/random/uuid | md5sum |cut -b 1-3
或者
echo $(date +%t%N)$RANDOM | md5sum | cut -b 1-3
3. Storage Account的高可用設(shè)計(jì)
如果創(chuàng)建的Storage Account主要是用于VM Disk使用的,那在Storage Account的設(shè)計(jì)中,高可用性變的至關(guān)重要。根據(jù)這幾年Azure項(xiàng)目中碰到的問題,建議的最佳實(shí)踐是:
a. VM的Disk分散到不同的Storage Account
一般會把Web、APP的VM Disk分成兩組,分別放到Left和Right兩個Storage Account。這樣萬一當(dāng)有一個Storage Account出現(xiàn)故障時,不會影響所有的VM。另外對于DB的Disk,建議一個DB VM的Disk放到一個存儲賬戶中,如圖所示。
b. 同一層VM的Disk放到不同的Storage Account
在a中提到的部署模式下,如果客戶的VM數(shù)量比較多,這樣部署也存在問題:有可能會hit到Storage Account的性能上限,這時會出現(xiàn)VM重啟或無法啟動的情況,這點(diǎn)在后面會介紹。為了避免這種問題建議將Storage Account再細(xì)分,部署如下:
每一組VM分兩個Storage Account,盡量將Disk分散部署。
4. Storage Account的容量設(shè)計(jì)
每個Storage Account都有各種指標(biāo)的限制,與Disk相關(guān)的具體如下:
Resource | Default Limit |
Number of storage accounts per subscription | 200 |
TB per storage account | 500 TB |
Max size of a page blob | 1 TB |
Total Request Rate (assuming 1 KB object size) per storage account | Up to 20,000 IOPS, entities per second, or messages per second |
Target throughput for single blob | Up to 60 MB per second, or up to 500 requests per second |
Max ingress2 per storage account (European and Asian Regions) | 5 Gbps if GRS/ZRS3 enabled, 10 Gbps for LRS |
Max egress2 per storage account (European and Asian Regions) | 10 Gbps if RA-GRS/GRS/ZRS3 enabled, 15 Gbps for LRS |
其中每個Storage Account最大20,000個IOPS。而每個普通Disk的IOPS是500 IOPS。所以當(dāng)一個Storage Account的Disk超過40個時(40*500 IOPS=20,000 IOPS),VM會出現(xiàn)重啟或者不能啟動的情況。
因此建議在每個Storage Account里的Disk的數(shù)量不要超過20個。由于Storage Account的數(shù)量相對比較大,而且沒有費(fèi)用產(chǎn)生,因此在有大量VM的情況下,建議多開Storage Account,以減少每個Storage Account中Disk的數(shù)量。
二、Azure VM中Disk掛載的一些技巧
在物理機(jī)環(huán)境下,Disk在Linux系統(tǒng)中的序號是以這塊盤加入VM的順序決定的。當(dāng)Azure VM重新啟動時,如果VM掛載了多塊盤,由可能出現(xiàn)磁盤名稱改變的情況。如果在/etc/fstab中掛載采用的是/dev/sdx的方式,有可能出現(xiàn)掛載錯誤,造成應(yīng)用不能使用的情況。
解決這個問題的方法有兩種:
1.采用在/etc/fstab中采用uuid進(jìn)行掛載的方式
在完成fdisk和mkfs后,查看分區(qū)的uuid:
[root@hwvpntestcentos by-uuid]# pwd/dev/disk/by-uuid[root@hwvpntestcentos by-uuid]# lltotal 0lrwxrwxrwx. 1 root root 10 Feb 7 08:35 4357d916-ea92-49eb-b52e-250bb5ff9e15 -> ../../sdc1lrwxrwxrwx. 1 root root 10 Feb 7 08:33 73115bac-e4f6-4ec4-ab84-c203352ca8f6 -> ../../sdb1lrwxrwxrwx. 1 root root 10 Feb 7 08:33 feab1e37-ed03-4d4f-9734-4d4de8590e34 -> ../../sda1
/etc/fstab的配置如下:
# /etc/fstab# Created by anaconda on Thu Oct 27 14:05:24 2016## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#UUID=feab1e37-ed03-4d4f-9734-4d4de8590e34 / xfs defaults 0 0UUID=4357d916-ea92-49eb-b52e-250bb5ff9e15 /disk1 ext4 defaults 0 0
掛載fstab中定義的分區(qū):
[root@hwvpntestcentos by-uuid]# mount -a[root@hwvpntestcentos by-uuid]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 30G 1.3G 29G 5% /devtmpfs 1.7G 0 1.7G 0% /devtmpfs 1.7G 0 1.7G 0% /dev/shmtmpfs 1.7G 8.3M 1.7G 1% /runtmpfs 1.7G 0 1.7G 0% /sys/fs/cgroup/dev/sdb1 133G 61M 126G 1% /mnt/resourcetmpfs 345M 0 345M 0% /run/user/1000/dev/sdc1 9.8G 37M 9.2G 1% /disk1
2.采用lvm邏輯卷的方式掛載
lvm分三步:
pvcreate:[root@hwvpntestcentos dev]# pvcreate /dev/sdcPhysical volume '/dev/sdc' successfully created[root@hwvpntestcentos dev]# pvcreate /dev/sddPhysical volume '/dev/sdd' successfully created[root@hwvpntestcentos dev]# pvsPV VG Fmt Attr PSize PFree/dev/sdc lvm2 --- 10.00g 10.00g/dev/sdd lvm2 --- 10.00g 10.00g[root@hwvpntestcentos dev]# pvdisplay'/dev/sdc' is a new physical volume of '10.00 GiB'--- NEW Physical volume ---PV Name /dev/sdcVG NamePV Size 10.00 GiBAllocatable NOPE Size 0Total PE 0Free PE 0Allocated PE 0PV UUID TdVhKK-TDgM-wH52-a9Yd-fXuS-vWRf-6XpvE8 '/dev/sdd' is a new physical volume of '10.00 GiB'--- NEW Physical volume ---PV Name /dev/sddVG NamePV Size 10.00 GiBAllocatable NOPE Size 0Total PE 0Free PE 0Allocated PE 0PV UUID vZB460-GBeB-tgtX-6HGD-BTNY-e0nO-zqnTcU
vgcreate:
[root@hwvpntestcentos dev]# vgcreate data-vg /dev/sdc /dev/sddVolume group 'data-vg' successfully created[root@hwvpntestcentos dev]# vgsVG #PV #LV #SN Attr VSize VFreedata-vg 2 0 0 wz--n- 19.99g 19.99g[root@hwvpntestcentos dev]# vgdisplay--- Volume group ---VG Name data-vgSystem IDFormat lvm2Metadata Areas 2Metadata Sequence No 1VG Access read/writeVG Status resizableMAX LV 0Cur LV 0Open LV 0Max PV 0Cur PV 2Act PV 2VG Size 19.99 GiBPE Size 4.00 MiBTotal PE 5118Alloc PE / Size 0 / 0Free PE / Size 5118 / 19.99 GiBVG UUID iCYHkh-jnPS-6YVT-ox6y-VT2s-vH2P-mCy6fZ
lvcreate:
[root@hwvpntestcentos dev]# lvcreate -i 2 -I 1024 -l 5118 -n data-lv data-vgLogical volume 'data-lv' created.[root@hwvpntestcentos dev]# lvsLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertdata-lv data-vg -wi-a----- 19.99g[root@hwvpntestcentos dev]# lvdisplay--- Logical volume ---LV Path /dev/data-vg/data-lvLV Name data-lvVG Name data-vgLV UUID 39jXWa-ncvE-Qz8X-aSKg-1n4o-7uVa-1VxGQELV Write Access read/writeLV Creation host, time hwvpntestcentos, 2017-02-07 08:48:05 +0000LV Status available# open 0LV Size 19.99 GiBCurrent LE 5118Segments 1Allocation inheritRead ahead sectors auto- currently set to 8192Block device 253:0
其中-i表示采用Raid0的方式實(shí)現(xiàn)磁盤的邏輯卷。此時在/dev/data-vg中存在data-lv的邏輯卷:
[root@hwvpntestcentos data-vg]# pwd/dev/data-vg[root@hwvpntestcentos data-vg]# lltotal 0lrwxrwxrwx. 1 root root 7 Feb 7 08:48 data-lv -> ../dm-0
對這個邏輯卷進(jìn)行格式化:
mkfs.ext4 /dev/data-vg/data-lv
編輯/etc/fstab
# /etc/fstab# Created by anaconda on Thu Oct 27 14:05:24 2016## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#UUID=feab1e37-ed03-4d4f-9734-4d4de8590e34 / xfs defaults 0 0/dev/data-vg/data-lv /disk1 ext4 defaults 0 0
進(jìn)行掛載:
[root@hwvpntestcentos data-vg]# vim /etc/fstab[root@hwvpntestcentos data-vg]# mount -a[root@hwvpntestcentos data-vg]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 30G 1.3G 29G 5% /devtmpfs 1.7G 0 1.7G 0% /devtmpfs 1.7G 0 1.7G 0% /dev/shmtmpfs 1.7G 8.3M 1.7G 1% /runtmpfs 1.7G 0 1.7G 0% /sys/fs/cgroup/dev/sdb1 133G 61M 126G 1% /mnt/resourcetmpfs 345M 0 345M 0% /run/user/1000/dev/mapper/data--vg-data--lv 20G 45M 19G 1% /disk1
這種情況下,底層disk的磁盤再如何變化,磁盤掛載不會出現(xiàn)問題。