X
  • ZFS
    May 30, 2008

Violação desenfreada de camadas?

Guest Author

Andrew Morton chamou o ZFS de "violação desenfreada de camadas" porque combina a funcionalidade de um sistema de arquivos, um gerenciador de volumes e uma controladora RAID. Acho que isso depende de qual é o sentido da palavra violar. Enquanto estávamos projetando o ZFS, observamos que as camadas padrão da pilha de armazenamento induzem a uma grande complexidade desnecessária e lógica duplicada. Descobrimos que ao fatorar um pouco o problema novamente, ou seja, alterar os limites entre as camadas, podemos tornar tudo muito mais simples.

Um exemplo da matemática (minha verdadeira formação) oferece um prólogo útil.

Suponha que você tenha que calcular a soma de n=1 até o infinito, de 1/n(n+1).

Expandindo termo a termo, temos:

        1/(1\*2) + 1/(2\*3) + 1/(3\*4) + 1/(4\*5) + ...

Ou seja,

        1/2 + 1/6 + 1/12 + 1/20 + ...

Até onde essa série infinita pode ser combinada? Pode parecer um problema difícil, mas somente porque não o estamos examinando da perspectiva correta. Se você for sagaz, perceberá que existe uma maneira diferente de expressar cada termo:

        1/n(n+1) = 1/n - 1/(n+1)

Por exemplo,

        1/(1\*2) = 1/1 - 1/2
        1/(2\*3) = 1/2 - 1/3
        1/(3\*4) = 1/3 - 1/4

Dessa forma, nossa soma pode ser expressa como:

        (1/1 - 1/2) + (1/2 - 1/3) + (1/3 - 1/4) + (1/4 - 1/5) + ...

Agora, observe o padrão: cada termo que subtraímos, somamos novamente. Somente no Congresso isso é considerado como trabalho. De modo que, se reorganizarmos os parênteses, ou seja, se violarmos as camadas do problema original desenfreadamente usando a associatividade para fatorar novamente a aritmética de termos adjacentes da série, teremos isto:

        1/1 + (-1/2 + 1/2) + (-1/3 + 1/3) + (-1/4 + 1/4) + ...

ou

        1/1 + 0 + 0 + 0 + ...

Em outras palavras,

        1.

Não é legal?

Os matemáticos têm um termo para designar isso. Quando você reorganiza os termos de uma série de forma que se cancelem, isso é chamado de telescopia, por analogia com um telescópio manual cujos segmentos se encaixam um dentro do outro. Resumindo, é isto que o ZFS faz: ele encaixa os segmentos de uma pilha de armazenamento. É o que nos permite ter um sistema de arquivos, um gerenciador de volumes, RAID com paridade simples e dupla, compactação, instantâneos, clones e muitas outras coisas úteis em apenas 80.000 linhas de código.

Um sistema de armazenamento é mais complexo do que essa analogia simples, mas num nível mais alto, aplica-se a mesma idéia. Você pode encarar uma pilha de armazenamento como uma série de conversões de um esquema de nomeação em outro. Em última instância, é a conversão de um nome de arquivo em um LBA (endereço de bloco lógico) de disco. Normalmente, é parecido com isto:

        sistema de arquivos(superior): nome do arquivo em objeto (inode)
        sistema de arquivos(inferior): objeto em LBA de volume
        gerenciador de volume: LBA de volume em LBA de matriz
        controladora RAID: LBA de matriz em LBA de disco

Essa é a pilha que estamos prestes a fatorar novamente.

Primeiro, observe que a camada de sistema de arquivos tradicional é muito monolítica. Seria melhor separar a parte "nome do arquivo em objeto" (a metade superior) da parte "objeto em LBA de volume" (a metade inferior), de modo que possamos reutilizar o mesmo código da metade inferior para aceitar outros tipos de armazenamento, como objetos e destinos iSCSI, que não têm nomes de arquivo. Assim, as classes de armazenamento podem se comunicar diretamente com a camada de objeto. Isso é mais eficiente do que algo como /dev/lofi, que faz um arquivo POSIX parecer com um dispositivo. Mas, o mais importante é que fornece um novo e poderoso modelo de programação, armazenamento de objetos, sem qualquer código adicional.

Segundo, observe que o LBA de volume fica totalmente sem utilidade. A adição de uma camada de vias indiretas (indirection) normalmente adiciona flexibilidade, mas não é o caso aqui: na verdade, estamos traduzindo do inglês para o francês e daí para o alemão, quando poderíamos simplesmente traduzir diretamente e de maneira fácil do inglês para o alemão. O francês intermediário não tem valor intrínseco. Não é visível para os aplicativos, não é visível para a matriz RAID e não tem qualquer função administrativa. É somente overhead.

Portanto, o ZFS eliminou essa camada inteira. Há somente três camadas distintas no ZFS: ZPL (ZFS POSIX Layer, camada POSIX do ZFS), que fornece a semântica do sistema de arquivos POSIX tradicional; DMU (Data Management Unit, unidade de gerenciamento de dados), que fornece um armazenamento de objetos transacionais para fins gerais e SPA (Storage Pool Allocator, alocador de pool de armazenamento), que fornece a alocação de blocos virtuais e a transformação de dados (replicação, compactação e criptografia imediata). A pilha de conversão geral do ZFS tem esta aparência:

        ZPL: nome do arquivo em objeto
        DMU: objeto em DVA (endereço virtual de dados)
        SPA: DVA em LBA de disco

A DMU permite que tanto o arquivo como o bloco acessem um pool comum de armazenamento físico. O acesso do arquivo se faz por meio do ZPL, enquanto o acesso do bloco é simplesmente um mapeamento direto para um único objeto DMU. Também estamos desenvolvendo novos métodos de acesso a dados que usam os recursos transacionais da DMU de maneiras mais interessantes; falaremos mais sobre isso outro dia.

A arquitetura do ZFS elimina toda uma camada de conversão e, junto com ela, toda uma classe de metadados (LBAs de volume). Ele também elimina a necessidade de controladoras RAID de hardware. Ao mesmo tempo, fornece uma nova interface útil, armazenamento de objetos, que anteriormente era inacessível porque estava escondida dentro de um monolítico sistema de arquivos.

Dessa maneira, não creio ter violado nada. E você?

Join the discussion

Comments ( 1 )
  • Sesli Chat Friday, May 30, 2008

    I wish i can say i understand but no i dont thanks anyways..


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