Compreendendo o uso de SNAPSHOTs em unidades LVM

Olá pessoal,

Ha algum tempo atrás (ha um ano talvez) venho utilizando LVM2 para quase tudo. Este “cara” é simplesmente fantástico. Mas para muitos pode ficar algumas perguntas (que eu me fiz umas 400 vezes) …

Como funciona a utilização do espaço reservado para um SNAPSHOT de unidades LVM? Porque temos que informar um tamanho para esta “foto”? Em fim…

O tamanho que informamos no comando de criação de um SNAPSHOT (lvcreate -LXX{M,G,T…} -s /dev/VGNAME/LVNAME) é a quantidade de physical extents (PE, ou tamanho em Mb, Gb, etc) que reservamos no VG da unidade LVM para que seja armazenado os metadados das alterações que são sofridas na unidade LVM após a criação do SNAP.

Exemplo:Se temos uma LV de 1024MBytes e criamos um SNAPSHOT de 300MBytes, e esta unidade de 1024MBytes sofrer alteração total de 300MBytes nosso SNAP aparecerá com 100% de uso. A partir deste momento já não se garante mais a integridade dos dados fotografados, pois o SNAPSHOT não possui mais recursos para armazenar os metadados.

Um teste mais interessante:

De uma LV de 50Gb, cria-se um SNAP de 500Mb:

[root@vostrolab2 ~]# lvcreate -L500M -s /dev/vg01/home -n home-SNAP
Logical volume “home-SNAP” created

Resultado:

[root@vostrolab2 ~]# lvs
LV                   VG   Attr         LSize      Origin   Snap%  Move Log Copy%  Convert

home              vg01 owi-ao  50.00G                        
home-SNAP vg01 swi-a-    500.00M  home    00.04

Vamos criar uma alteração na LV e observar o comportamento do SNAP:

[root@vostrolab2 ~]# dd if=/dev/urandom of=/home/arquivinho-teste.dd bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 31.5512 s, 6.6 MB/s

Depois de 5 segundos podemos observar que o SNAP terá sua porcentagem de uso alterada:

[root@vostrolab2 ~]# lvs
LV                   VG   Attr         LSize        Origin Snap%  Move Log Copy%  Convert

home              vg01 owi-ao  50.00G
home-SNAP vg01 swi-a-    500.00M home    40.45

Então:

Regrinha de 3 pra entender os 40,45% de uso do SNAP:

500M ——- 100%
216M ——- X
216 * 100 / 500 = ~42%  =D

E se o SNAP atingir o seu limite de uso…?

Ai meu amigo, reza…  vamos ao lab2:

Crio a LV com 500M,  crio o filesystem ext3 e monto em /cialinux:

[root@vostrolab2 /]# lvcreate -L500M vg01 -n cialinux
Logical volume “cialinux” created
[root@vostrolab2 /]# mkfs.ext3 /dev/vg01/cialinux
[root@vostrolab2 /]# mount /dev/vg01/cialinux /cialinux

Resultado:

[root@vostrolab2 /]# df -h /cialinux
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg01-cialinux
485M   11M  449M   3% /cialinux

Vamos usar 40Mb dela:

[root@vostrolab2 /]# dd if=/dev/urandom of=/cialinux/file1.dd bs=1M count=40
40+0 records in
40+0 records out
41943040 bytes (42 MB) copied, 6.73183 s, 6.2 MB/s
[root@vostrolab2 /]#
[root@vostrolab2 /]# df -h /cialinux
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg01-cialinux
485M   51M  409M  11% /cialinux

Criamos um SNAP e montamos ele para comprovar que está integro e acessível:

[root@vostrolab2 /]# lvcreate -L40M -s /dev/vg01/cialinux -n cialinux-snap
Logical volume “cialinux-snap” created
[root@vostrolab2 /]#
[root@vostrolab2 /]# lvs
LV            VG   Attr   LSize   Origin   Snap%  Move Log Copy%  Convert
cialinux      vg01 owi-ao 500.00M
cialinux-snap vg01 swi-a-  40.00M cialinux   0.03

[root@vostrolab2 /]# mount /dev/vg01/cialinux-snap /cialinux-snap/
[root@vostrolab2 /]#
[root@vostrolab2 /]# df -h /cialinux*
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg01-cialinux
485M   51M  409M  11% /cialinux
/dev/mapper/vg01-cialinux–snap
485M   51M  409M  11% /cialinux-snap

Agora, ao exceder o tamanho de alocação do SNAP (40Mb) com um arquivo de 50Mb, podemos observar a utilização de 100% do espaço reservado ao SNAP no VG01, e como consequência a perda da integridade do SNAP:

