X
  • ZFS |
    May 31, 2008

RAID-Z

A promessa original do RAID (Redundant Arrays of Inexpensive Disks) era que proporcionaria armazenamento rápido e confiável usando discos baratos. A palavra-chave era barato; contudo, de alguma forma fomos parar aqui. Por que?

O RAID-5 (e outros esquemas de paridade/dados, como RAID-4, RAID-6, par-ímpar e paridade diagonal de linha) nunca chegou a cumprir a promessa do RAID, nem pode, devido a uma falha fatal conhecida como furo de gravação RAID-5. Sempre que atualizar os dados em uma faixa RAID, você também precisará atualizar a paridade, de forma que a aplicação do operador lógico XOR a todos os discos resulte em zero -- é essa equação que permite reconstruir os dados em caso de falha de um disco. O problema é que não há como atualizar dois ou mais discos de forma atômica, portanto, as faixas RAID podem ser danificadas durante um travamento ou uma falta de energia.

Para verificar isso, suponha que falte energia após a gravação de um bloco de dados, mas antes da gravação do bloco de paridade correspondente. Nesse caso, os dados e a paridade dessa faixa estão inconsistentes e assim permanecerão para sempre (a menos que, em algum momento, os dados antigos sejam substituídos por uma gravação de faixa completa). Portanto, em caso de falha de um disco, o processo de reconstrução RAID gerará lixo na próxima vez em que qualquer bloco dessa faixa for lido. O que é pior, ele fará isso silenciosamente, sem a menor idéia de que está fornecendo dados corrompidos.

Existem soluções alternativas de software para isso, mas elas são tão lentas que o RAID de software desapareceu do mercado. Todos os produtos RAID atuais executam a lógica RAID no hardware, no qual podem usar a NVRAM para sobreviver a faltas de energia. Isso funciona, mas é caro.

Existe também um desagradável problema de desempenho com os esquemas RAID existentes. Quando é feita uma gravação de faixa parcial (ou seja, quando não são atualizados todos os dados contidos em uma única faixa RAID), o sistema RAID precisa ler a paridade e os dados antigos para calcular a nova paridade. Isso acarreta uma enorme queda no desempenho. Enquanto uma gravação de faixa completa pode simplesmente ser feita de forma assíncrona, uma gravação de faixa parcial precisa fazer leituras síncronas antes até mesmo de iniciar as gravações.

Uma vez mais, hardware caro oferece uma solução: uma matriz RAID pode armazenar gravações de faixa parcial em buffer na NVRAM, enquanto aguarda a conclusão das leituras do disco, ocultando, assim, a latência de leitura do usuário. Obviamente isso só funciona até que o buffer da NVRAM fique cheio. Isso não é problema, afirma seu fornecedor de armazenamento! Basta desembolsar mais dinheiro para comprar mais NVRAM. Não existe problema que o dinheiro não resolva.

As gravações de faixa parcial apresentam um outro problema em sistemas de arquivos transacionais como o ZFS. Elas necessariamente modificam dados ativos, o que viola uma das regras que asseguram a semântica transacional. (Não importa que falte energia durante uma gravação de faixa completa, pelo mesmo motivo que não importa que falte energia durante qualquer outra gravação no ZFS: nenhum dos blocos nos quais você está gravando está ativo ainda.)

Se não tivéssemos de fazer essas terríveis gravações de faixa parcial...

Entra em cena o RAID-Z

RAID-Z é um esquema de paridade/dados como o RAID-5, mas com largura de faixa dinâmica. Cada bloco, independentemente do seu tamanho, é a sua própria faixa RAID-Z. Isso significa que cada gravação RAID-Z é uma gravação de faixa completa. Isso, quando combinado com a semântica transacional "copiar ao gravar" do ZFS, elimina o furo de gravação RAID completamente. O RAID-Z também é mais rápido do que o RAID tradicional porque nunca precisa executar operações de leitura-modificação-gravação.

Epa, epa, epa! É isso mesmo? Largura de faixa variável? Nossa, isso parece bem óbvio, mas se é uma idéia tão boa, por que não é adotada por todos?

Bem, o macete está na reconstrução RAID-Z. Como todas as faixas têm tamanhos diferentes, não existe uma fórmula simples como "a aplicação do operador lógico XOR a todos os discos resulta em zero". É preciso percorrer os metadados do sistema de arquivos para determinar a geometria RAID-Z. Observe que isso seria impossível se o sistema de arquivos e a matriz RAID fossem produtos distintos, e essa é a razão pela qual não há nada que se compare ao RAID-Z no mercado de armazenamento atual. É imprescindível uma visão integrada da estrutura lógica e física dos dados para fazer com que funcione.

Mas, espere, você diria: isso não é lento? Não sai caro percorrer todos os metadados? Na verdade, trata-se de um trade-off. Se o pool de armazenamento estiver bem próximo à capacidade máxima, então a resposta é sim, o processo é mais lento. Mas se ele não estiver próximo à capacidade máxima, a reconstrução orientada por metadados será, na verdade, mais rápida porque copia apenas dados ativos, não perdendo tempo com a cópia de espaço não alocado em disco.

Mas muito mais importante é que, à medida que percorre os metadados, o ZFS pode validar cada bloco em relação a uma soma de verificação de 256 bits. Produtos RAID tradicionais não podem fazer isso; eles simplesmente executam uma operação lógica XOR nos dados, às cegas.

O que nos leva ao mais ponto interessante do RAID-Z: dados auto-recuperáveis. Além de gerenciar falhas do disco inteiro, o RAID-Z também detecta e corrige corrupção silenciosa de dados. Sempre que um bloco RAID-Z é lido, o ZFS o compara com sua soma de verificação. Se os discos de dados não retornarem a resposta correta, o ZFS lerá a paridade e, depois, fará a reconstrução combinatória para averiguar qual disco retornou dados inválidos. Em seguida, fará os devidos reparos no disco danificado e retornará dados válidos ao aplicativo. O ZFS também relatará o incidente através do Solaris FMA, para que o administrador do sistema saiba que um dos disco está falhando silenciosamente.

Por fim, observe que o RAID-Z não requer nenhum tipo de hardware especial. Ele não precisa de NVRAM para garantir a correção dos dados, nem precisa de gravação em buffer para oferecer um bom desempenho. Com o RAID-Z, o ZFS torna realidade a promessa original do RAID: oferecer armazenamento rápido e confiável usando discos de consumo baratos.


Para ver um exemplo real do RAID-Z detectando e corrigindo corrupção silenciosa de dados em hardware com problemas, consulte a Saga SATA por Eric Lowe.

O algoritmo RAID-Z atual tem paridade única, mas o conceito RAID-Z funciona para qualquer tipo de RAID. Uma versão de paridade dupla está a caminho.

Um último detalhe com o qual os amigos programadores irão se deleitar: toda a implementação do RAID-Z tem apenas 599 linhas.


Tags Technorati:

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.Captcha
Oracle

Integrated Cloud Applications & Platform Services