彈性空間之道,Linux的邏輯卷管理技術(shù)
基于硬盤構(gòu)建的RAID通常提供固定大小的存儲(chǔ)空間。管理員在初期規(guī)劃的存儲(chǔ)空間很難適應(yīng)業(yè)務(wù)的變化。如下圖所示,部署初期可能三個(gè)業(yè)務(wù)所需要的存儲(chǔ)空間大致相同,但隨著運(yùn)營的進(jìn)行,應(yīng)用2突然變成比較火爆,存儲(chǔ)空間被快速使用,從而導(dǎo)致存儲(chǔ)資源不夠的風(fēng)險(xiǎn)。而應(yīng)用1和應(yīng)用3則不溫不火,存儲(chǔ)資源有很多浪費(fèi)。
那么有沒有一種技術(shù)可以動(dòng)態(tài)的調(diào)整存儲(chǔ)資源的大小,可以保證在業(yè)務(wù)需要數(shù)據(jù)量大的時(shí)候能夠擴(kuò)容,業(yè)務(wù)需要數(shù)據(jù)量減小的時(shí)候可以進(jìn)行縮容?通過存儲(chǔ)資源的動(dòng)態(tài)調(diào)配,保證各個(gè)應(yīng)用的存儲(chǔ)空間有一定的空閑率,這樣既保證了存儲(chǔ)資源利用率,又避免單個(gè)應(yīng)用存儲(chǔ)資源耗盡的風(fēng)險(xiǎn)。
目前市面上的企業(yè)級(jí)存儲(chǔ)系統(tǒng)都是具備這個(gè)功能的,在存儲(chǔ)端稱為LUN的擴(kuò)容與縮容。如果我們的業(yè)務(wù)沒有使用企業(yè)級(jí)存儲(chǔ),那就要借助主機(jī)端的軟件來實(shí)現(xiàn)。在Linux操作系統(tǒng)中也有類似的功能,稱為邏輯卷管理技術(shù)(Logical Volume Manager,簡稱LVM)。
LVM的邏輯架構(gòu)和原理都比較簡單,如下圖是LVM涉及的主要概念及相互關(guān)系。最底層是我們的存儲(chǔ)設(shè)備,通常是硬盤。當(dāng)然,也可以是基于企業(yè)級(jí)存儲(chǔ)映射過來的LUN。如果想使用LVM的功能,首先需要基于硬盤創(chuàng)建的物理卷,然后基于物理卷來創(chuàng)建卷組,最后在卷組上創(chuàng)建邏輯卷。
創(chuàng)建物理卷的過程相當(dāng)于對(duì)硬盤進(jìn)行了一個(gè)簡單的格式化,此后,硬盤中會(huì)包含一些元數(shù)據(jù)信息,例如PE(Physical Extent)和UUID的信息。基于物理卷可以創(chuàng)建卷組,卷組可以理解為一個(gè)包含所有PE的大池子(Pool)。而后,在該卷組上就可以創(chuàng)建邏輯卷了,邏輯卷根據(jù)創(chuàng)建是的特性來使用卷組中的物理卷。組成邏輯卷的基本單元稱為LE(Logical Extent),LE與PE有一定的對(duì)應(yīng)關(guān)系,具體關(guān)系與邏輯卷的類型有關(guān),我們后面會(huì)詳細(xì)介紹。
基于上圖,我們從下往上簡要介紹一下LVM涉及的主要概念,希望大家能夠?qū)VM能夠有更加深入的理解。
- 物理卷(Physical Volume, PV):物理卷構(gòu)建在塊設(shè)備之上,這些塊設(shè)備可以是機(jī)械硬盤、SSD、硬盤分區(qū)或者RAID。物理卷其實(shí)是在塊設(shè)備上做了一個(gè)簡單的格式化,在塊設(shè)備的指定位置寫入了一些元數(shù)據(jù)信息(后文會(huì)詳細(xì)介紹這部分內(nèi)容)。
- 物理塊(Physical Extent, PE):物理卷被劃分為若干個(gè)物理塊,默認(rèn)物理塊的大小是4MB。物理塊是LVM管理的最小數(shù)據(jù)單元。
- 卷組(Volume Group, VG): 卷組是一個(gè)抽象層,可以理解為企業(yè)級(jí)存儲(chǔ)的存儲(chǔ)池的概念,
- 邏輯卷(Logical Volume, LV):邏輯卷是提供給用戶使用的卷,邏輯卷提供一個(gè)連續(xù)的線性空間,邏輯卷的空間來自物理卷。
- 邏輯塊(Logical Extent, LE): 邏輯塊是邏輯卷的最小組成單元,邏輯塊的大小在創(chuàng)建卷組時(shí)確定。任何一個(gè)邏輯卷都是由若干個(gè)邏輯塊構(gòu)成。
創(chuàng)建一個(gè)簡單的邏輯卷
接下來我們實(shí)例來進(jìn)一步理解一下上述概念,我們會(huì)通過創(chuàng)建不同類型的邏輯卷來理解上述關(guān)系。為了能夠?qū)崿F(xiàn)上述操作,我們總共需要4塊硬盤,每個(gè)硬盤大小為1GB。大多數(shù)電腦可能不能滿足這個(gè)要求,我們可以通過虛擬機(jī)來完成操作實(shí)驗(yàn)。
首先需要基于硬盤來創(chuàng)建物理卷,創(chuàng)建物理卷很簡單,我們可以通過如下命令創(chuàng)建一個(gè)物理卷。
pvcreate /dev/sdb
這里面我們沒有使用額外的選項(xiàng),直接在一個(gè)硬盤上創(chuàng)建了一個(gè)物理卷,是不是很簡單!我們可以通過pvdisplay命令來看一下物理卷的詳細(xì)信息,具體如下圖所示。可以看到里面包含PE的大小、數(shù)量和剩余數(shù)量等信息,另外還包括一個(gè)UUID,這個(gè)UUID用于唯一表示這個(gè)物理卷。
我們這里一共準(zhǔn)備了4塊硬盤, 分別在其他3塊硬盤(sdc、sdd和sde)執(zhí)行相同的命令即可。完成物理卷的創(chuàng)建后,我們就可以創(chuàng)建卷組了,執(zhí)行如下命令可以創(chuàng)建一個(gè)卷組。
vgcreate vg_test /dev/sdb /dev/sdc /dev/sdd /dev/sde
類似的,我們可以通過vgdisplay命令來查看卷組的詳細(xì)信息。由于沒有提供額外的參數(shù),創(chuàng)建卷組命令使用的是默認(rèn)參數(shù)。通過詳細(xì)信息可以看出PE的大小是4MB,卷組的大小是3.98GB。卷組的大小之所以不是4GB是因?yàn)樵獢?shù)據(jù)占用了部分空間。每個(gè)硬盤大小是1GB,因此有255個(gè)PE,整個(gè)卷組有1020個(gè)PE。
卷組創(chuàng)建成功后,我們?cè)倏匆幌挛锢砭淼脑敿?xì)信息。可以看到PE相關(guān)信息得到了更新。其中PE的大小是4MB,數(shù)量為255,而且包含所屬卷組的信息。
卷組創(chuàng)建成功后,我們就可以基于卷組來創(chuàng)建邏輯卷了。我們這里創(chuàng)建一個(gè)最簡單的邏輯卷---線性卷。線性卷中的LE與物理卷中的PE有一對(duì)一的線性對(duì)應(yīng)關(guān)系。我們可以很容易的根據(jù)線性卷的偏移地址找到物理卷中的PE。如下命令是創(chuàng)建一個(gè)大小為100MB的線性卷。
lvcreate -L100 -n testlv vg_test
通過lvdisplay可以查看邏輯卷的詳細(xì)信息,可以看到該邏輯卷有25個(gè)LE。25個(gè)4MB的LE構(gòu)成了邏輯卷100MB的邏輯空間。
完成邏輯卷的創(chuàng)建后,我們?cè)倏匆幌挛锢砭淼脑敿?xì)信息。可以看到sdb上使用了25個(gè)PE。消耗的PE的數(shù)量與邏輯卷的LE的數(shù)量是一致的,也就是說邏輯卷的LE與物理卷的PE有一一對(duì)應(yīng)的關(guān)系。
在數(shù)據(jù)層面,此時(shí)邏輯卷的數(shù)據(jù)與物理卷的對(duì)應(yīng)關(guān)系如下圖所示。邏輯卷的25個(gè)LE與物理卷sdb的前25個(gè)PE對(duì)應(yīng),位置也是一致的。有興趣的同學(xué)可以進(jìn)一步做一些實(shí)驗(yàn),比如向邏輯卷0、4M和8M偏移的地方分別寫一些數(shù)據(jù),然后在從物理卷對(duì)應(yīng)的位置讀取數(shù)據(jù),以判斷對(duì)應(yīng)關(guān)系。需要注意的是,由于物理卷上有一些元數(shù)據(jù),這些元數(shù)據(jù)會(huì)占用一些空間,所以PE的起始位置是1MB的地方,而非0。
對(duì)邏輯卷擴(kuò)容
前文已述,邏輯卷的最重要的特性之一就是卷的容量可以動(dòng)態(tài)調(diào)整。我們可以通過lvextend命令對(duì)邏輯卷擴(kuò)容。通過下面命令可以將邏輯卷testlv擴(kuò)容成200MB,此時(shí)該邏輯卷具有50LE,使用了50個(gè)PE。
lvextend --size 200 /dev/vg_test/testlv
大家可以再查看一下物理卷sdb的詳情,可以看到此時(shí)已分配的PE的數(shù)量變成了50。該命令不僅僅可以在原有的物理卷擴(kuò)容,也可以指定目的物理卷,比如下面命令:
lvextend --size 200 /dev/vg_test/testlv /dev/sdc
此時(shí),新增加的100MB的容量所對(duì)應(yīng)的PE是在sdc上面。整個(gè)邏輯卷與兩個(gè)物理卷之間數(shù)據(jù)的對(duì)應(yīng)關(guān)系如下圖所示。其中邏輯卷的綠色部分的LE在物理卷sdb上,紫色部分的LE在物理卷sdc上面。
LVM的其他操作
除了上述的線性卷外,LVM還有很多其他特性,比如鏡像卷、RAID卷和快照等特性。限于篇幅,本文不再一一贅述。這里以鏡像卷為例再深入介紹一下。為了驗(yàn)證簡單,我們?cè)诮酉聛淼牟僮髦皩⑶懊娴倪壿嬀韯h除。
lvremove /dev/vg_test/testlv
接下來以鏡像卷為例再深入介紹一下LVM的相關(guān)內(nèi)容。所謂鏡像卷,是指邏輯卷的數(shù)據(jù)會(huì)被同時(shí)放置到多個(gè)物理卷上。以兩個(gè)物理卷的鏡像卷為例,邏輯卷中的LE與物理卷PE之間的關(guān)系如下圖所示。比如LE0的數(shù)據(jù)會(huì)同時(shí)存儲(chǔ)在物理卷sdb的PE1和物理卷sdc的PE1上面。另外需要注意的是,LE0不一定對(duì)應(yīng)著PE1,而是跟物理卷可以使用的PE相關(guān)。
我們實(shí)際操作一下,創(chuàng)建一個(gè)鏡像卷。具體操作非常簡單,命令如下所示:
lvcreate -L 100 -m1 -n m_lv vg_test /dev/sdb /dev/sdc
在上述命令中-L用于指定邏輯卷的大小,-m1表示創(chuàng)建一個(gè)鏡像卷,-n用于指定邏輯卷的名稱。后面跟的兩個(gè)物理卷表示鏡像卷將創(chuàng)建在著兩個(gè)物理卷上。創(chuàng)建完成后,我們可以通過lvdisplay命令查看一下鏡像卷的詳情。
通過上圖可以看出,邏輯卷占用的LE是25個(gè),具備一個(gè)段(Segments)空間。大家可能會(huì)好奇,邏輯卷與物理卷的對(duì)應(yīng)關(guān)系是怎么確定的?這部分內(nèi)容我們后續(xù)會(huì)詳細(xì)介紹,這里暫時(shí)不做介紹。
我們通過pvdisplay再看一下物理卷的詳細(xì)信息,需要關(guān)注的是這里消耗的PE的數(shù)量是26,而非25。也就是說比邏輯卷的空間多使用了一個(gè)PE的空間。大家可以考慮一下為什么會(huì)多消耗一個(gè)PE。
至此,我們對(duì)LVM的做了一個(gè)簡要的介紹,包括LVM中涉及的主要概念,邏輯卷的擴(kuò)容和邏輯卷與物理卷的映射關(guān)系等。后面我們會(huì)步步深入,介紹LVM的更多細(xì)節(jié)。