O ZFS é um dos sistemas de arquivos mais avançado disponíveis atualmente. A sigla significa "zettabyte file system", ou seja "sistema de arquivos de zetabytes", uma referência direta à sua capacidade de armazenamento: até 256 quatrilhões de zetabytes. Dito de outra forma, um único zetabyte é igual a 1.073.741.824 terabytes!
Essa ferramenta única e eficiente é multifacetada. Vamos nos concentrar nas partes relevantes para a criação de um servidor de armazenamento escalável e redundante. Isso nos leva ao RAID-Z, que, como indica o nome, é similar à tecnologia RAID (mais especificamente ao RAID-5).
Quem está familiarizado com RAID provavelmente vai se perguntar que dispositivo (ou controlador) manipula os discos e dados. No caso do RAID-Z, tudo é manipulado pelo próprio sistema de arquivos. No entanto, ao contrário de outras tecnologias semelhantes, ele faz a autocorreção de blocos corrompidos e os corrige durante a operação sem interação do usuário. O RAID-Z está constantemente verificando somas de verificação de dados quanto à integridade e é capaz de identificar blocos que precisam ser reconstruídos. Ele faz isso antes de os dados solicitados atingirem o usuário.
Visto que vários sistemas operacionais suportam RAID-Z e ZFS, o SO fica à escolha do leitor. A maioria dos exemplos e técnicas discutidos neste artigo deve aplicar-se e funcionar corretamente, independentemente do SO.
De quanto espaço precisamos agora? De quanto espaço deveremos precisar em um ano? Qual é o número adequado de discos rígidos para essa configuração? Todas essas são boas perguntas a analisar antes de começar. Vou analisar cada uma dessas decisões de design para obter a preparação ideal.
É altamente recomendável usar um sistema operacional que suporte nativamente o sistema de arquivos ZFS para aproveitar todos os recursos e o desempenho. Todos os exemplos a seguir usam o OpenIndiana como o sistema operacional (uma bifurcação mantido pela comunidade do Open Solaris), de modo que os comandos e a interação de terminal refletirá esse ambiente. (Consulte Recursos para obter mais informações sobre o OpenIndiana).
Mas quem se sente à vontade com Linux® e conhece os comandos compatíveis para obter os mesmos resultados alcançados por este artigo pode conferir se sua distribuição preferida suporta zfs-fuse, uma porta do sistema de arquivos ZFS.
Visto que isso afetará diretamente o restante de suas escolhas, é vital planejar as necessidades de espaço de armazenamento no início da fase de design. O espaço também será afetado pelo tipo de configuração RAID-Z necessário (há mais informações sobre isso na seção Opções de RAID-Z ).
Não conte com o SO como parte do armazenamento total. Recomendo a instalação do SO em uma unidade de disco rígido separada, pois isso facilitará a reinstalação ou o reparo do sistema, sem afetar o compartilhamento.
Certifique-se de qualquer número cogitado corresponda às suas necessidades de RAID-Z (por exemplo, pelo menos cinco discos rígidos para esta demonstração). Embora as configurações de RAID-Z possam ter discos rígidos com tamanhos diferentes (por exemplo, cinco unidades de 2 terabytes e uma de um terabyte), o ZFS definirá os discos rígidos de forma efetiva a partir do menor do conjunto.
O desempenho ideal é obtido por unidades da mesma marca e com o mesmo tamanho.
Existem inúmeras configurações disponíveis em uma configuração RAID-Z. Vou tratar de duas e, em seguida, apresentarei mais detalhes sobre a escolha final para este projeto.
RAID-Z é o menos tolerante a falhas. Ele oferece uma paridade de disco no conjunto. Se houver problemas com mais de uma unidade, isso é indício de que há um conjunto de armazenamentos corrompido e não recuperável.
RAID-Z2 usa dois discos para paridade. Dois discos fornecem segurança, mesmo com problemas como disco corrompido ou com mau funcionamento. Embora o RAID-Z2 exija duas unidades extras para a configuração correta, é mais tolerante a falhas do que uma configuração RAID-Z simples.
No mínimo, uma configuração RAID-Z2 deve ser configurada com cinco unidades no total (duas usadas para paridade), que deixa três unidades para serem contadas como de armazenamento geral. Por exemplo, unidades de dois terabytes resultariam em cerca de seis terabytes de armazenamento.
Como mencionei antes, é melhor usar unidades da mesma marca e com o mesmo tamanho. É mais seguro usar um conjunto de unidades o mais semelhante possível.
O ideal é comprar pelo menos uma unidade de disco rígido extra ao desenvolver o servidor de armazenamento para reduzir os atrasos em potencial. Não é incomum receber uma unidade de disco rígido com problemas de fabricação.
Unidades adicionais significam que a velocidade aumenta conforme os dados são espalhados pelo espaço. Portanto, é importante certificar-se de que o tamanho total corresponda ao espaço de armazenamento de destino. Há alguns controladores SATA que permitem a expansão da placa-mãe, mas podem criar um gargalo se não forem planejados com antecedência.
Existem três elementos-chave para armazenamento escalável e com possibilidade de crescimento:
- Número de unidades de disco rígido
- Capacidade geral de armazenamento
- Capacidade do servidor de discos rígidos
Recentemente, construí um servidor de armazenamento com dezesseis terabytes, que inclui a capacidade de crescer para o dobro de espaço. Isso permitiu crescimento inesperado e ajudou a controlar o orçamento.
Inicialmente, decidimos instalar o sistema operacional em uma unidade separada, e temos mais cinco dispositivos disponíveis. Precisamos tomar nota das etiquetas de cada dispositivo para especificá-los mais tarde, quando criarmos o conjunto de armazenamentos.
Listagem 1. Localizar as etiquetas de dispositivos
root@raidz:~# format
Searching for disks...done
AVAILABLE DISK SELECTIONS:
0. c7d0 DEFAULT cyl 4092 alt 2 hd 128 sec 32
/pci@0,0/pci-ide@1,1/ide@0/cmdk@0,0
1. c9t0d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@0,0
2. c9t1d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@1,0
3. c9t2d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@2,0
4. c9t3d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@3,0
5. c9t4d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@4,0
Specify disk (enter its number):
|
Damos o comando format para descobrir as etiquetas (ou IDs), mas não digitamos um número como seleção. Aperte Ctrl-C para sair do prompt.
Instalei o SO no dispositivo 0 e depois decidi acrescentar os outros cinco dispositivos, de modo que as seguintes etiquetas são interessantes para o conjunto de armazenamentos:
- c9t0d0
- c9t1d0
- c9t2d0
- c9t3d0
- c9t4d0
Um recurso fascinante do ZFS é que ele cria rapidamente o próprio sistema de arquivos. Formatar ou reformatar discos rígidos costuma ser demorado. A criação do sistema de arquivos, nesse caso, demorou cerca de dois segundos. Em média, isso não deve levar mais que alguns segundos, independentemente do tamanho dos discos rígidos.
Listagem 2. Crie o conjunto de armazenamentos
zpool create tank raidz2 c9t0d0 c9t1d0 c9t2d0 c9t3d0 c9t4d0
|
Zpool create tank é um comando que diz a sistema de arquivos para criar e formatar algumas unidades, e definir a etiqueta desse conjunto de armazenamentos como tank. Especifiquei raidz2 como tipo de RAID-Z, mas é possível selecionar raidz ou raidz3. Os IDs para os cinco dispositivos que selecionei encontram-se na Listagem 1.
Demos mais um passo significativo: o conjunto de armazenamentos já está montado e pronto para usar!
Listagem 3. Verificando a criação do conjunto
root@raidz:~# df -h
Filesystem size used avail capacity Mounted on
swap 642M 16K 642M 1% /tmp
swap 642M 44K 642M 1% /var/run
rpool/export/home 7.8G 21K 4.1G 1% /export/home
rpool 7.8G 77K 4.1G 1% /rpool
tank 5.8G 34K 5.8G 1% /tank
|
A saída de comando foi encurtada para abreviar, mas é possível ver que tank é exibido com quase seis gigabytes e já montado no nível-raiz do sistema de arquivos. Visto que escolhemos uma configuração de paridade com dois discos, o tamanho de armazenamento efetivo será próximo ao total dos outros três dispositivos. Agora que sabemos o conjunto de armazenamentos está montado e pronto, vamos verificar o status de funcionamento dos discos e do array geral.
Listagem 4. Status do conjunto de armazenamentos
root@raidz:~# zpool status tank
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2 ONLINE 0 0 0
c9t0d0 ONLINE 0 0 0
c9t1d0 ONLINE 0 0 0
c9t2d0 ONLINE 0 0 0
c9t3d0 ONLINE 0 0 0
c9t4d0 ONLINE 0 0 0
errors: No known data errors
|
Se desejar, poderá criar sistemas de arquivos aninhados dentro do conjunto de armazenamentos tank. Isso é muito útil se desejar definir as necessidades de armazenamento específicas que são isoladas e as permissões que estão ligadas ao compartilhamento em si. Se houver apenas um compartilhamento, isso pode ser complicado.
Listagem 5. Acrescentando compartilhamentos
root@raidz:/tank# zfs create tank/bar
root@raidz:/tank# zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 3.74G 4.07G 77.5K /rpool
rpool/ROOT 2.99G 4.07G 19K legacy
rpool/swap 512M 4.43G 137M -
tank 160K 5.83G 34.8K /tank
tank/bar 34.0K 5.83G 34.0K /tank/bar
|
Criamos um compartilhamento chamado bar que aparece como um compartilhamento separado. Ótimo! No entanto, não deixe que os quase seis gigabytes exibidos o confundam. Não dobramos o espaço de compartilhamento total, pelo contrário, é útil saber quanto temos disponível a partir do conjunto de armazenamentos total.
Agora que o conjunto de armazenamentos está pronto, precisamos estar cientes de que os dados podem ficar corrompidos ou as unidades de disco rígido podem sofrer falhas. Felizmente, o ZFS e o RAID-Z permitem administração fácil dessas tarefas. Esta seção fornece uma simulação de uma unidade de disco rígido com defeito e uma falha total do sistema na qual o sistema operacional não consegue se recuperar.
Unidade de disco rígido danificada
Neste cenário, fiz de propósito que uma unidade de disco rígido ficasse inacessível para o servidor. Vejamos o que o ZFS informa quando isso acontece.
Listagem 6. Status de unidade danificada
root@raidz:~# zpool status tank
pool: tank
state: DEGRADED
status: One or more devices could not be opened.
Sufficient replicas exist for the pool to continue functioning in
a degraded state.
action: Attach the missing device and online it using 'zpool online'.
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2 DEGRADED 0 0 0
c9t0d0 ONLINE 0 0 0
c9t1d0 ONLINE 0 0 0
c9t2d0 ONLINE 0 0 0
c9t3d0 ONLINE 0 0 0
c9t4d0 UNAVAIL 0 0 0 cannot open
errors: No known data errors
|
Nosso conjunto de armazenamentos ficou degradado. O comando de status mostra o que está acontecendo no conjunto e qual unidade de disco rígido parece estar com defeito. Também é importante notar que o armazenamento está totalmente utilizável. Lembre-se de que selecionei raidz2 que permite até duas falhas simultâneas em unidades de discos rígidos. Para tornar esse cenário um pouco mais realista, copiei alguns arquivos de log para o armazenamento a fim de simular um estado degradado.
Após substituir a unidade de disco rígido com defeito, reiniciei o servidor para observar o resultado.
Listagem 7. Recuperação de um estado degradado
root@raidz:~# zpool status tank
pool: tank
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace.'
scrub: resilver completed after 0h0m with 0 errors on Tue Nov 9 07:25:23 2010
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2 ONLINE 0 0 0
c9t0d0 ONLINE 0 0 0
c9t1d0 ONLINE 0 0 0
c9t2d0 ONLINE 0 0 0
c9t3d0 ONLINE 0 0 0
c9t4d0 ONLINE 0 0 2 31.5K resilvered
errors: No known data errors
|
Não só o compartilhamento se recuperou totalmente sem qualquer interação nossa, mas a saída forneceu detalhes sobre o que aconteceu, quais ações foram tomadas e as possíveis opções se não estivermos satisfeitos com os resultados (por exemplo, arquivos corrompidos).
A tag resilvered significa que o ZFS reconstruiu aquela quantidade de dados naquela unidade específica.
Sistema operacional irrecuperável
Nesta seção, replicarei um erro do sistema com incapacidade de boot. Visto que o sistema foi instalado em uma unidade de disco rígido separada, longe do armazenamento precioso, ele pode ser reinstalado na mesma unidade de disco rígido sem tocar nos dispositivos associados ao compartilhamento.
Como antes, usamos o comando zpool para diagnosticar o armazenamento e ver se podemos anexá-lo novamente.
Listagem 8. Status do conjunto após a reinstalação
root@reinstalled:~# zpool status
pool: rpool
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c7d0s0 ONLINE 0 0 0
errors: No known data errors
|
Isso verifica se a instalação funcionou, mas ainda não vê o armazenamento.
Listagem 9. Localizando o conjunto
root@reinstalled:~# zpool import
pool: tank
id: 11026414298329032494
state: ONLINE
status: The pool was last accessed by another system.
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: http://www.sun.com/msg/ZFS-8000-EY
config:
tank ONLINE
raidz2 ONLINE
c9t0d0 ONLINE
c9t1d0 ONLINE
c9t2d0 ONLINE
c9t3d0 ONLINE
c9t4d0 ONLINE
|
Ótimo! Esse é o conjunto. Está em perfeita forma e pronto para ser importado.
Listagem 10. Importação e verificação do conjunto
root@reinstalled:~# zpool import tank
cannot import 'tank': pool may be in use from other system, it was
last accessed by raidz (hostid: 0x4013af) on Tue Nov 9 07:31:33 2010
use '-f' to import anyway
root@reinstalled:~# zpool import -f tank
root@reinstalled:~# zpool status tank
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2 ONLINE 0 0 0
c9t0d0 ONLINE 0 0 0
c9t1d0 ONLINE 0 0 0
c9t2d0 ONLINE 0 0 0
c9t3d0 ONLINE 0 0 0
c9t4d0 ONLINE 0 0 0
errors: No known data errors
root@reinstalled:~# df -h
Filesystem size used avail capacity Mounted on
/ 7.8G 2.8G 4.2G 41% /
/devices 0K 0K 0K 0% /devices
swap 800M 368K 800M 1% /etc/svc/volatile
rpool/export 7.8G 21K 4.2G 1% /export
rpool 7.8G 79K 4.2G 1% /rpool
tank 5.8G 104K 5.8G 1% /tank
|
Tentei importar o conjunto, mas a saída relata que ele talvez esteja em uso por outro sistema, nesse caso, aquele instalado anteriormente. Forcei a importação e verifiquei o status, que retornou limpo e sem erros. Por fim, verifiquei a montagem e a localização, e confirmei que está exatamente como antes.
Percorremos cenários comuns e recuperamos o armazenamento com pouco esforço.
O compartilhamento é muito simples. A próxima seção abrange o compartilhamento com NFS, conforme suportado em vários sistemas operacionais, incluindo diversas variedades de Linux e UNIX.
Visto que o ZFS tem suporte nativo a NFS, só será preciso conhecer o sistema de arquivos, o tipo de compartilhamento e a localização.
Listagem 11. Compartilhamento por meio de NFS
root@reinstalled:~# zfs set sharenfs=on tank
|
Nesse caso, tank é o compartilhamento e é compartilhado instantaneamente pelo NFS na rede local. Além disso, é possível definir permissões em compartilhamentos específicos, mas vale a pena notar que, se compartilharmos a raiz do compartilhamento, compartilharemos automaticamente qualquer compartilhamento-filho presente, ou aqueles criados no futuro.
Figura 1. Conectando-se ao compartilhamento NFS no Mac OSX
Geralmente é demorado configurar compartilhamentos em servidores, mas a capacidade do próprio sistema de arquivo ativar o compartilhamento por meio de um protocolo específico, como o NFS, é útil.
O compartilhamento anterior não tinha proteção nem permissões definidas, então vejamos como modificá-lo para que ele permita as ações read and write em uma sub-rede específica na rede.
Listagem 12. Permissões baseadas na rede no compartilhamento ZFS
zfs set sharenfs=rw=@10.0.0.0/8 tank
|
Esse tipo de restrição de rede funciona sem configuração adicional. Assim que esse comando é enviado, o acesso é restrito e somente as sub-redes especificadas terão acesso de leitura e gravação ao compartilhamento.
As permissões podem ser ajustadas para usuários ou grupos específicos, e a implementação e a configuração podem variar de um sistema para outro.
O ZFS foi portado para funcionar em muitos sistemas operacionais e atualmente está disponível em muitas versões de UNIX e Linux.
Embora haja muito mais informações para discutir sobre o ZFS e RAID-Z, este artigo analisou os itens mais importantes para a criação de um compartilhamento, de decisões de design ao compartilhamento do armazenamento pela rede.
O RAID-Z não é o único tipo de array de disco disponível no ZFS. Os espelhos costumam ser mais rápidos e consumir menos memória, mas exigem um número igual de discos rígidos para serem usados. Nesse caso, com cinco discos rígidos prontos para o compartilhamento, não teríamos sido capazes de usar todos eles.
O ZFS é ideal ao tentar desenvolver armazenamento em um servidor que pode conter vários dispositivos e compartilhá-lo pela rede. No entanto, não teria sido possível aproveitar todas as vantagens se não houvesse pelo menos dois dispositivos separados. Com dispositivos mais, temos desempenho melhor.
Espero que você esteja pronto para explorar esse sistema de arquivos e o ache tão útil quanto eu acho.
Aprender
-
OpenIndiana Um sistema operacional UNIX de software livre e desenvolvido pela comunidade que suporta plenamente ZFS.
-
Illumos Uma bifurcação da comunidade e totalmente aberta do sistema operacional OpenSolaris
-
Nexenta OS Combines o kernel Unix original para ZFS e o gerenciador de pacote Debian/Ubuntu (aptitude).
-
ZFS in Ubuntu, um guia wiki que descrever o trabalho em Ubuntu.
-
ZFS Best Practices
-
FreeBSD Um guia completo sobre ZFS em FreeBSD.
-
History and features of ZFS
-
ZFS vs other RAIDs
- Eventos interessantes: confira futuras conferências, exposições e webcasts interessantes para desenvolvedores de software livre IBM.
- Zona de software livre do developerWorks: você encontra muitas informações sobre instruções, ferramentas e atualizações de projetos para ajudá-lo a desenvolver com tecnologias de software livre e usá-las com produtos da IBM.
Obter produtos e tecnologias
- Versão de teste do software IBM: inove o seu próximo projeto de desenvolvimento de software livre usando software para teste, disponível para download ou em DVD.
Discutir
- comunidade do developerWorks: Conecte-se a outros usuários do developerWorks enquanto explora os blogs, fóruns, grupos e wikis voltados para desenvolvedores. Ajude a desenvolver o grupo Software livre
do mundo real na comunidade do developerWorks.

Alfredo Deza é engenheiro de software, ex-atleta profissional e olímpico com forte formação em administração de sistema. Ele é apaixonado por software livre e é orador regular em grupos de tecnologia local e conferências internacionais, como a PyCon. Em seu tempo livre, ele tenta melhorar suas habilidades com a fotografia e gosta de contribuir para projetos de software livre.