ZFS: Como você restaura o número correto de cópias depois de perder uma unidade?

12

Com o zfs, se você tiver copies=2 e depois perder uma unidade contendo algumas dessas cópias, como informar ao sistema que ele deve fazer uma nova cópia dos blocos de dados para os arquivos afetados? Ou o zfs apenas começa a adicionar blocos de dados para as cópias extras assim que descobre blocos de dados ruins?

O scrub fará isso?

(v0.6.0.56-rc8, pool do ZFS versão 28, sistema de arquivos ZFS versão 5, Ubuntu 11.10)

    
por James Moore 09.04.2012 / 20:22

3 respostas

10

"copies = 2" (ou 3) é mais projetado para ser usado com pools sem redundância (disco único ou listras). O objetivo é recuperar a menor corrupção de disco, e não a falha total do dispositivo. No último caso, o pool é impossível de ser montado, portanto, nenhuma restauração dos blocos idem pode ocorrer.

Se você tem redundância (espelhamento / raidz / raidz2 / raidz3), os blocos idem não são diferentes dos outros e a depuração / resilvering os recriará.

    
por 10.04.2012 / 13:32
9

Eu achei essa pergunta realmente intrigante, e depois de passar uma hora lendo a documentação, mergulhei no código. Aqui está o que eu encontrei.

Primeiro, alguma terminologia. Ditto blocos (que são o que essas cópias são, ao contrário de espelhos) são criados automaticamente em uma gravação, mas podem ou não estar no mesmo dispositivo virtual (vdev) que a cópia original. Por outro lado, os blocos espelhados são sempre refletidos em outro dispositivo virtual.

No entanto, o código se refere aos dois tipos de blocos como filhos. Você verá aqui os blocos ditto são apenas filhos com io_vd == NULL (isso está na função de gravação). Para um bloco espelhado, io_vd seria definido para o dispositivo virtual correspondente (seu segundo disco, por exemplo).

Com isso em mente, quando chegar ao read portion , trata todos os filhos (sejam eles blocos mirror ou idem) como potencialmente inseguros se não contiverem os esperados good_copies e rewrites-los conforme necessário . Por isso, parece que a resposta à sua pergunta é: sim, ela será reescrita quando você tiver pelo menos uma cópia boa e uma das seguintes opções:

  • Erros inesperados quando você tentou ler os dados,
  • Você está atualizando ou
  • Você está esfregando.

Ufa! Talvez alguém possa apontar falhas, mas eu gostei de aprender sobre o ZFS através deste pequeno exercício, e espero que isso ajude!

    
por 10.04.2012 / 08:29
2

@jlliagre e outros que parecem pensar que o zpool inteiro morre se um dos discos (vdevs) morrer, mas o conjunto não é redundante (mirror / raidz). Isso não é verdade; um pool multi-disk irá sempre sobreviver a uma única falha completa no disco mesmo que não seja um mirror ou raidz.

Os Metadados do ZFS são sempre copiados pelo menos 2 vezes, então a falha total de um disco completo (ou qualquer parte dele) não derrubará o sistema de arquivos. Além disso, muitos arquivos, especialmente os menores, não serão distribuídos por todos os discos e, portanto, não necessariamente serão reprovados pela falha do disco. O OP está perguntando sobre o caso de um conjunto de discos múltiplos usando blocos idem (cópias de dados do usuário > 1). Aqui, uma única falha completa do disco deve nunca resultar em perda de dados. O ZFS sempre tentará colocar os blocos idem longe do bloco original, e para conjuntos com vários vdevs , isso sempre significa em outro vdev (uma exceção pode ser quando um vdev é > 50% do conjunto, o que seria muito incomum). Os metadados do sistema de arquivos também são sempre copiados +1 ou +2 vezes mais do que o nível idem , de modo que sempre sobrevive à falha do disco. Além disso, se você tiver um pool com mais de três discos, poderá perder até a metade deles sem perda de dados; O ZFS armazena os blocos idem no próximo disco, contanto que você nunca perca dois discos adjacentes, você nunca terá perda de dados. (três falhas de disco adjuntas para ditto = 2).

Quando houver cópias suficientes de dados para acessar um arquivo (se essas cópias forem de ditto blocks, mirror ou raidz), todas as cópias ausentes dos dados serão reparadas quando o arquivo for acessado. Esse é o objetivo do scrub; leia todos os dados e conserte qualquer que seja ruim fazendo uso de cópias redundantes. Portanto, para responder diretamente à pergunta do OP, basta fazer uma limpeza após a substituição da unidade com falha e todas as cópias serão restauradas.

Como sempre, você pode facilmente experimentar os conceitos criando pools cujos vdevs para o armazenamento de backup são apenas arquivos comuns esparsos. Ao excluir ou corromper os arquivos vdev, você pode simular qualquer tipo de falha e verificar a integridade do pool, dos sistemas de arquivos e dos dados ao longo do caminho.

EDIT: depois de experimentar, parece que o zfs falhará no pool se um disco falhar em um conjunto multi-disco não redundante com cópias > = 2. A corrupção de dados do parital em um ou mais discos deve permanecer viável e deve ser corrigida por um scrub.

    
por 28.07.2015 / 17:39

Tags