Azure Linux Disk 的設計與部署
魏衡,微軟雲資深架構師,國內 Azure 最早的架構師之一。
Azure的VM設計中,Disk相關的設計是非常重要的一個內容,本文將介紹Azure上的VM Disk相關的一些最佳實踐和一些小的技巧。
一、Azure VM中Disk的儲存賬戶設計
1. Storage型別的選擇
Azure VM的Disk服務是Azure Storage中blob儲存服務中的Page Blob。Azure的Storage服務的種類有:
目前,國內還只有LRS、GRS和RA-GRS三種模式。由於LRS的Ingress和Egress的吞吐量比GRS都要大(請參考下面Storage Account的limitation表格),因此如果儲存賬戶是用做VM的Disk,除非有特殊用途,建議採用LRS的模式。
2. Storage Account的名字的設計
Storage Account Name是Storage Account的標識。具體Storage Account在後臺的邏輯拓撲結構如下:
而Storage Account的負載均衡是通過Storage Account實現的。不同的Storage Account Name通過DNS解析,到不同的Storage Stamp。因此Storage Account Name的選擇在某種程度上會影響Disk的效能。這主要是因為:
a. Azure儲存使用分割槽(Partition)的方案來擴充套件和負載平衡。
就是說,一部分Storage Account在一個分割槽內,有可能多個Storage Account解析出來的IP地址都是一個,就是說這些Storage Account在一個分割槽內。而分割槽的劃分是基於“鍵”的。而鍵是由Storage Account Name來決定的。如果客戶選擇Storage Account的名字比較相似,比如:msftpayroll, msftperformance, msftemployees,或者帶時間戳的:log20160101, log20160102, log20160102,這些Storage Account有可能都被分配到同一個partition下。
b. Azure的partition是可以動態調整的。
Azure Storage有自動Balance的功能,當某一個Container的負載過高時,系統會自動進行負載的調整,實現負載均衡。但這個調整的過程中,儲存的呼叫等的時延會增加。
c. 基於上面的討論,建議在儲存賬戶的設計時,就考慮這些因素。
最佳實踐是:仔細檢查帳戶、容器、blob的命名約定。 應該考慮使用雜湊函式給某些帳戶名稱前新增3位雜湊值。比如:5sx-msftpayroll, 79h-msftperformance, n2a-msftemployees,如果企業命名規定中必須使用時間戳或數字標識,建議不要採用簡單的字首新增或字尾新增,這樣有可能使所有訪問集中到一個Partition上。如果採用時間,建議採用ssmmhh的模式,或在時間前加3位雜湊值。如果採用數字標識,建議在數字標識前加3位雜湊值,比如:jha-log20160101, a9g-log20160102, i76-log20160102。
3. Storage Account的高可用設計
如果建立的Storage Account主要是用於VM Disk使用的,那在Storage Account的設計中,高可用性變的至關重要。根據這幾年Azure專案中碰到的問題,建議的最佳實踐是:
a. VM的Disk分散到不同的Storage Account
一般會把Web、APP的VM Disk分成兩組,分別放到Left和Right兩個Storage Account。這樣萬一當有一個Storage Account出現故障時,不會影響所有的VM。另外對於DB的Disk,建議一個DB VM的Disk放到一個儲存賬戶中,如圖所示。
b. 同一層VM的Disk放到不同的Storage Account
在a中提到的部署模式下,如果客戶的VM數量比較多,這樣部署也存在問題:有可能會hit到Storage Account的效能上限,這時會出現VM重啟或無法啟動的情況,這點在後面會介紹。為了避免這種問題建議將Storage Account再細分,部署如下:
每一組VM分兩個Storage Account,儘量將Disk分散部署。
4. Storage Account的容量設計
每個Storage Account都有各種指標的限制,與Disk相關的具體如下:
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。所以當一個Storage Account的Disk超過40個時(40*500 IOPS=20,000 IOPS),VM會出現重啟或者不能啟動的情況。
因此建議在每個Storage Account裡的Disk的數量不要超過20個。由於Storage Account的數量相對比較大,而且沒有費用產生,因此在有大量VM的情況下,建議多開Storage Account,以減少每個Storage Account中Disk的數量。
二、Azure VM中Disk掛載的一些技巧
在物理機環境下,Disk在Linux系統中的序號是以這塊盤加入VM的順序決定的。當Azure VM重新啟動時,如果VM掛載了多塊盤,由可能出現磁碟名稱改變的情況。如果在/etc/fstab中掛載採用的是/dev/sdx的方式,有可能出現掛載錯誤,造成應用不能使用的情況。
解決這個問題的方法有兩種:
1.採用在/etc/fstab中採用uuid進行掛載的方式
在完成fdisk和mkfs後,檢視分割槽的uuid:
[[email protected] by-uuid]# pwd
/dev/disk/by-uuid
[[email protected] by-uuid]# ll
total 0
lrwxrwxrwx. 1 root root 10 Feb 7 08:35 4357d916-ea92-49eb-b52e-250bb5ff9e15 -> ../../sdc1
lrwxrwxrwx. 1 root root 10 Feb 7 08:33 73115bac-e4f6-4ec4-ab84-c203352ca8f6 -> ../../sdb1
lrwxrwxrwx. 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 0
UUID=4357d916-ea92-49eb-b52e-250bb5ff9e15 /disk1 ext4 defaults 0 0
掛載fstab中定義的分割槽:
[[email protected] by-uuid]# mount -a
[[email protected] by-uuid]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 30G 1.3G 29G 5% /
devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs 1.7G 0 1.7G 0% /dev/shm
tmpfs 1.7G 8.3M 1.7G 1% /run
tmpfs 1.7G 0 1.7G 0% /sys/fs/cgroup
/dev/sdb1 133G 61M 126G 1% /mnt/resource
tmpfs 345M 0 345M 0% /run/user/1000
/dev/sdc1 9.8G 37M 9.2G 1% /disk1
2.採用lvm邏輯卷的方式掛載
lvm分三步:
pvcreate:
[[email protected] dev]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created
[[email protected] dev]# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created
[[email protected] dev]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdc lvm2 --- 10.00g 10.00g
/dev/sdd lvm2 --- 10.00g 10.00g
[[email protected] dev]# pvdisplay
"/dev/sdc" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV 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/sdd
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID vZB460-GBeB-tgtX-6HGD-BTNY-e0nO-zqnTcU
vgcreate:
[[email protected] dev]# vgcreate data-vg /dev/sdc /dev/sdd
Volume group "data-vg" successfully created
[[email protected] dev]# vgs
VG #PV #LV #SN Attr VSize VFree
data-vg 2 0 0 wz--n- 19.99g 19.99g
[[email protected] dev]# vgdisplay
--- Volume group ---
VG Name data-vg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 0 / 0
Free PE / Size 5118 / 19.99 GiB
VG UUID iCYHkh-jnPS-6YVT-ox6y-VT2s-vH2P-mCy6fZ
lvcreate:
[[email protected] dev]# lvcreate -i 2 -I 1024 -l 5118 -n data-lv data-vg
Logical volume "data-lv" created.
[[email protected] dev]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data-lv data-vg -wi-a----- 19.99g
[[email protected] dev]# lvdisplay
--- Logical volume ---
LV Path /dev/data-vg/data-lv
LV Name data-lv
VG Name data-vg
LV UUID 39jXWa-ncvE-Qz8X-aSKg-1n4o-7uVa-1VxGQE
LV Write Access read/write
LV Creation host, time hwvpntestcentos, 2017-02-07 08:48:05 +0000
LV Status available
# open 0
LV Size 19.99 GiB
Current LE 5118
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0其中-i表示採用Raid0的方式實現磁碟的邏輯卷。
此時在/dev/data-vg中存在data-lv的邏輯卷:
[[email protected] data-vg]# pwd
/dev/data-vg
[[email protected] data-vg]# ll
total 0
lrwxrwxrwx. 1 root root 7 Feb 7 08:48 data-lv -> ../dm-0
對這個邏輯捲進行格式化:
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
進行掛載:
[[email protected] data-vg]# vim /etc/fstab
[[email protected] data-vg]# mount -a
[[email protected] data-vg]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 30G 1.3G 29G 5% /
devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs 1.7G 0 1.7G 0% /dev/shm
tmpfs 1.7G 8.3M 1.7G 1% /run
tmpfs 1.7G 0 1.7G 0% /sys/fs/cgroup
/dev/sdb1 133G 61M 126G 1% /mnt/resource
tmpfs 345M 0 345M 0% /run/user/1000
/dev/mapper/data--vg-data--lv 20G 45M 19G 1% /disk1這種情況下,底層disk的磁碟再如何變化,磁碟掛載不會出現問題。
立即訪問http://market.azure.cn
相關推薦
Azure Linux Disk 的設計與部署
魏衡,微軟雲資深架構師,國內 Azure 最早的架構師之一。 Azure的VM設計中,Disk相關的設計是非常重要的一個內容,本文將介紹Azure上的VM Disk相關的一些最佳實踐和一些小的技巧。 一、Azure VM中Disk的儲存賬戶設計 1. Storage
【讀書筆記】《Linux核心設計與實現》程序管理與程序排程
大學跟老師做嵌入式專案,寫過I2C的裝置驅動,但對Linux核心的瞭解也僅限於此。Android系統許多導致root的漏洞都是核心中的,研究起來很有趣,但看相關的分析文章總感覺隔著一層窗戶紙,不能完全理會。所以打算系統的學習一下Linux核心。買了兩本書《Linux核心設計與實現(第3版)》和《深入理解Lin
Linux核心設計與實現(1)--核心開發的特點
1. 核心程式設計時既不能訪問C庫也不能訪問標準的C標頭檔案 其中的原因有很多種。其一,C標準庫的很多函式實現都是基於核心實現的,這核心編譯的時候都還沒有核心,所以就不存在這些函式,這個就是先有雞還是先有蛋這個悖論。其二,其主主要的的
Linux核心設計與實現 總結筆記(第二章)
一、Linux核心中的一些基本概念 核心空間:核心可獨立於普通應用程式,它一般處於系統態,擁有受保護的記憶體空間和訪問硬體裝置的所有許可權。這種系統態和被保護起來的記憶體空間,稱為核心空間。 程序上下文:當應用程式執行一條系統呼叫,通過系統呼叫執行在核心空間,而核心被稱為執行在程序上下文中。  
Linux核心設計與實現 總結筆記(第五章)系統呼叫
系統呼叫 核心提供了使用者程序和核心互動的介面,使得應用程式可以受限制的訪問硬體裝置。 提供這些介面主要是為了保證系統穩定可靠,避免應用程式恣意妄行。 一、核心通訊 系統呼叫在使用者空間程序和硬體裝置之間新增中間才能。作用有三: 為使用者空間提供一種硬體的抽象介面。無需理會物理
Linux核心設計與實現 總結筆記(第六章)核心資料結構
核心資料結構 Linux核心實現了這些通用資料結構,而且提倡大家在開發時重用。 核心開發者應該儘可能地使用這些資料結構,而不要自作主張的山寨方法。 通用的資料結構有以下幾種:連結串列、佇列、對映和二叉樹 一、連結串列 1.1 單向連結串列和雙向連結串列 1.2 環形
後容器時代技術制高點:API管理平臺3Scale的架構設計與部署[轉]
前言 時至今日,相信大多數人已經相信容器可以承載生產的應用了,就像當年大多數人相信vSphere虛擬化承載生產的過程一樣;歷史總是在重演,IT技術的更新總是很快,而作為IT技術人員,順應趨勢是非常重要的。我們當然可以固守已有的知識領域,並以此為生計,但這並不妨礙我們學習新技術、學習開源。
linux下安裝與部署redis
一、Redis介紹 Redis是當前比較熱門的NOSQL系統之一,它是一個key-value儲存系統。和Memcache類似,但很大程度補償了Memcache的不足,它支援儲存的value型別相對更多,包括string、list、set、zset和hash。這些資料型別都支援push/pop、add/rem
《Linux核心設計與實現》 讀書筆記
linux核心簡介 Linux系統的基礎是核心,C庫(庫函式裡會有些系統呼叫),工具集和系統的基本工具。 通常一個核心由負責響應中斷的中斷服務程式,負責管理多個程序從而分享處理器時間的排程程式,負責管理程序地址空間的記憶體管理程式,和網路、程序間通訊等系統服務程
Linux核心設計與實現 原書第3版中文版pdf
下載地址:網盤下載內容簡介編輯《Linux核心設計與實現(原書第3版)》基於Linux 2.6.34核心詳細介紹了Linux核心系統,覆蓋了從核心核心系統的應用到核心設計與實現等各方面的內容。《Linux核心設計與實現(原書第3版)》主要內容包括:程序管理、程序排程、時間管理和
例項:tasklet實現軟中斷(學習《Linux核心設計與實現》記錄)
tasklet是通過軟中斷實現的,tasklet本身也是軟中斷。 關於tasklet更詳細的知識,還是建議看一下《Linux核心設計與實現》 本貼子只介紹一下具體的流程。 驅動程式原始碼: #include <linux/init.h> #include <linu
例項:基於4412-實現新增自己的系統呼叫函式(學習《Linux核心設計與實現》 記錄)
學習筆記: 在學習《linux核心設計與實現》過程中,瞭解到: 在Linux中,系統呼叫是使用者空間訪問核心的唯一手段(除異常和陷入之外)。 系統呼叫主要有三個作用: ①:為使用者空間提供一個硬體的抽象介面。 ②:系統呼叫保證了系統的穩定和安全。 ③:為了實現多工和虛擬記憶體(應用程
4.Linux核心設計與實現 P31---淺析程序終結關鍵do_exit(轉)
程序在退出時,必須釋放它所擁有的資源,並通過某種方式告訴父程序。程序的退出一般是顯示或隱式地呼叫了eixt(),或者接受了某種訊號。不過什麼原因退出,最終都呼叫了do_exit。用於程序退出的系統呼叫有兩個exit和exit_group,exit只是終止某個程序,而exit_group整個執行緒中的程序。它們
6.Linux核心設計與實現 P57---系統呼叫(轉)
在Linux中,系統呼叫是使用者空間訪問核心的唯一手段,它們是核心唯一的合法入口。實際上,其他的像裝置檔案和/proc之類的方式,最終也還是要通過系統呼叫進行的。 一般情況下,應用程式通過應用程式設計介面(API)而不是直接通過系統呼叫來程式設計,而且這種程式設計介面實際上並不需要和核心提供的系統
7.Linux核心設計與實現 P69---深入分析 Linux 核心連結串列(轉)
連結串列是一種常用的組織有序資料的資料結構,它通過指標將一系列資料節點連線成一條資料鏈,是線性表的一種重要實現方式。相對於陣列,連結串列具有更好的動態性,建立連結串列時無需預先知道資料總量,可以隨機分配空間,可以高效地在連結串列中的任意位置實時插入或刪除資料。連結串列的開銷主要是訪問的順序性和組織鏈的空間
5.Linux核心設計與實現 P39---linux2.6 CFS排程演算法分析(轉)
1.概述 CFS(completely fair schedule)是最終被核心採納的排程器。它從RSDL/SD中吸取了完全公平的思想,不再跟蹤程序的睡眠時間,也不再企圖區分互動式程序。它將所有的程序都統一對待,這就是公平的含義。CFS的演算法和實現都相當簡單,眾多的測試表明其效能也非常優越。
11.Linux核心設計與實現 P160---順序鎖總結 (轉)
當使用讀/寫自旋鎖時,核心控制路徑發出的執行read_lock或write_lock操作的請求具有相同的優先權:讀者必須等待,直到寫操作完成。同樣地,寫者也必須等待,直到讀操作完成。Linux 2.6中引入了順序鎖(seqlock),它與讀/寫自旋鎖非常相似,只是它為寫者賦予了較高的優先順序:事實上,即使在讀
8.Linux核心設計與實現 P77---list_for_each()與list_for_each_safe()的區別 (轉)
list_for_each()的定義: /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop counter. * @head: the hea
9.Linux核心設計與實現 P91---中斷和中斷處理程式 (轉)
中斷還是中斷,我講了很多次的中斷了,今天還是要講中斷,為啥呢?因為在作業系統中,中斷是必須要講的.. 那麼什麼叫中斷呢, 中斷還是打斷,這樣一說你就不明白了。唉,中斷還真是有點像打斷。我們知道linux管理所有的硬體裝置,要做的第一件事先是通訊。然後,我們天天在說一句話:處理器的速度跟
10.Linux核心設計與實現 P148---自旋鎖總結 (轉)
自旋鎖可分為用在單核處理器上和用在多核處理器上。單核處理器:用在單核處理器上,又可分為兩種:1.系統不支援核心搶佔此時自旋鎖什麼也不做,確實也不需要做什麼,因為單核處理器只有一個執行緒在執行,又不支援核心搶佔,因此資源不可能會被其他的執行緒訪問到。2.系統支援核心搶佔這種情況下,自旋鎖加鎖僅僅是禁止了核心搶佔