[root@vostrolab2 /]# umount /cialinux-snap/
[root@vostrolab2 /]#
[root@vostrolab2 /]# dd if=/dev/urandom of=/cialinux/arquivo-teste2.dd bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 8.27271 s, 6.3 MB/s
[root@vostrolab2 /]#
[root@vostrolab2 /]# lvs
LV            VG   Attr   LSize   Origin                   Snap%  Move Log Copy%  Convert
cialinux      vg01 owi-ao 500.00M
cialinux-snap vg01 Swi-I-  40.00M cialinux 100.00
home          vg01 -wi-ao  50.00G
[root@vostrolab2 /]#
[root@vostrolab2 /]#
[root@vostrolab2 /]# mount /dev/vg01/cialinux-snap /cialinux-snap/
mount: you must specify the filesystem type
[root@vostrolab2 /]#

Com estes testes concluímos que toda e qualquer alteração de bits na unidade LVM é automaticamente adicionada ao espaço reservado para o SNAPSHOT. Com base nisso, temos sempre que saber a frequência com que a unidade LVM sofre alterações, caso tenhamos como intenção manter o SNAP por muito tempo.

Assim sendo, podemos realizar um lvresize na unidade reservada ao SNAP, para aumentar em +${x}Mb a sua área de alocação, e salvar algumas peles se necesário…  =)   Vamos ao lab3:

[root@vostrolab2 ~]# rm -rf /cialinux/*

[root@vostrolab2 ~]# lvremove -f /dev/vg01/cialinux-snap

[root@vostrolab2 ~]# dd if=/dev/urandom of=/cialinux/arquivo.file bs=1M count=200

[root@vostrolab2 ~]# lvcreate -L40M -s /dev/vg01/cialinux -n cialinux-snap
Logical volume “cialinux-snap” created

[root@vostrolab2 ~]# dd if=/dev/urandom of=/cialinux/arquivo.file bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 3.64283 seconds, 5.8 MB/s

[root@vostrolab2 ~]# lvs
LV                           VG   Attr   LSize   Origin                   Snap%  Move Log Copy%  Convert
cialinux                     vg01   owi-ao 500.00M
cialinux-snap                vg01   swi-a-  40.00M cialinux                  50.69

Chegamos a 50% de uso do SNAP. Para não chegar aos 100%, vamos aumentar a área de alocação do SNAP em +200M:

[root@vostrolab2 ~]# lvresize -L +200M /dev/vg01/cialinux-snap
Extending logical volume cialinux-snap to 240.00 MB
Logical volume cialinux-snap successfully resized

[root@vostrolab2 ~]# lvs
LV                           VG   Attr   LSize   Origin                   Snap%  Move Log Copy%  Convert
cialinux                     vg01   owi-ao 500.00M
cialinux-snap                vg01   swi-a- 240.00M cialinux                   8.46

É isso, um post um pouco cansativo, porém pode esclarecer inúmeras dúvidas… Toda e qualquer sugestão/correção será muito bem vinda…

Por: Franklin Moretti

Referências:

testes

man lvcreate

man dd

man lvremove

man lvresize

Alguns termos usados

LV = Logical Volume

LVM = Logical Volume Manager

VG = Volume Group

9 thoughts on “Compreendendo o uso de SNAPSHOTs em unidades LVM

  1. Boa tarde,

    Fiquei com algumas dúvidas.

    1º – Vamos supor que possua um LVMRAIZ para a partição /. Então crio um LVMRAIZ-SNAP. Depois faço um upgrade do SO, mas alguns pacotes estão com problema, se eu remover o LVMRAIZ-SNAP, meu SO volta para a versão anterior?
    # lvcreate -L10G vg01 -n LVMRAIZ
    # lvcreate -L40M -s /dev/vg01/LVMRAIZ -n LVMRAIZ-SNAP
    # yum -y upgrade
    # lvremove /dev/vg01/LVMRAIZ-SNAP

    2º Imagine o mesmo cenário acima, mas não ocorreu nenhum problema na atualização do SO. Neste caso eu gostaria de consolidar os dados gravados LVMRAIZ-SNAP para LVMRAIZ e então remover o LVMRAIZ-SNAP.
    Qual seria o comando?

    1. Oi Alan, obrigado pela leitura.
      Entendi suas dúvidas. São dois pontos bem práticos.
      Essas duas perguntas da pra responder com uma simulação pequena, como fiz no POST.

      Como faz anos que não mecho com LVM, estou até sem VG criado aqui. Então vou criar aqui e logo posto aqui pra vc o resultado.

      Att,

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *