1. 程式人生 > >Azure Linux Disk 的設計與部署

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.系統支援核心搶佔這種情況下,自旋鎖加鎖僅僅是禁止了核心搶佔