X
  • ZFS
    June 3, 2008

Integridade de dados ponta a ponta do ZFS

Guest Author

A função de qualquer sistema de arquivos se resume a isto: quando solicitado a ler um bloco, ele deve retornar os mesmos dados que foram gravados anteriormente nesse bloco. Se não puder fazer isso, seja porque o disco está off-line ou os dados estão danificados ou adulterados, ele deverá detectar isso e retornar um erro.

Incrivelmente, a maioria dos sistemas de arquivos falha neste teste. Eles dependem do hardware subjacente para detectar e informar erros. Se um disco simplesmente retornar dados inválidos, o sistema de arquivos médio nem mesmo detectará isso.

Mesmo que possamos assumir que todos os dados estejam perfeitos, ainda assim os dados estariam vulneráveis a danos em trânsito: erros da controladora, erros de paridade DMA (acesso direto à memória) e assim por diante. Tudo o que você realmente sabe é que os dados estavam intactos quando saíram do disco. Se você pensar em seus dados como um pacote, isso seria como se a UPS dissesse, "Garantimos que o seu pacote não estava danificado quando nós o pegamos." Não exatamente a garantia que você deseja.

Danos em vôo não são uma mera preocupação acadêmica: mesmo algo tão comum quanto uma fonte de alimentação com defeito pode provocar corrupção silenciosa de dados.

Matrizes de armazenamento caras não conseguem resolver o problema. O caminho de E/S continua muito vulnerável, e ainda mais longo: após sair do disco, os dados precisam sobreviver a quaisquer erros de hardware e de firmware que a matriz ofereça.

E se estiver em uma SAN, você estará usando uma rede projetada por autores de firmware de disco. Que Deus te ajude!

O que fazer? Uma opção é armazenar uma soma de verificação em cada bloco de disco. A maioria das modernas unidades de disco podem ser formatadas com setores que são ligeiramente maiores do que os usuais 512 bytes, normalmente 520 ou 528. Esses bytes extras podem ser usados para armazenar a soma de verificação. Mas fazer bom uso dessa soma de verificação é mais difícil do que parece: a eficácia de uma soma de verificação depende tremendamente do local onde ela estiver armazenada e do momento em que for avaliada.

Em muitas matrizes de armazenamento (consulte o documento Dell|EMC PowerVault para ver um exemplo típico com uma excelente descrição dos problemas), os dados são comparados com sua soma de verificação dentro da matriz. Infelizmente, isso não ajuda muito. Não detecta erros comuns de firmware, como as gravações fantasmas (a gravação anterior não foi feita no disco) porque os dados e a soma de verificação são armazenados como uma unidade, de modo que fiquem consistentes entre si, mesmo quando o disco retornar dados obsoletos. E o restante do caminho de E/S, da matriz até o host, permanece desprotegido. Resumindo, esse tipo de soma de verificação de bloco oferece uma boa maneira de garantir que um produto de matriz não é menos confiável do que os discos que contém, mas isso é tudo.

A abordagem da soma de verificação anexada ao bloco do NetApp parece semelhante, mas é muito mais robusta. Igual a muitas matrizes, o NetApp formata suas unidades com setores de 520 bytes. Em seguida, ele as agrupa em blocos de 8 setores: 4K de dados (o tamanho de bloco do sistema de arquivos WAFL) e 64 bytes da soma de verificação. Quando o WAFL lê um bloco, ele compara a soma de verificação com os dados da mesma maneira como uma matriz o faria, mas há uma importante diferença: ele faz essa comparação após os dados terem percorrido todo o caminho de E/S, de modo a validar que o bloco fez a jornada do disco até a memória sem danos em trânsito.

Esse é um aperfeiçoamento importante, mas ainda não é suficiente. Uma soma de verificação em nível de bloco somente prova que o bloco é consistente consigo mesmo; ela não prova que ele é o bloco correto. Repetindo nossa analogia da UPS, "Garantimos que o pacote que você recebeu não tem danos. Não garantimos que é o seu pacote."

O problema fundamental com todos esses esquemas é que eles não fornecem isolamento contra falhas entre os dados e a soma de verificação que os protege.

Autenticação de dados do ZFS

A integridade de dados ponta a ponta exige que cada bloco de dados seja comparado com uma soma de verificação independente, após os dados terem chegado à memória do host. Não é suficiente saber que cada bloco é meramente consistente consigo mesmo, ou que estava correto em um ponto anterior do caminho de E/S. Nossa meta é detectar todas as formas possíveis de danos, inclusive erros humanos, como trocas em um disco do sistema de arquivos ou erro de digitação dos argumentos para dd(1). (Você já deve ter digitado "of=" quando queria dizer "if=".)

Um pool de armazenamento ZFS é realmente apenas uma árvore de blocos. O ZFS fornece isolamento contra falhas entre os dados e a soma de verificação armazenando a soma de verificação de cada bloco em seu ponteiro de bloco pai, e não no próprio bloco. Cada bloco da árvore contém as somas de verificação de todos os seus filhos, de modo que todo o pool é auto-validante. [O bloco inicial (a raiz da árvore) é um caso especial porque não tem pai; mais sobre como lidar com isso em outra postagem.]

Quando os dados e a soma de verificação não conferem entre si, o ZFS sabe que a soma de verificação é confiável porque a própria soma de verificação faz parte de algum outro bloco que está um nível acima na árvore e que esse bloco já foi validado.

O ZFS usa somas de verificação ponta a ponta para detectar e corrigir corrupção silenciosa de dados. Se um disco retornar dados inválidos de maneira transitória, o ZFS detectará e tentará ler de novo. Se o disco fizer parte de um espelho ou de um grupo RAID-Z, o ZFS detectará e corrigirá o erro: ele usará a soma de verificação para determinar qual cópia está correta, fornecer dados válidos para o aplicativo e reparar a cópia danificada.

Como sempre, observe que a integridade de dados ponta a ponta do ZFS não exige qualquer hardware especial. Você não precisa de discos ou matrizes caras, não precisa reformatar as unidades com setores de 520 bytes e não precisa modificar aplicativos para se beneficiar dela. É totalmente automática e funciona com discos baratos.

Mas espere, pois tem mais!

Os blocos de um pool de armazenamento ZFS formam uma árvore Merkle na qual cada bloco valida todos os seus filhos. As árvores Merkle demonstraram que proporcionam uma autenticação criptograficamente forte para quaisquer componentes da árvore e para a árvore como um todo. O ZFS emprega somas de verificação de 256 bits para cada bloco e oferece funções de soma de verificação que variam entre a simples e rápida fletcher2 (padrão) até a mais lenta, porém segura, SHA-256. Quando se usa um hash criptográfico como o SHA-256, a soma de verificação do bloco inicial fornece uma assinatura digital constantemente atualizada para todo o pool de armazenamento.

Que será muito conveniente se você solicitar à UPS para fazer o traslado.


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