溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行LVM snapshot的分析

發(fā)布時(shí)間:2021-12-01 15:37:59 來(lái)源:億速云 閱讀:151 作者:柒染 欄目:云計(jì)算

本篇文章給大家分享的是有關(guān)如何進(jìn)行LVM snapshot的分析,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

 Logical Volume Manager (LVM)提供了對(duì)任意一個(gè)Logical Volume(LV)做“快照”(snapshot)的功能,以此來(lái)獲得一個(gè)分區(qū)的狀態(tài)一致性備份。

在某一個(gè)狀態(tài)下做備份的時(shí)候,可能有應(yīng)用正在訪問(wèn)某一個(gè)文件或者數(shù)據(jù)庫(kù),這就是使得備份的時(shí)候文件處于一個(gè)狀態(tài),而備份完后,文件卻處于另外一個(gè)狀態(tài),從而造成備份的非一致性,這種狀態(tài)恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)幾乎不會(huì)成功。

狀態(tài)的解決辦法是將其分區(qū)掛載為只讀,然后通過(guò)數(shù)據(jù)庫(kù)的表級(jí)別鎖定(table-level write locks)甚至停止數(shù)據(jù)庫(kù)來(lái)備份數(shù)據(jù)。所有這些方法無(wú)意嚴(yán)重影響了服務(wù)的可用性。使用LVM snapshot既可以獲得一致性備份,又不會(huì)影響服務(wù)器的可用性。

要提醒一點(diǎn)是,snapshot這種方法僅對(duì)LVM有效,對(duì)于非LVM文件系統(tǒng)無(wú)效。

snapshot的實(shí)現(xiàn)有多種方式(參考文章最后的連接),這里說(shuō)說(shuō)LVM中snapshot的“寫時(shí)復(fù)制”(copy on write) 的實(shí)現(xiàn)方法。

當(dāng)一個(gè)snapshot創(chuàng)建的時(shí)候,僅拷貝原始卷里數(shù)據(jù)的元數(shù)據(jù)(meta-data)。創(chuàng)建的時(shí)候,并不會(huì)有數(shù)據(jù)的物理拷貝,因此snapshot的創(chuàng)建幾乎是實(shí)時(shí)的,當(dāng)原始卷上有寫操作執(zhí)行時(shí),snapshot跟蹤原始卷塊的改變,這個(gè)時(shí)候原始卷上將要改變的數(shù)據(jù)在改變之前被拷貝到snapshot預(yù)留的空間里,因此這個(gè)原理的實(shí)現(xiàn)叫做寫時(shí)復(fù)制(copy-on-write)。

在寫操作寫入塊之前,CoW講原始數(shù)據(jù)移動(dòng)到 snapshot空間里,這樣就保證了所有的數(shù)據(jù)在snapshot創(chuàng)建時(shí)保持一致。而對(duì)于snapshot的讀操作,如果是讀取數(shù)據(jù)塊是沒(méi)有修改過(guò)的,那么會(huì)將讀操作直接重定向到原始卷上,如果是要讀取已經(jīng)修改過(guò)的塊,那么就讀取拷貝到snapshot中的塊。

這樣,通常的文件I/0流程有一個(gè)改變,那就是在文件系統(tǒng)和設(shè)備驅(qū)動(dòng)之間增加了一個(gè)cow層,變成了下面這個(gè)樣子:

file I/0 ---> filesystem -- >CoW --> block I /O

下面的圖也許可以比較容易了解CoW的原理:
如何進(jìn)行LVM snapshot的分析

采取CoW實(shí)現(xiàn)方式時(shí),snapshot的大小并不需要和原始卷一樣大,其大小僅僅只需要考慮兩個(gè)方面:從shapshot創(chuàng)建到釋放這段時(shí)間內(nèi),估計(jì)塊的改變量有多大;數(shù)據(jù)更新的頻率。一旦 snapshot的空間記錄滿了原始卷塊變換的信息,那么這個(gè)snapshot立刻被釋放,從而無(wú)法使用,從而導(dǎo)致這個(gè)snapshot無(wú)效。所以,非常重要的一點(diǎn),一定要在snapshot的生命周期里,做完你需要做得事情。當(dāng)然,如果你的snapshot大小和原始卷一樣大,甚至還要大,那它的壽命就是“與天齊壽”了。

