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.