Contatos

Para entrar em contato ou ficar informado sobre as novidades do site:

E-Mail: mail@drwhitehat.com

Lista de Discussão
http://groups.google.com.br/group/drwhitehat


--------------------





SysAdmin‎ > ‎Artigos‎ > ‎

FreeNAS - Torturando o ZFS

Agosto 01, 2009

Introdução

Já falei sobre o FreeNAS como uma solução de baixo custo para montar um servidor de arquivos com discos espelhados ou usando RAID por software e discos baratos. Neste artigo, vou mostrar como o ZFS mantém os dados íntegros e os acessos funcionais em caso de falha em um dos discos, garantindo a preservação dos seus dados.

Todos os testes foram realizados em uma máquina virtual, usando o Virtualbox, com 3 discos virtuais de 1 Gb cada. Os discos foram populados com um arquivo de imagem ISO do Ubuntu Desktop, com aproximadamente 700 Mb de tamanho.

Testando ZFS com Mirror

Nesse primeiro teste, utilizamos somente dois discos configurados de forma espelhada, ou seja, toda escrita é feita em duplicidade pelo sistema, nos dois discos.

Verificando o MD5 do arquivo: Para constatar a integridade do arquivo, calculamos o hash do arquivo utilizando MD5.

freenas:/dados# ls -la
total 716310 drwxrwxrwx 2 root wheel 3 Jul 22 13:37 . drwxr-xr-x 20 root wheel 512 Jul 22 12:55 .. -rwxrw-rw- 1 ftp wheel 732909568 Jul 7 12:34 ubuntu-9.04-desktop-i386.iso freenas:/dados# md5 ubuntu-9.04-desktop-i386.iso MD5 (ubuntu-9.04-desktop-i386.iso) = 66fa77789c7b8ff63130e5d5a272d67b

Verificando estado dos discos: Antes de fazer o teste, usamos o comando zpool status para constatar o estado do sistema de arquivos. Todos os discos estão online, assim como e estado do pool.

freenas:/dados# zpool status
  pool: pool0
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     ONLINE       0     0     0

errors: No known data errors

Quebrando espelho: Para simular um disco defeituoso, colocamos um dos discos em modo offline, o que pode ser confirmado pelo zpool status, mostrando que o estado do pool está DEGRADED.

freenas:/dados# zpool offline pool0 ad8
Bringing device ad8 offline
freenas:/dados# zpool status
  pool: pool0
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
 scrub: resilver completed with 0 errors on Wed Jul 22 15:40:28 2009
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       DEGRADED     0     0     0
	  mirror    DEGRADED     0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     OFFLINE      0     0     0

errors: No known data errors

Gravando dados aleatórios no disco: Para garantir que os dados do arquivo estarão corrompidos, simulamos uma falha grave escrevendo aleatoriamente no disco offline. Usando o disco remanescente, o ZFS garante o acesso ao arquivo íntegro no disco que permaneceu online.

freenas:/dados# dd if=/dev/urandom of=/dev/ad8 bs=1024 count=512
512+0 records in
512+0 records out
524288 bytes transferred in 0.667717 secs (785195 bytes/sec)
freenas:/dados# md5 ubuntu-9.04-desktop-i386.iso 
MD5 (ubuntu-9.04-desktop-i386.iso) = 66fa77789c7b8ff63130e5d5a272d67b

Recompondo espelho: Retornando o disco offline para o pool, podemos verificar que o ZFS restaurou o espelho ao seu estado de integridade, conforme se pode ver no estado do pool, mudando o estado de DEGRADED para ONLINE. A mensagem scrub (“escovação”) indica que o resilver (“polimento”) foi completado sem nenhum erro. Esse processo de resilver é automático (e muito rápido), ou seja, o próprio sistema trata de recuperar seu estado de integridade.

freenas:/dados# zpool online pool0 ad8
Bringing device ad8 online
freenas:/dados# zpool status
  pool: pool0
 state: ONLINE
 scrub: resilver completed with 0 errors on Wed Jul 22 16:04:47 2009
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     ONLINE       0     0     0

errors: No known data errors

Testando o outro disco: Para comprovar a restauração da integridade do disco recuperado, invertemos o procedimento, retirando o disco que permaneceu online.