snapshot其實(shí)除了備份以外,還有很多其他用途

1)虛擬化

在使用 LVM2 時(shí),快照可以不是只讀的。這意味著,在創(chuàng)建快照之后, 可以像常規(guī)塊設(shè)備一樣掛載和讀寫快照。

因 為流行的虛擬化系統(tǒng)(比如 Xen、VMWare、Qemu 和 KVM)可以將塊設(shè)備用作 guest 映像,所以可以創(chuàng)建這些映像的完整拷貝,并根據(jù)需要使用它們,它們就像是內(nèi)存占用量很低的虛擬機(jī)。這樣做的好處是部署迅速(創(chuàng)建快照的時(shí)間常常不超過(guò)幾秒)和節(jié)省空間(guest 共享原映像的大多數(shù)數(shù)據(jù))。

設(shè)置的步驟如下:

   1. 為原映像創(chuàng)建一個(gè)邏輯卷。
   2. 使用這個(gè) LV 作為磁盤映像安裝 guest 虛擬機(jī)。
   3. 暫停這個(gè)虛擬機(jī)。內(nèi)存映像可以是一個(gè)常規(guī)文件,所有其他快照都放在里面。
   4. 為原 LV 創(chuàng)建一個(gè)可讀寫的快照。
   5. 使用快照卷作為磁盤映像生成一個(gè)新的虛擬機(jī)。如果需要的話,要修改網(wǎng)絡(luò)/控制臺(tái)設(shè)置。
   6. 登錄已經(jīng)創(chuàng)建的虛擬機(jī),修改網(wǎng)絡(luò)設(shè)置/主機(jī)名。 

完成這些步驟之后, 就可以讓用戶訪問(wèn)剛創(chuàng)建的虛擬機(jī)了。如果需要另一個(gè)虛擬機(jī),那么只需重復(fù)步驟 4 到 6(所以不需要重新安裝虛擬機(jī))。還可以用一個(gè)腳本自動(dòng)執(zhí)行這些步驟。

在使用完虛擬機(jī)之后, 可以停止虛擬機(jī)并銷毀快照。

2)數(shù)據(jù)回溯

在一個(gè)生產(chǎn)系統(tǒng)上要執(zhí)行一些操作,需要慎之又慎,即便在模擬環(huán)境中做過(guò)很多次測(cè)試都沒(méi)有問(wèn)題,但是并不能保證在生產(chǎn)環(huán)境就一定成功,于是這個(gè)時(shí)候,我們把系統(tǒng)做一個(gè)snapshot,這樣一旦新操作出現(xiàn)問(wèn)題,立刻回溯到創(chuàng)建snapshot的時(shí)間點(diǎn),當(dāng)然你也可以認(rèn)為這是一個(gè)備份的擴(kuò)展使用。

最后,我們舉一些例子,加深對(duì)snapshot的理解。

a) 創(chuàng)建一個(gè)20M的snapshot,執(zhí)行一些操作看看CoW的動(dòng)作。

我們舉一個(gè)例子來(lái)說(shuō)明如何創(chuàng)建和使用snapshot。我們假定創(chuàng)建一個(gè)120M的snapshot,這就意味著在snapshot生命周期里,你僅能有120M的數(shù)據(jù)量改變。

下面的命令,為/dev/vg/lvdata創(chuàng)建/dev/vg/lvdata-sp


# lvcreate -L20M -s -n lvdata-sp /dev/vg/lvdata

Logical volume "lvdata-sp">


其中l(wèi)vdata大小為120MB。


# lvdisplay /dev/vg/lvdata-sp

--- Logical volume ---

LV Name /dev/vg/lvdata-sp

VG Name vg

LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0

LV Write Access read/write

LV snapshot status active destination for /dev/vg/lvdata

LV Status available

# open 1

LV Size 200.00 MB

Current LE 50

COW-table size 20.00 MB

COW-table LE 5

Allocated to snapshot 0.27%

Snapshot chunk size 8.00 KB

Segments 1

Allocation inherit

Read ahead sectors 0

Block device 253:0


上面的 Allocated to snapshot 0.27%是我們關(guān)心的,表示目前還有99.73%的空間沒(méi)有使用。

我們嘗試在lvdata創(chuàng)建一個(gè)10M的文件,再看看這個(gè)參數(shù)值。


