Como o ZFS manipula a substituição on-line em um RAID-Z (teórico)

7

Esta é uma questão um pouco teórica sobre o ZFS e o RAID-Z. Usarei uma matriz de paridade única de três discos como um exemplo de clareza, mas o problema pode ser estendido a qualquer número de discos e qualquer paridade.

Suponha que tenhamos discos A, B e C no conjunto e que estejam limpos.

Suponha agora que adicionamos fisicamente o disco D com a intenção de substituir o disco C, e esse disco C ainda está funcionando corretamente e está sendo substituído apenas pela manutenção preventiva. Alguns administradores podem apenas arrancar C e instalar D, que é um pouco mais organizado, pois os dispositivos não precisam alterar os IDs - no entanto, isso deixa a matriz degradada temporariamente e, portanto, suponha que instalemos D sem a necessidade de criar ou remover documentos do C. Solaris. podemos substituir um disco sem primeiro deliná-lo, usando um comando como:

zpool replace pool C D

Isso deve causar um resilvering em D. Digamos que o resilvering prossiga "para baixo" ao longo de um "cursor". (Eu não sei a terminologia atual usada na implementação interna.)

Suponha agora que, no meio da recuperação, o disco A falhe. Em teoria, isso deve ser recuperável, pois acima do cursor B e D contêm paridade suficiente e abaixo do cursor B e C contêm paridade suficiente. No entanto, se isso é ou não recuperável depende de decisões de design internas no ZFS das quais não tenho conhecimento (e que o manual não diz em certos termos).

Se o ZFS continuar enviando gravações para C abaixo do cursor, então estamos bem. Se, no entanto, o ZFS tratar internamente o C como se ele tivesse desaparecido, apenas atualizando D da paridade entre A e B e apenas escrevendo A e B abaixo do cursor, então estamos brindando.

Algumas experiências poderiam responder a essa pergunta, mas eu esperava que talvez alguém aqui já saiba de que maneira o ZFS lida com essa situação. Agradeço antecipadamente por qualquer insight!

    
por Kevin 26.09.2012 / 09:01

3 respostas

6

Testar com um pool baseado em arquivos (v28 no FreeBSD 8.3 usando dispositivos md suportados por arquivos) sugere que ele deve funcionar. Consegui desligar um dos discos restantes enquanto o resilver estava em andamento. Idealmente, seria necessário testar com discos reais e, na verdade, extrair um para ter 100% de certeza, mas o ZFS ficou perfeitamente feliz em me deixar offline no disco.

Antes de colocar off-line no md0, o pool ainda estava totalmente ON-LINE, então parece que o ZFS está apenas espelhando o disco substituído no novo disco, mas ainda tratando todo o lote disponível durante o processo.

    NAME                     STATE     READ WRITE CKSUM
    test                     DEGRADED     0     0     0
      raidz1-0               DEGRADED     0     0     0
        8480467682579886773  OFFLINE      0     0     0  was /dev/md0
        md1                  ONLINE       0     0     0
        replacing-2          ONLINE       0     0     0
          md2                ONLINE       0     0     0
          md3                ONLINE       0     0     0  (resilvering)
    
por 26.09.2012 / 14:52
2

O disco C ainda é usado no RAIDZ exatamente como foi até ser removido do VDev. Como Matt salienta, o ZFS substitui um disco, transformando o disco de substituição em um espelho do substituto e atualizando o disco de substituição. O RAIDZ VDev nunca é degradado e nunca é resilverizado (até que A falhe, o que é totalmente separado da operação de substituição).

    
por 26.09.2012 / 16:35
1

Não tenho certeza se isso é importante.

Na maioria dos casos, você não deveria estar usando RAIDZ , em vez de mirrors ... Se você fizer isso, você deveria estar fazendo isso com um sobressalente.

O redimensionamento falhará se um dos discos em leitura falhar ou estiver indisponível. Igual a um Erro de leitura irrecuperável . O disco C desapareceria até esse ponto ...

    
por 26.09.2012 / 14:09

Tags