Como substituir com segurança um disco que ainda não falhou em uma matriz RAID5 do Linux?

26

Eu tenho uma matriz RAID5 de software (Linux md) em 4 discos.

Gostaria de substituir um dos discos por um novo, sem colocar a matriz em um estado degradado e, se possível, online. Como aquilo seria possível?

É importante porque eu não quero:

  • corre o risco de estressar os outros discos, para que um possa travar durante a reconstrução,
  • corre o risco de estar em um "estado sem paridade", para que eu não tenha uma rede de segurança por algum tempo.

Suponho que fazê-lo on-line seja muito exigente e eu deveria apenas copiar ( dd) os dados do disco antigo para o novo offline e substituí-lo, mas acho que é teoricamente possível ...

Algum contexto : todos esses discos estão girando quase continuamente há mais de 5,5 anos. Eles ainda funcionam perfeitamente no momento e são aprovados no (longo) autoteste SMART. No entanto, tenho motivos para pensar que um desses 4 discos não durará muito mais tempo (suposta falha preditiva).

Totor
fonte

Respostas:

36

Usando o mdadm 3.3

Desde mdadm3.3 (lançado em 3 de setembro de 2013), se você possui um kernel 3.2+ , pode proceder da seguinte maneira:

# mdadm /dev/md0 --add /dev/sdc1
# mdadm /dev/md0 --replace /dev/sdd1 --with /dev/sdc1

sdd1é o dispositivo que você deseja substituir, sdc1é o dispositivo preferido para fazer isso e deve ser declarado como sobressalente em sua matriz.

A --withopção é opcional, se não for especificado, qualquer reposição disponível será usada.

Versão mais antiga do mdadm

Nota: Você ainda precisa de um kernel 3.2+ .

Primeiro, adicione uma nova unidade como sobressalente (substitua md0e sdc1por seu RAID e dispositivo de disco, respectivamente):

# mdadm /dev/md0 --add /dev/sdc1

Em seguida, inicie uma operação de cópia-substituição como esta ( sdd1sendo o dispositivo com falha):

# echo want_replacement > /sys/block/md0/md/dev-sdd1/state 

Resultado

O sistema copiará todos os blocos legíveis de sdd1para sdc1. Se se trata de um bloco ilegível, ele será reconstruído a partir da paridade. Quando a operação estiver concluída, o antigo sobressalente (aqui sdc1:) ficará ativo e a unidade com falha será marcada como com falha (F) para que você possa removê-lo.

Nota: o crédito é destinado a frostschutz e Ansgar Esztermann, que encontraram a solução original (consulte a pergunta duplicada ).

Núcleos mais antigos

Outras respostas sugerem:

  • A abordagem de Johnny : converta a matriz para RAID6, "substitua" o disco e depois volte para RAID5,
  • A abordagem de Hauke ​​Laging : remova brevemente o disco da matriz RAID5, faça parte de um RAID1 (espelho) com o novo disco e adicione essa unidade de espelho de volta à matriz RAID5 (teórica) ...
Totor
fonte
2
mdadm --addainda é necessário antes --replaceque funcione. ( mdadm3.3, Ubuntu 15.10). Se você fizer o --addseguinte --replace, a cópia começará assim que uma reposição for adicionada. (O dispositivo permanece marcado como "desejando substituição").
Peter Cordes
3

Pode ser possível atender aos requisitos

  1. conectados
  2. não force nenhum disco, exceto aquele que deve ser substituído

Mas mesmo que o seguinte funcione, você provavelmente não encontrará nenhuma recomendação desse tipo "nos livros" ...

Idéia:

  1. Retire o disco OLD da matriz (por um breve momento): mdadm --manage /dev/raid5 --fail /dev/OLD
  2. Crie um novo dispositivo md (RAID-1) a partir dos discos OLD e NEW: mdadm --build /dev/md42 --level=mirror --raid-devices=2 /dev/OLD /dev/NEW
  3. Coloque o RAID-1 novamente na matriz (em vez de / dev / OLD): mdadm --manage /dev/raid5 --re-add /dev/md42

O que deve :-) acontecer:

  1. O RAID-5 obtém / dev / md42 em sincronia. Isso não deve demorar muito.
  2. O RAID-5 está normalmente operacional novamente (mas mais lento).
  3. / dev / NEW é sincronizado com / dev / OLD.

Assista ao progresso da sincronização ( cat /proc/mdstatou mdadm --monitor). Se a sincronização terminar, retire o RAID-1 do RAID-5, pare o RAID-1, adicione novamente / dev / NEW ao RAID-5. Se estiver tudo bem, substitua os superblocos mdraid em / dev / OLD para evitar problemas:mdadm --zero-superblock

Aviso: A sincronização rápida do RAID-5 pode funcionar apenas se você usar um bitmap. Se você não tiver um, é melhor fazer um teste com um RAID-5 fictício (sem um bitmap) primeiro. Ou adicione um. Pelo menos, adicionar um externo deve ser possível. Caso contrário, pode ser necessário interromper o RAID-5 antes de alterar os dispositivos. Se você inicializar a partir do RAID-5, isso se tornaria um pouco complicado.

Hauke ​​Laging
fonte
3

Se você não se importa de executar o RAID-6 (2 discos de paridade em vez de 1) e se estiver executando o mdadmin 3.1.x ou superior, poderá converter seu array RAID-5 em RAID-6 para adicionar um disco de paridade adicional . Isso colocará a matriz sob estresse durante a reconstrução, no entanto. E isso tem algumas implicações de desempenho, pois há mais discos de paridade para atualizar durante as gravações.

Mas se ele for concluído com êxito, você poderá manter o disco com falha no lugar e, quando finalmente falhar, ainda terá proteção por paridade para a matriz. Eu acho que você pode converter a matriz do RAID6 de volta para o RAID5 se não esperar para mantê-lo como RAID6.

Não conheço uma maneira on-line de manter a matriz como RAID-5 e substituir o disco sem colocar a matriz no modo degradado, pois acho que você deve marcá-lo como falha ao substituí-lo. Sua idéia de cópia em dd pode ser a maneira de fazer isso.

Johnny
fonte
@haukelaging FYI agora é possível desde o kernel 3.2, veja minha resposta .
Totor