freenas:/dados# zpool offline pool0 ad6
Bringing device ad6 offline
freenas:/dados# dd if=/dev/urandom of=/dev/ad6 bs=1024 count=512
512+0 records in
512+0 records out
524288 bytes transferred in 0.362818 secs (1445044 bytes/sec)
freenas:/dados# zpool status
  pool: pool0
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
 scrub: resilver completed with 0 errors on Wed Jul 22 16:04:47 2009
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       DEGRADED     0     0     0
	  mirror    DEGRADED     0     0     0
	    ad6     OFFLINE      0     0     0
	    ad8     ONLINE       0     0     0

errors: No known data errors
freenas:/dados# md5 ubuntu-9.04-desktop-i386.iso
MD5 (ubuntu-9.04-desktop-i386.iso) = 66fa77789c7b8ff63130e5d5a272d67b
freenas:/dados# zpool online pool0 ad6
Bringing device ad6 online
freenas:/dados# zpool status
  pool: pool0
 state: ONLINE
 scrub: resilver completed with 0 errors on Wed Jul 22 16:23:56 2009
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     ONLINE       0     0     0

errors: No known data errors

Testando ZFS com RAID Z

Neste teste, utilizamos 3 discos, configurados como RAID Z. No RAID, a gravação dos dados é distribuída ao longo de todos os discos que fazem parte do pool, juntamente com uma informação de paridade, que serve para reconstituir o dado em caso de falta de uma parte dele, ocasionada por um disco defeituoso.

Verificando estado inicial e comprovando a distribuição dos dados: Novamente iniciamos os testes comprovando o estado de integridade do sistema, usando o comando zpool status. Adicionalmente, usamos o comando zpool iostat para visualizar as estatísticas de acesso de cada disco, antes de calcular o MD5 do arquivo. Após o MD5, podemos ver que a quantidade de acessos foi praticamente idêntica entre os 3 discos, comprovando que o arquivo está distribuído ao longo de todos eles.

freenas:/dados# ls -la
total 715625
drwxrwxrwx   2 root  wheel          3 Jul 27 11:02 .
drwxr-xr-x  20 root  wheel        512 Jul 27 15:39 ..
-rwxrw-rw-   1 ftp   wheel  732909568 Jul  7 12:34 ubuntu-9.04-desktop-i386.iso
freenas:/dados# zpool status
  pool: pool0
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     ONLINE       0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors
freenas:/dados# zpool iostat -v pool0
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1.03G  1.96G      0      1    264  4.22K
  raidz1    1.03G  1.96G      0      1    264  4.22K
    ad6         -      -      0      1  4.54K  6.24K
    ad8         -      -      0      1  4.82K  6.25K
    ad10        -      -      0      1  4.82K  6.18K
----------  -----  -----  -----  -----  -----  -----

freenas:/dados# md5 ubuntu-9.04-desktop-i386.iso 
MD5 (ubuntu-9.04-desktop-i386.iso) = 66fa77789c7b8ff63130e5d5a272d67b
freenas:/dados# zpool iostat -v pool0
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1.03G  1.96G     35      0  4.42M  2.17K
  raidz1    1.03G  1.96G     35      0  4.42M  2.17K
    ad6         -      -     14      0  1.48M  2.80K
    ad8         -      -     14      0  1.45M  2.80K
    ad10        -      -     14      0  1.50M  2.77K
----------  -----  -----  -----  -----  -----  -----

Removendo e degradando um disco: Mudamos o estado de um disco para offline para simular o defeito e escrevemos dados aleatórios para garantir que os dados estarão corrompidos.

freenas:/dados# zpool offline pool0 ad8
Bringing device ad8 offline
freenas:/dados# zpool status
  pool: pool0
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       DEGRADED     0     0     0
	  raidz1    DEGRADED     0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     OFFLINE      0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors
freenas:/dados# dd if=/dev/urandom of=/dev/ad8 bs=1024 count=512
512+0 records in
512+0 records out
524288 bytes transferred in 0.697207 secs (751983 bytes/sec)

Testando integridade após reboot: Para zerar as estatísticas de acesso e garantir que o disco offline não está sendo utilizado, efetuamos um reboot na máquina antes de testar a integridade do arquivo. Mesmo funcionando somente com dois do três discos, o sistema conseguir acessar o arquivo integralmente.