# mount /dev/vg/lvdata /media/lvdata/
# dd if=/dev/hda of=/media/lvdata/10M bs=1M count=10

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 0.272393 seconds, 38.5 MB/s

# lvdisplay /dev/vg/lvdata-sp

--- Logical volume ---

LV Name /dev/vg/lvdata-sp

VG Name vg

LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0

LV Write Access read/write

LV snapshot status active destination for /dev/vg/lvdata

LV Status available

# open 0

LV Size 200.00 MB

Current LE 50

COW-table size 20.00 MB

COW-table LE 5

Allocated to snapshot 51.02%

Snapshot chunk size 8.00 KB

Segments 1

Allocation inherit

Read ahead sectors 0

Block device 253:0


”Allocated to snapshot 51.02%“,符合我們的預(yù)期。此時(shí)snapshot還剩下大概10M不到的空間了,如果我么再在lvdata上創(chuàng)建一個(gè)12M的文件,會(huì)發(fā)生什么呢?


#dd if=/dev/hda of=/media/lvdata/12M bs=1M count=12

12+0 records in

12+0 records out

12582912 bytes (13 MB) copied, 0.288311 seconds, 43.6 MB/s

device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception.


創(chuàng)建文件的過(guò)程中,一個(gè)報(bào)錯(cuò)出現(xiàn)了,snapshot已經(jīng)無(wú)效。我們看看snapshot卷的詳細(xì)信息。


# lvdisplay /dev/vg/lvdata-sp

/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 輸入/輸出錯(cuò)誤

--- Logical volume ---

LV Name /dev/vg/lvdata-sp

VG Name vg

LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0

LV Write Access read/write

LV snapshot status INACTIVE destination for /dev/vg/lvdata

LV Status available

# open 0

LV Size 200.00 MB

Current LE 50

COW-table size 20.00 MB

COW-table LE 5

Snapshot chunk size 8.00 KB

Segments 1

Allocation inherit

Read ahead sectors 0


整個(gè)snapshot卷已經(jīng)出現(xiàn)I/0錯(cuò)誤了,而且snapshot的狀態(tài)也是“INACTIVE”。

是否能掛載上來(lái)呢?


# mount /dev/vg/lvdata-sp /media/snapshot/

mount: you must specify the filesystem type

#dmesg

Buffer I/O error on device dm-0, logical block 0

Buffer I/O error on device dm-0, logical block 1

Buffer I/O error on device dm-0, logical block 2

Buffer I/O error on device dm-0, logical block 3

Buffer I/O error on device dm-0, logical block 4

Buffer I/O error on device dm-0, logical block 5

Buffer I/O error on device dm-0, logical block 6

Buffer I/O error on device dm-0, logical block 7

Buffer I/O error on device dm-0, logical block 8

Buffer I/O error on device dm-0, logical block 9

hfs: unable to find HFS+ superblock


從dmesg的錯(cuò)誤信息來(lái)看,超級(jí)塊的信息也丟失了

嘗試激活一下lvdata-sp


# lvchange -ay /dev/vg/lvdata-sp

/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 輸入/輸出錯(cuò)誤


恩,這個(gè)snapshot已經(jīng)被釋放了,所以剩下要做得事情就是刪除它。


# lvremove /dev/vg/lvdata-sp

/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 輸入/輸出錯(cuò)誤

Do you really want to remove active logical volume "lvdata-sp"? [y/n]: y

Logical volume "lvdata-sp" successfully removed



b)利用snapshot在線備份MySQL數(shù)據(jù)庫(kù)(或者其他數(shù)據(jù)庫(kù))

流程是先做一個(gè)flush操作,并鎖定表,任何創(chuàng)建snapshot,任何解鎖,然后備份數(shù)據(jù),最后釋放snapshot。這樣,MySQL幾乎不會(huì)中斷其運(yùn)行。


FLUSH TABLES WITH READ LOCK;

\! lvcreate --size 100m --snapshot --name snap /dev/VolGroup01/LogVol00

UNLOCK TABLES;


接著做一些備份的工作


mkdir /snap

mount /dev/VolGroup01/snap /snap

# This is where you back up whatever you need from /snap, e.g. rsync(1)

umount /snap

lvremove /dev/VolGroup01/snap

rmdir /snap

以上就是如何進(jìn)行LVM snapshot的分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI