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

12

Com o zfs, se você tem copies=2e perde uma unidade que contém algumas dessas cópias, como você diz ao sistema que ele deve fazer uma nova cópia dos blocos de dados dos arquivos afetados? Ou o zfs apenas começa a adicionar blocos de dados para cópias extras assim que descobrir sobre blocos de dados incorretos?

Scrub vai fazer isso?

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

James Moore
fonte

Respostas:

10

"cópias = 2" (ou 3) foi desenvolvido para ser usado com conjuntos sem redundância (disco único ou faixas). O objetivo é recuperar uma pequena corrupção de disco, não uma falha no dispositivo inteiro. Neste último caso, o pool é desmontável, portanto não há idem para a restauração de blocos.

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

jlliagre
fonte
Isso está diretamente em conflito com o que o @Redmumba diz - e o Redmumba fornece links para o código. Você pode citar algumas fontes do que está dizendo? Em particular, eu adoraria ver boas citações do porquê você acha que cópias = N não lidam com falhas de dispositivos inteiros - isso não corresponde a nada que eu tenha lido.
James Moore
1
@ James Moore Após uma falha completa do dispositivo, nenhum bloco idêntico será gravado nesse disco. Não há redundância no nível do pool, portanto não há como substituir o disco defeituoso por um novo. O único método para recuperar adequadamente essa situação seria fazer um backup completo do pool, recriá-lo com dispositivos íntegros e restaurar a partir do backup, garantindo que nenhuma reinicialização não intencional ocorra antes que o primeiro backup seja feito. Caso contrário, o pool pode não ser importável e seus dados perdidos. Isso é um fardo comparado aos pools redundantes, nos quais a recuperação de um disco defeituoso é feita on-line e sobrevive às reinicializações.
Jlliagre
1
Aqui está uma referência: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). Presumo que cópias = 2 ou 3 não sejam consideradas uma configuração redundante.
Jlliagre 12/04/12
1
Um aspecto a ter em mente, porém, é que, se você o tinha originalmente copies=1e o copies=2atualizou, provavelmente desejará resilver / resfrubar posteriormente - o que criará essas instâncias. Mas @jilliagre está correto: os mesmos blocos não constituem uma configuração redundante. Não há garantia de que os blocos estejam configurados em outro dispositivo, mesmo se você tiver vários dispositivos em um pool.
Andrew M.
1
o recurso "cópias = N onde N> 1" não se destina a adicionar redundância. destina-se a resolver a corrupção de dados. tudo escrito no zfs é soma de verificação ou hash. quando é lida novamente, a soma de verificação / hash é verificada. se N = 1, uma falha na verificação de soma de verificação / hash resulta em um erro de volta ao aplicativo. se N> 1, uma das outras cópias pode ser consultada e usada para reparar todas as outras cópias.
longneck
9

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

Primeiro, alguma terminologia. Os mesmos blocos (que são o que são essas cópias, em oposição aos espelhos) são criados automaticamente em uma gravação, mas podem ou não estar no mesmo dispositivo virtual (vdev) da cópia original. Por outro lado, os blocos espelhados são sempre refletidos em outro dispositivo virtual.

No entanto, o código refere-se a ambos os tipos de blocos como filhos. Você verá aqui que os mesmos blocos são apenas filhos io_vd == NULL(isso está na função de gravação). Para um bloco espelhado, io_vdseria definido no dispositivo virtual correspondente (seu segundo disco, por exemplo).

Com isso em mente, quando chega à parte de leitura , trata todas as crianças (sejam elas espelhadas ou iguais) como potencialmente inseguras se não contiverem o esperado good_copiese as reescreve conforme necessário . Portanto, parece que a resposta para sua pergunta é: sim, ela será reescrita quando você tiver pelo menos uma boa cópia e uma das seguintes opções:

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

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

Andrew M.
fonte
1
O problema está na resposta da @ jlliagre - a piscina está morta se perder algum dispositivo. O fato de a piscina ainda ter blocos de idem suficientes não parece importar. Alguma maneira de contornar isso?
James Moore
4
@JamesMoore, você pode forçar a matriz on-line em um estado degradado se o primeiro 1 MB do dispositivo falhar. Presumivelmente, você só precisa dos metadados do dispositivo com falha. Eu testei isso com um zpool no estilo jbod e funciona: recuperando etiquetas quebradas do raidz . Eu fiz um md5sum antes e depois da quebra do zpool, e somente o sistema de arquivos cópias = 1 foi quebrado após a importação. Os sistemas de arquivos = 2 e cópias = 3 corresponderam perfeitamente.
Jodie C
2

@jlliagre e outros que parecem pensar que o zpool inteiro morre se um dos discos (vdevs) morre, mas o pool não é redundante (mirror / raidz). Isso não é verdade; um pool de vários discos sempre sobreviverá a uma única falha de disco completa, mesmo que não seja um espelho ou um RAIDZ.

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

Quando houver cópias suficientes de dados para acessar um arquivo (sejam essas cópias dos mesmos blocos, espelhos ou raidz), todas as cópias ausentes de dados serão reparadas quando o arquivo for acessado. Esse é o objetivo da limpeza; leia todos os dados e corrija todos os problemas usando 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 experimentar facilmente os conceitos criando pools cujos vdevs para backup de armazenamento são apenas arquivos esparsos comuns. Ao excluir ou corromper os arquivos vdev, você pode simular qualquer tipo de falha e verificar a integridade do pool, sistemas de arquivos e dados ao longo do caminho.

EDIT: após a experimentação, parece que o zfs falhará no pool se um disco falhar em um pool não redundante de vários discos com cópias> = 2. A corrupção de dados paritais em um ou mais discos deve permanecer sobrevivível e deve ser corrigida por uma limpeza.

Aaron B
fonte
O mais assustador desses tipos de experimentos é que eles são ótimos para me dizer que uma instalação falhará imediatamente ou pelo menos rapidamente. Eles não são ótimos para me dizer que uma instalação falhará ocasionalmente. De qualquer forma, não está claro como você recupera um pool com falha; Tentei configurar um pool como este com três arquivos esparsos e remover um dos arquivos esparsos parece ser fatal para o pool inteiro. O zpool replace não substitui o arquivo com falha, o zpool scrub para em 5% (e esses são pools muito pequenos) e a página de erro em illumos.org/msg/ZFS-8000-5E não é otimista.
James Moore
Tive um resultado semelhante às minhas experiências, feitas somente após a minha resposta. Normalmente, uso apenas o raidz e respondia com base em informações do que eu acreditava serem fontes credíveis (blogs da oracle). Não acredito mais que um pool do tipo JBOD com vários discos, com cópias> 1, possa sobreviver a uma falha no disco.
Aaron B