freenas:/dados# zpool status
  pool: pool0
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
 scrub: resilver completed with 0 errors on Mon Jul 27 16:16:17 2009
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       DEGRADED     0     0     0
	  raidz1    DEGRADED     0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     OFFLINE      0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors
freenas:/dados# zpool iostat -v
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1.03G  1.96G      0      5  1.25K  12.9K
  raidz1    1.03G  1.96G      0      5  1.25K  12.9K
    ad6         -      -      0      6  23.3K  34.5K
    ad8         -      -      0      0      0      0
    ad10        -      -      0      6  18.8K  34.3K
----------  -----  -----  -----  -----  -----  -----

freenas:/dados# md5 ubuntu-9.04-desktop-i386.iso
MD5 (ubuntu-9.04-desktop-i386.iso) = 66fa77789c7b8ff63130e5d5a272d67b
freenas:/dados# zpool iostat -v
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1.03G  1.96G     65      0  8.16M  2.00K
  raidz1    1.03G  1.96G     65      0  8.16M  2.00K
    ad6         -      -     35      1  4.09M  4.45K
    ad8         -      -      0      0      0      0
    ad10        -      -     35      1  4.09M  4.45K
----------  -----  -----  -----  -----  -----  -----

Restaurando disco removido: Após repor o disco offline, o sistema imediatamente recompôs a sua integridade, conforme se pode ver na mensagem de scrub.

freenas:/dados# zpool online pool0 ad8
Bringing device ad8 online
freenas:/dados# zpool status
  pool: pool0
 state: ONLINE
 scrub: resilver completed with 0 errors on Mon Jul 27 16:33:07 2009
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     ONLINE       0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors
freenas:/dados# zpool iostat -v
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1.03G  1.96G     46      0  5.81M  2.82K
  raidz1    1.03G  1.96G     46      0  5.81M  2.82K
    ad6         -      -     25      0  2.91M  4.74K
    ad8         -      -      0      0    217  1.59K
    ad10        -      -     25      0  2.91M  4.73K
----------  -----  -----  -----  -----  -----  -----

Testando integridade e distribuição dos dados após reboot: Para comprovar a restauração dos dados e a redistribuição ao longo dos 3 discos, reiniciamos o sistema para zerar as estatísticas e calculamos o MD5 mais uma vez.

freenas:/dados# zpool status
  pool: pool0
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     ONLINE       0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors
freenas:/dados# zpool iostat -v
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1.03G  1.96G      0      4    812  16.2K
  raidz1    1.03G  1.96G      0      4    812  16.2K
    ad6         -      -      0      3  13.5K  19.0K
    ad8         -      -      0      3  13.5K  19.0K
    ad10        -      -      0      3  13.5K  18.9K
----------  -----  -----  -----  -----  -----  -----

freenas:/dados# md5 ubuntu-9.04-desktop-i386.iso 
MD5 (ubuntu-9.04-desktop-i386.iso) = 66fa77789c7b8ff63130e5d5a272d67b
freenas:/dados# zpool iostat -v
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
pool0       1.03G  1.96G     49      1  6.09M  3.44K
  raidz1    1.03G  1.96G     49      1  6.09M  3.44K
    ad6         -      -     19      0  2.04M  3.71K
    ad8         -      -     18      0  2.01M  3.72K
    ad10        -      -     19      0  2.06M  3.70K
----------  -----  -----  -----  -----  -----  -----

Comparando o desempenho

Em vias de regra, quando um sistema RAID fica sem um dos discos que compõe o pool, ele tem o seu desempenho afetado porque ele tem que reconstituir o dado que falta, a partir das informações de paridade dos discos remanescentes a cada acesso. Para testar essa diferença de desempenho, eu criei dois scripts simples para verificar essa diferença entre os dois estados.

Script 1: O primeiro script verifica o tempo usado para calcular o MD5 com o sistema em seu estado íntegro. Adicionalmente, retira o disco do pool e escreve aleatoriamente nele, preparando para o teste seguinte.

freenas:/dados# cat teste1.sh 
#!/bin/sh
echo
echo ">>>>Verificando estado (integro)..."
date
zpool status
echo
echo

echo ">>>>Calculando MD5 com pool integro..."
date
md5 ubuntu-9.04-desktop-i386.iso
date
echo
echo

echo ">>>>Removendo disco..."
date
zpool offline pool0 ad8
echo
echo

