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

23

Eu tenho um array RAID5 de software (Linux md) em 4 discos.

Eu gostaria de substituir um dos discos por um novo, sem colocar o array em um estado degradado e, se possível, on-line. Como aquilo seria possível?

É importante porque eu não quero:

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

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

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

    
por Totor 07.05.2013 / 03:05

3 respostas

31

Usando o mdadm 3.3

Desde mdadm 3.3 (lançado em 2013, 3 de setembro), se você tiver um 3.2+ kernel , você pode proceder da seguinte forma:

# 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 opção --with é opcional, se não especificada, qualquer reserva disponível será usada.

Versão mais antiga do mdadm

Observação: você ainda precisa de um 3.2 + kernel .

Primeiro, adicione uma nova unidade como sobressalente (substitua md0 e sdc1 pelo RAID e pelo dispositivo de disco, respectivamente):

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

Em seguida, inicie uma operação de substituição de cópia como essa ( sdd1 sendo o dispositivo com falha):

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

Resultado

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

Nota: crédito vai para frostschutz e Ansgar Esztermann que encontrou a solução original (veja o questestão duplicada ).

Kernels mais antigos

Outras respostas sugerem:

  • A abordagem do Johnny : : converta a matriz para RAID6, "substitua" o disco e, em seguida, volte para RAID5,
  • abordagem : remova brevemente o disco da matriz RAID5, torne-o parte de um RAID1 (espelho) com o novo disco e adicione essa unidade espelhada de volta ao array RAID5 (teórico) ...
por 06.12.2013 / 18:40
3

Se você não se importar em executar o RAID-6 (2 discos de paridade em vez de 1), e se estiver executando o mdadmin 3.1.x ou superior, você poderá converta sua matriz RAID-5 em RAID-6 para adicionar um disco de paridade adicional. Isso irá colocar o array 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 defeito e, quando ele falhar, você ainda terá proteção de paridade para o array. Eu acho que você pode converter o array do RAID6 de volta ao RAID5 se você 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 é necessário marcá-la como falha ao substituí-la. Sua ideia de cópia do dd pode ser a maneira de fazer isso.

    
por 07.05.2013 / 03:31
2

Isso pode ser possível atendendo aos requisitos

  1. on-line
  2. não force nenhum disco, exceto o disco que será substituído

Mas mesmo que o seguinte possa funcionar, 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) dos discos OLD e NEW: mdadm --build /dev/md42 --level=mirror --raid-devices=2 /dev/OLD /dev/NEW
  3. Coloque o RAID-1 de volta na matriz (em vez de / dev / OLD): mdadm --manage /dev/raid5 --re-add /dev/md42

O que deve :-) acontecer:

  1. O RAID-5 recebe / 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/mdstat ou 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 tudo estiver bem, sobrescreva os superblocos mdraid em / dev / OLD para evitar problemas: mdadm --zero-superblock

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

    
por 07.05.2013 / 03:58