1、快照的工做原理html
所謂快照就是將當時的系統數據記錄下來,在將來如有數據變更,則會將變動前的數據放入快照區進行保存。咱們可理解爲快照就是給系統拍了一張照片,記錄當時系統在拍快照的狀態。只不過現實生活中的照片是沒有辦法將如今的生活還原到照片的時候,而Linux系統裏LVM快照是能夠的。從上面的闡述能夠了解到,被作快照的邏輯卷是分紅了兩個部分,一部分是數據沒有改動前的和數據變動後的。它是怎麼工做的呢?在咱們給系統作快照的前提是,系統上基於LVM管理的,且快照和邏輯卷必須是在同一卷組上;在咱們給LVM管理的系統上作快照卷的時候,快照不能夠給多個邏輯卷一塊兒作,它是一個邏輯卷對應一個快照卷,不能夠多個邏輯卷對應一個快照卷。快照是一次性使用,還原了快照,隨之快照就失效,消失。接下來講說原理吧。快照是特殊的邏輯卷,它之因此要和被作快照的邏輯卷一個卷組是由於它在生成快照時,它是和LV共享不少PE的區塊,所以快照必須同LV同一個卷組中。之因此叫快照,就是由於它快嘛,它爲何快,這就要和它的工做原理有密切的關係了,快照生成時,實際上它不是去拷貝原LV裏的數據,它只是分配咱們指定大小的空間,在原LV上的數據發生變化時,這個時候快照會把發生改變的數據先拷貝到快照區,這樣一來快照就只是存放着被修改以前的數據。這樣就起到了備份修改數據的做用,修改後的數據就存放在原LV上。若是有一天咱們須要還原快照,這個時候快照就會和先有的LV作合併,快照裏面存放修改以前的數據,快照和現有LV作合併時,快照上的數據會覆蓋現有LV上數據,這樣一來就實現了把數據還原到拍快照當時的狀態。這裏須要注意一點的是快照只是覆蓋改變後的數據,沒有作改變的數據它是不會去覆蓋的。因此快照使用事後它就沒有任何意義,它不能夠再次記錄恢復後數據的變化前的數據。在作快照的時候咱們還須要注意其快照的大小,快照指定的空間大小不要過小,過小可能裝不小變化前的數據,致使快照失效,固然空間也不宜太大,太大浪費空間沒有意義,空間超過原LV大小,其實也是沒有意義的,它最大空間就是和原LV大小相等,因此在作快照時,咱們須要評估大概有多少的數據在發生變化,避免空間太小致使快照失效。node
2、快照的實現sql
1)查看現有邏輯卷所在卷組空間是否足夠建立快照centos
[root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert xxx test -wi-a----- 12.00g [root@test-centos7-node1 ~]# vgdisplay test --- Volume group --- VG Name test System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 51 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size <29.98 GiB PE Size 8.00 MiB Total PE 3837 Alloc PE / Size 1536 / 12.00 GiB Free PE / Size 2301 / <17.98 GiB VG UUID 31vxAP-L5jb-8Yxm-25m2-LdD0-ee8R-sdTjum [root@test-centos7-node1 ~]#
說明:這是已經建立好邏輯卷的系統上查看的,有關邏輯卷的管理請參考http://www.javashuo.com/article/p-udlkdzkr-m.html,能夠看到還有17個G處於空閒狀態bash
2)針對現有邏輯卷建立快照服務器
[root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618304 46591620 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8792 1923860 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt [root@test-centos7-node1 ~]# ls hellodb_innodb.sql test [root@test-centos7-node1 ~]# [root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618304 46591620 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8792 1923860 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt [root@test-centos7-node1 ~]# ls /mnt fstab inittab lost+found [root@test-centos7-node1 ~]# vgdisplay --- Volume group --- VG Name test System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 51 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 3 Act PV 3 VG Size <29.98 GiB PE Size 8.00 MiB Total PE 3837 Alloc PE / Size 1536 / 12.00 GiB Free PE / Size 2301 / <17.98 GiB VG UUID 31vxAP-L5jb-8Yxm-25m2-LdD0-ee8R-sdTjum [root@test-centos7-node1 ~]# lvcreate -L 1G -n lv_xxx_snap -p r -s /dev/test/xxx Logical volume "lv_xxx_snap" created. [root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_xxx_snap test sri-a-s--- 1.00g xxx 0.01 xxx test owi-aos--- 12.00g [root@test-centos7-node1 ~]#
說明:建立快照和建立其餘邏輯卷的命令是同樣的,都是用lvcreate 其中-s就是指定建立的邏輯卷爲快照 -p 指定其快照屬性 r 表示只讀屬性 最後要跟上對那個邏輯卷作快照,固然咱們指定被作快照的邏輯對應設備的路徑,系統就可以分辨出快照該建立到那個VG上,因此咱們這裏是可不指定VG的名稱的app
[root@test-centos7-node1 ~]# lvdisplay /dev/test/lv_xxx_snap --- Logical volume --- LV Path /dev/test/lv_xxx_snap LV Name lv_xxx_snap VG Name test LV UUID ZjBpYF-2fg6-n6Wz-ehJd-Zagv-lg3y-HFmHjz LV Write Access read only LV Creation host, time test-centos7-node1, 2020-01-11 03:18:29 -0500 LV snapshot status active destination for xxx LV Status available # open 0 LV Size 12.00 GiB Current LE 1536 COW-table size 1.00 GiB COW-table LE 128 Allocated to snapshot 0.01% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3 [root@test-centos7-node1 ~]#
說明:咱們建立好快照,可用lvdisplay 指定快照對應設備路徑來查看快照的詳情,這個同查看邏輯卷的詳情用法一致。能夠看到該快照是用於xxx 邏輯卷的快照性能
3)建立掛載目錄掛載快照ui
[root@test-centos7-node1 ~]# mkdir /snap [root@test-centos7-node1 ~]# mount /dev/test/lv_xxx_snap /snap mount: /dev/mapper/test-lv_xxx_snap is write-protected, mounting read-only [root@test-centos7-node1 ~]# ls /snap/ fstab inittab lost+found [root@test-centos7-node1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 46G 1.6G 45G 4% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.7M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 2.0G 135M 1.9G 7% /boot tmpfs 378M 0 378M 0% /run/user/0 /dev/mapper/test-xxx 9.8G 37M 9.2G 1% /mnt /dev/mapper/test-lv_xxx_snap 9.8G 37M 9.2G 1% /snap [root@test-centos7-node1 ~]#
說明:掛載上快照,咱們發現快照的大小和被作快照的大小是一致的,使用量什麼的都是一致的,上面不是說快照裏面存放的是被修改前的數據嗎,怎麼有數據了呢,這是由於咱們看到快照裏面的數據不是快照自己的數據,是共享其原LV裏的數據,因此咱們是能夠看到的,之因此能看到是系統把原有的LV數據鏡像到快照裏,讓咱們感受裏面是有東西的,就是告訴咱們快照作好了,別擔憂。這裏須要注意一點,若是原LV的文件系統上xfs文件系統,掛載的時候可能出現掛載不上的狀況,緣由是快照的UUID和原LV的UUID相同,xfs的文件系統默認掛載選項會檢查UUID,若是衝突它會不讓你掛載的,這個時候咱們掛載須要指定其選項不檢查UUID ,用 mount -o 來指定其掛載選項 nouuid 表示掛載不檢查uuid;本人是把LV的文件系統格式化成ext4,因此掛載的時候沒有加選項是能夠掛載上去的;若是建立快照時沒有指定爲只讀屬性,那麼掛載的時候建議你們加上掛載選項爲只讀,這樣掛載上的快照才能不被修改的可能。this
4)修改原LV裏的文件,看看快照卷裏的文件是否有更改
[root@test-centos7-node1 ~]# cat /mnt/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # 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=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]# cat /snap/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # 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=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]# echo "this is test file " > /mnt/fstab [root@test-centos7-node1 ~]# cat /mnt/fstab this is test file [root@test-centos7-node1 ~]# cat /snap/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # 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=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]#
說明:發現沒有咱們修改原LV裏的數據後,快照裏邊的對應的文件內容沒有發生變化,因此快照裏邊永遠保存的是作快照那一刻的數據狀態狀況,中間怎麼修改它都只保存最老的版本,LV裏面保存最新版本的狀態,這裏須要提醒的是快照雖然有備份的效果,可是它不能代替備份,若是vg懷了,那麼邏輯卷和快照都將失效。
3、快照還原
1) 取消邏輯卷和快照的掛載
[root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618368 46591556 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8776 1923876 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt /dev/mapper/test-lv_xxx_snap 10190100 36896 9612536 1% /snap [root@test-centos7-node1 ~]# umount /mnt [root@test-centos7-node1 ~]# umount /snap/ [root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618368 46591556 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8776 1923876 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 [root@test-centos7-node1 ~]#
說明:還原就是把快照和原LV合併,因此二者都必須是處於非掛載的狀態
2)合併邏輯卷和快照,進行數據還原
[root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_xxx_snap test sri-a-s--- 1.00g xxx 0.01 xxx test owi-a-s--- 12.00g [root@test-centos7-node1 ~]# lvconvert --merge /dev/test/lv_xxx_snap Merging of volume test/lv_xxx_snap started. test/xxx: Merged: 100.00% [root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert xxx test -wi-a----- 12.00g [root@test-centos7-node1 ~]#
說明:合併快照和邏輯卷後,快照的的使命就完成了,固然快照也就沒有存在的意義,系統會把快照給刪除掉,在centos6上作合併是可看到刪除快照成功的提示。咱們指定合併的快照就能夠了,由於快照裏記錄了原LV是哪個,因此合併時不用在指定其原LV
3)掛載LV 查看數據
[root@test-centos7-node1 ~]# mount /dev/test/xxx /mnt [root@test-centos7-node1 ~]# ls /mnt fstab inittab lost+found [root@test-centos7-node1 ~]# cat /mnt/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # 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=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]#
說明:能夠看到fstab文件已經還原到被修改前的狀態。這種方式是利用快照,還原到原有LV裏,若是須要還原到其餘LV裏 這個時候就需先要把快照裏的東西給備份出來,而後再複製給到其餘LV裏便可,固然這種方式就不是利用快照來還原,它的本質就是文件複製到另外的地方,和快照沒有關係。快照只是記錄快照生成時的數據狀態,生產中建議利用快照來記錄快照生成當時的數據狀態,而後在把快照掛載到系統上,而後慢慢拷貝數據進行備份,拷貝完後刪除快照。通常狀況快照不易在系統上生存太長時間,時間越長,影響磁盤的I/O寫入,可能影響服務器的性能。建議把快照裏的數據拷完就刪除快照。