echo ">>>>Corrompendo disco offline..."
date
dd if=/dev/urandom of=/dev/ad8 bs=1024 count=512
echo
echo

echo ">>>>Verificando estado (degradado)..."
date
zpool status
echo
echo

Script 2: O segundo script verifica o tempo para calcular o mesmo MD5, mas com o pool degradado, ou seja, sem um dos discos. Adicionalmente, repõe o disco no pool e imediatamente verifica seu estado para verificar se ele ainda está executando a recuperação.

freenas:/dados# cat teste2.sh
#!/bin/sh
echo
echo ">>>>Verificando estado (degradado)..."
date
zpool status
echo
echo

echo ">>>>Calculando MD5 com pool degradado..."
date
md5 ubuntu-9.04-desktop-i386.iso
date
echo
echo

echo ">>>>Repondo disco removido..."
date
zpool online pool0 ad8
echo
echo

echo ">>>>Verificando estado (recuperado)..."
date
zpool status

Teste com pool íntegro (teste1.sh): Antes de executar o script, o sistema foi reiniciado para garantir que não havia permanecido nenhuma informação dos testes anteriores em cache.

freenas:/dados# ./teste1.sh 

>>>>Verificando estado (integro)...
Mon Jul 27 18:05:00 BRT 2009
  pool: pool0
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     ONLINE       0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors


>>>>Calculando MD5 com pool integro...
Mon Jul 27 18:05:00 BRT 2009
MD5 (ubuntu-9.04-desktop-i386.iso) = 66fa77789c7b8ff63130e5d5a272d67b
Mon Jul 27 18:06:21 BRT 2009


>>>>Removendo disco...
Mon Jul 27 18:06:21 BRT 2009
Bringing device ad8 offline


>>>>Corrompendo disco offline...
Mon Jul 27 18:06:23 BRT 2009
512+0 records in
512+0 records out
524288 bytes transferred in 0.331859 secs (1579852 bytes/sec)


>>>>Verificando estado (degradado)...
Mon Jul 27 18:06:23 BRT 2009
  pool: pool0
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       DEGRADED     0     0     0
	  raidz1    DEGRADED     0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     OFFLINE      0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors

Teste com pool degradado (teste2.sh): Novamente, antes de executar o script2, o sistema foi reiniciado.

freenas:/dados# ./teste2.sh 

>>>>Verificando estado (degradado)...
Mon Jul 27 18:10:00 BRT 2009
  pool: pool0
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
 scrub: resilver completed with 0 errors on Mon Jul 27 18:09:04 2009
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       DEGRADED     0     0     0
	  raidz1    DEGRADED     0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     OFFLINE      0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors


>>>>Calculando MD5 com pool degradado...
Mon Jul 27 18:10:00 BRT 2009
MD5 (ubuntu-9.04-desktop-i386.iso) = 66fa77789c7b8ff63130e5d5a272d67b
Mon Jul 27 18:11:18 BRT 2009


>>>>Repondo disco removido...
Mon Jul 27 18:11:18 BRT 2009
Bringing device ad8 online


>>>>Verificando estado (recuperado)...
Mon Jul 27 18:11:20 BRT 2009
  pool: pool0
 state: ONLINE
 scrub: resilver completed with 0 errors on Mon Jul 27 18:11:20 2009
config:

	NAME        STATE     READ WRITE CKSUM
	pool0       ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
	    ad8     ONLINE       0     0     0
	    ad10    ONLINE       0     0     0

errors: No known data errors

Podemos observar que no primeiro teste, com sistema íntegro, o MD5 levou 1:21 minuto, contra 1:18 minuto com o sistema degradado do segundo teste, ou seja, praticamente o mesmo tempo. Como o arquivo era relativamente pequeno (700 Mb) e os testes foram feitos em uma máquina virtual, sujeitos à flutuações de desempenho em função dos processos no hospedeiro, podemos imaginar que a diferença de desempenho em um sistema real, com um grande volume de acessos, seja pouco significativo.

Considerações finais

Como se pode ver, o FreeNAS, usando o sistema de arquivos ZFS da Sun, realmente é uma opção confiável para armazenamento de dados de uma rede, pois garante o acesso, mesmo em caso de falha de um disco, que é um componente mecânico, muito sujeito à falhas. Como pode ser utilizado com discos e computadores baratos, é uma opção muito atraente para pequenas redes corporativas ou domésticas.