terça-feira, 25 de outubro de 2011

Desvendando o snapshot da VMware

                 

Já li algumas vezes que o snapshot seria uma cópia do ‘.vmdk’ de uma máquina virtual feita num determinado momento, e que poderíamos voltá-la a qualquer momento, porém, pesquisando um pouco mais sobre, podemos ver que não trata-se exatamente de uma cópia. O que acontece na verdade é que quando fazemos um snapshot de uma VM estamos redirecionando todas as operações de escrita em disco do ‘-flat.vmdk’ original da VM para um novo arquivo ‘-delta.vmdk’, no qual todas as alterações realizadas a partir do momento em que o snapshot foi feito serão armazenadas. O disco virtual original passa a ser utilizado somente para leitura.

Antes de aprofundarmos no assunto snapshot precisamos entender como funciona o acesso ao disco de uma máquina virtual. Para cada disco de uma máquina virtual existem dois arquivos relacionados, um é pequeno e serve para definir a geometria do disco (número de cilindros, setores e cabeças) de forma que a BIOS da VM saiba como utilizar o disco. O outro é aonde os dados são efetivamente armazenados. Este disco pode ser visto como uma matriz de blocos:

FIGURA 1
Na imagem abaixo podemos ver claramente a diferença entre os dois arquivos, apesar de ambos terem a extensão ‘.vmdk’, repare que o arquivo no qual os dados são efetivamente armazenados possui também a expressão ‘-flat’ junto ao seu nome.

FIGURA 2
É nesse arquivo ‘-flat.vmdk’ que ocorrem as operações de I/O (leitura e escrita) da máquina virtual, portanto quando fazemos um snapshot, este arquivo passa a ser utilizado apenas para leitura e um outro arquivo é criado para armazenar as alterações que são feitas após a criação do snapshot.

FIGURA 3
Com a criação do snapshot dois novos arquivos são criados para cada disco da máquina virtual. A lógica é a mesma para os discos originais, ou seja, um arquivo armazena as configurações do disco (.vmdk) e o outro armazena os dados em si (-delta.vmdk).

FIGURA 4
O arquivo ‘-delta.vmdk’ funciona como um arquivo de log, ou seja, ele cresce a medida que alterações vão sendo feitas na máquina virtual. O tamanho inicial deste arquivo é de 16MB, e ele cresce nessa mesma proporção. Por isso não podemos dizer que o snapshot é uma cópia do disco virtual original da VM. Quando alteramos algum bloco no ‘.vmdk’ da VM esta alteração é aplicada no arquivo ‘-delta.vmdk’. Se este mesmo bloco for alterado novamente, apenas uma atualização é feita no arquivo do snapshot. Dessa forma podemos afirmar que o tamanho máximo que um arquivo ‘-delta.vmdk’ pode atingir é o mesmo do ‘.vmdk ‘ original. A velocidade com que este arquivo vai crescer depende da quantidade de escrita em disco que a VM produz.

Quando mais de um snapshot é criado numa máquina virtual, novos arquivos ‘-delta.vmdk’ são criados e o arquivo ‘-delta.vmdk’ anterior se torna somente leitura. Cada arquivo ‘-delta.vmdk’ pode atingir o mesmo tamanho do arquivo ‘-flat.vmdk’ original daVM.

FIGURA 5
Além do arquivo ‘-delta.vmdk’, existem outros arquivos que estão relacionados com a utilização de ‘snapshots’:

*.vmsd – este arquivo é utilizado para armazenar informações e metadados sobre os ‘snapshots’. É um arquivo de texto que guarda informações do tipo: nome do snapshot, UID, nome do arquivo do disco, etc. É criado juntamente com a máquina virtual, mas mantêm-se com 0 bytes até o momento em que é feito o primeiro snapshot. Sempre que um novo snapshot é feito este arquivo é “populado”. Repare que na FIGURA 2 este arquivo encontra-se com 0 bytes e na FIGURA 4, após a criação de um snapshot, o mesmo encontra-se com 454 bytes. Abaixo segue um exemplo do conteúdo deste arquivo:

FIGURA 6
*.vmsn – este é o arquivo de estado do snapshot, nele é armazenado o estado exato em que a máquina virtual se encontrava no momento em que o snapshot foi feito. O tamanho deste arquivo depende se no momento da criação do snapshot a opção para preservar a memória da VM estava marcada, se sim, o arquivo será alguns megabytes maior do que a quantidade de memória alocada para a VM. Se não, o arquivo será bem pequeno. No exemplo acima o snapshot foi feito com a opção para preservar a memória marcada por isso o arquivo possui cerca de 4GB, como pode ser notado na FIGURA 4.

Como disse anteriormente, o snapshot mantém a VM exatamente no mesmo estado em que ela se encontrava quando o mesmo foi feito. Isso inclui:

Estado da memória: todo o conteúdo existente na memória RAM da VM (neste caso é necessário que a VM esteja ligada e que a opção “Snapshot the virtual machine’s memory” esteja marcada).

Estado das configurações: todas as configurações da máquina virtual.

Estado do disco: o estado dos discos virtuais da VM.

Além disso, o snapshot captura o“Power State” da máquina virtual, ou seja, se fizermos um snapshot com a máquina desligada, quando revertermos este snapshot a VM voltará desligada.

Há ainda uma opção chamada “Quiesce guest file system ...”, esta opção é muito utilizada por softwares de backup, pois garante a integridade da VM no momento em que o snapshot é realizado.

FIGURA 7
A imagem acima exibe a tela de criação de um snapshot quando feito através do Vsphere Client. Também é possível fazer a criação do snapshot através da linha de comando.

Algumas considerações sobre a utilização de snapshots e porque eles não devem ser utilizados como uma forma de backup:

- Conforme explicado anteriormente, o disco virtual original da VM passa para o estado ‘somente leitura’ e um novo disco é criado para armazenar as alterações realizadas. Apesar das operações de escrita ocorrerem somente no novo disco, as operações de leitura podem ocorrer em ambos os discos, impactando no desempenho da máquina virtual;

- Impacto no desempenho da LUN na qual o snapshot é criado, devido ao fato que toda vez que o arquivo ‘-delta.vmdk’ é incrementado uma operação de lock/unlock é executada pelo host no qual a máquina virtual se encontra;

- Risco de perda de dados no caso de o snapshot precisar ser destruído;

- Os snapshots podem crescer a ponto de encher um datastore.

Portanto, com base nas considerações levantadas anteriormente, devemos ter em mente que o snapshot deve ser usado apenas para situações temporárias, como por exemplo, na realização de um backup ou na aplicação de um patch ou update.

Depois de fazer o que tínhamos pra fazer devemos decidir o que fazer com este snapshot. As seguintes opções estão disponíveis:

- Aceitar as alterações que foram realizadas (Consolidate)
- Destruir as alterações que foram feitas (Revert)
- Adicionar um novo snapshot

No VSphere 5 a opção “Consolidate” foi adicionada de forma mais explícita no menu da máquina virtual, conforme mostrado na imagem abaixo:

FIGURA 8
As versões anteriores não apresentam esta opção, por isso para aplicar as alterações realizadas no snapshot definitivamente ao disco original da máquina virtual é necessário abrir o ‘Snapshot Manager’ e excluir o snapshot em questão:

FIGURA 9
A opção ‘Delete All’ deve ser usada no caso em que houver mais de um snapshot e as alterações de todos eles devam ser consolidadas.

Quando optamos por estas opções (Consolidate ou Delete) estamos aceitando as alterações que foram feitas na máquina virtual durante o período em que o snapshot esteve presente e permitindo que o “merge” seja feito entre o arquivo de log do snapshot (-delta.vmdk) e o disco virtual original da VM (-flat.vmdk). O vmkernel varre o arquivo de log e sobrescreve o .vmdk original com os dados mais recentes. A figura abaixo exemplifica bem essa situação:

FIGURA 10
Pode ocorrer de o arquivo de log do snapshot ficar muito grande, dificultando a consolidação com o disco original. Neste caso, o vmkernel automaticamente faz um novo snapshot da VM, para que o arquivo de log possa ser utilizado apenas para a leitura e consolidação. Este snapshot feito automaticamente pelo vmkernel é chamado de Consolidate Helper Snapshot (CHS).

Existe também a possibilidade de não ficarmos satisfeitos com as alterações que foram realizadas na VM após a criação do snapshot. Pense por exemplo numa aplicação mal sucedida de um determinado patch de atualização, neste caso temos a opção de retornar a máquina virtual para o ponto em que ela estava no momento que o snapshot foi realizado, descartando assim todas as alterações que haviam sido realizadas.

FIGURA 11
O VSphere Client oferece duas opções para voltarmos um snapshot. A primeira é a opção “Revert to Current Snapshot” (veja na FIGURA 8). Esta opção volta a máquina virtual para o estado em que snapshot mais próximo, ou seja, o mais recente, estava. Caso exista mais de um snapshot, o recomendado é utilizar a segunda opção, conhecida como “Go to”. Esta é acessada através do Snapshot Manager (FIGURA 9) e permite que você escolha para qual snapshot deseja retornar. Como no nosso exemplo temos apenas um snapshot, as duas opções teriam o mesmo resultado.


Quem quiser aprofundar um pouco mais sobre o assunto pode dar uma conferida nos textos que utilizei como base para este post:

http://www.vmdamentals.com/?p=76
http://www.vmdamentals.com/?p=332
http://www.daemonchild.com/vsphere-snapshots
http://searchvmware.techtarget.com/tip/How-VMware-snapshots-work
http://searchvmware.techtarget.com/tip/Deleting-virtual-machine-snapshots-without-wasting-disk-space