Aumente / redimensione o RAID ao atualizar o tamanho visível dos discos

10

Originalmente, criei um RAID de software usando um controlador que só podia endereçar 2 TB por disco. Os discos são de 3 TB. Funcionou bem, mas usou apenas os primeiros 2 TB de cada disco.

Agora mudei o controlador para ver os 3 TB completos. Por isso, também gostaria /dev/md0de usar os últimos 1 TB.

Eu tentei:

# mdadm --grow /dev/md0 --size=max
mdadm: component size of /dev/md0 has been set to 2147479552K

Mas como você pode ver, só vê os 2TB. Se eu tentar forçá-lo mais alto:

# mdadm --grow /dev/md0 --size=2147483648
mdadm: Cannot set device size for /dev/md0: No space left on device

Então, de alguma forma, o sistema pode ver os discos com 3 TB (pol /proc/partitions), mas o RAID não pode vê-los com 3 TB.

detalhes do mdadm:

# mdadm --detail /dev/md0
/dev/md0:
    Version : 1.2
Creation Time : Fri Mar  2 15:14:46 2012
 Raid Level : raid6
 Array Size : 38654631936 (36863.93 GiB 39582.34 GB)
Used Dev Size : 2147479552 (2048.00 GiB 2199.02 GB)
Raid Devices : 20
Total Devices : 21
Persistence : Superblock is persistent

Update Time : Wed Apr 25 19:47:09 2012
      State : active
Active Devices : 20
Working Devices : 21
Failed Devices : 0
Spare Devices : 1

     Layout : left-symmetric
 Chunk Size : 4096K

       Name : node5:1
       UUID : 8603c3df:b740ba22:8c9c82fd:a18b3133
     Events : 845

Number   Major   Minor   RaidDevice State
  20      65       32        0      active sync   /dev/sds
   1      65       64        1      active sync   /dev/sdu
   2      65       80        2      active sync   /dev/sdv
   3      65       96        3      active sync   /dev/sdw
   4       8      192        4      active sync   /dev/sdm
   5       8       32        5      active sync   /dev/sdc
   6       8       48        6      active sync   /dev/sdd
   7       8       64        7      active sync   /dev/sde
   8       8       80        8      active sync   /dev/sdf
   9       8       96        9      active sync   /dev/sdg
  10       8      112       10      active sync   /dev/sdh
  11       8      128       11      active sync   /dev/sdi
  12       8      144       12      active sync   /dev/sdj
  13       8      160       13      active sync   /dev/sdk
  14       8      176       14      active sync   /dev/sdl
  15       8      208       15      active sync   /dev/sdn
  16       8      224       16      active sync   /dev/sdo
  17       8      240       17      active sync   /dev/sdp
  18      65        0       18      active sync   /dev/sdq
  19      65       16       19      active sync   /dev/sdr

  21      65       48        -      spare   /dev/sdt

Tamanhos de disco:

# cat /proc/partitions |grep 2930266584
   8       48 2930266584 sdd
   8       32 2930266584 sdc
   8      112 2930266584 sdh
   8       96 2930266584 sdg
   8       80 2930266584 sdf
   8      128 2930266584 sdi
   8      176 2930266584 sdl
   8       64 2930266584 sde
  65       32 2930266584 sds
   8      192 2930266584 sdm
   8      144 2930266584 sdj
  65       80 2930266584 sdv
   8      224 2930266584 sdo
   8      208 2930266584 sdn
   8      160 2930266584 sdk
   8      240 2930266584 sdp
  65        0 2930266584 sdq
  65       64 2930266584 sdu
  65       16 2930266584 sdr
  65       48 2930266584 sdt
  65       96 2930266584 sdw

Editar:

# mdadm --version
mdadm - v3.1.4 - 31st August 2010
# uname -a
Linux lemaitre 3.2.0-0.bpo.1-amd64 #1 SMP Sat Feb 11 08:41:32 UTC 2012 x86_64 GNU/Linux

O RAID6 usa os discos completos (ou seja, sem partições)

Esta manhã, o sistema travou. Após uma reinicialização, o sistema não encontrou o RAID (o que foi terrível). Todos os discos apareceram como peças de reposição (S):

cat /proc/mdstat 
Personalities : 
md0 : inactive sdr[20](S) sds[21](S) sdq[18](S) sdp[17](S) sdo[16](S) sdn[15](S) sdl[14](S) sdk[13](S) sdj[12](S) sdi[11](S) sdh[10](S) sdg[9](S) sdf[8](S) sde[7](S) sdd[6](S) sdc[5](S) sdm[4](S) sdv[3](S) sdu[2](S) sdt[1](S)
      42949652460 blocks super 1.2

Mesmo aqui, fica claro que mdadmnão encontrou o tamanho de 3 TB.

Corri mdadm --stop /dev/md0. Removida a entrada em /etc/mdadm/mdadm.conf. Ran mdadm -A --scan --force, que fez com que o RAID ficasse online e reconstruísse.

Ole Tange
fonte
Você está usando 20 discos inteiros para RAID6 - correto? Não há partição em cada disco? O que fdisk -l /dev/sddmostra? Qual sistema operacional você está usando, qual é a versão mdadm?
Nils

Respostas:

5

Eu bisbilhotei / sys e fiquei muito mais perto da resposta.

# cd /sys/block/md0/md
# cat component_size
2147479552

Isso concorda com o que vimos antes. Mas isso:

# grep . dev-sd*/size
dev-sdc/size:2147482623
dev-sdd/size:2147482623
dev-sde/size:2147482623
dev-sdf/size:2930265560
dev-sdg/size:2147482623
dev-sdh/size:2147482623
dev-sdi/size:2147482623
dev-sdj/size:2147482623
dev-sdk/size:2147482623
dev-sdl/size:2147483648
dev-sdm/size:2147482623
dev-sdn/size:2147482623
dev-sdo/size:2147482623
dev-sdp/size:2147482623
dev-sdq/size:2147482623
dev-sdr/size:2147482623
dev-sds/size:2147482623
dev-sdt/size:2147482623
dev-sdu/size:2147482623
dev-sdv/size:2147482623
dev-sdw/size:2930265560

parece explicar por que o RAID vê o tamanho errado: a maioria das unidades aparece como 2 TB, enquanto as 2 que foram substituídas aparecem como 3 TB. Todas as unidades são do mesmo modelo, então vamos ver se podemos alterar o tamanho percebido:

# parallel echo 2930265560 \> ::: dev-sd*/size
# grep . dev-sd*/size
dev-sdc/size:2930265560
dev-sdd/size:2930265560
dev-sde/size:2930265560
dev-sdf/size:2930265560
dev-sdg/size:2930265560
dev-sdh/size:2930265560
dev-sdi/size:2930265560
dev-sdj/size:2930265560
dev-sdk/size:2930265560
dev-sdl/size:2930265560
dev-sdm/size:2930265560
dev-sdn/size:2930265560
dev-sdo/size:2930265560
dev-sdp/size:2930265560
dev-sdq/size:2930265560
dev-sdr/size:2930265560
dev-sds/size:2930265560
dev-sdt/size:2930265560
dev-sdu/size:2930265560
dev-sdv/size:2930265560
dev-sdw/size:2930265560

Voila. Component_size ainda é pequeno, no entanto:

# cat component_size
2147479552

Talvez isso possa ser alterado pelo mdadm:

# mdadm --grow /dev/md0 --size=max

Infelizmente, isso trava mdadme o acesso subsequente ao / dev / md0 é bloqueado. E o mesmo acontece com o acesso ao component_size:

# cat component_size   # This blocks

É uma merda. Mas a parte boa é que no syslog diz:

Apr 27 20:45:50 server kernel: [124731.725019] md0: detected capacity change from 39582343102464 to 54010589478912

O sistema de arquivos em / dev / md0 ainda foi executado.

Após uma reinicialização, tive que fazer 'mdadm --grow / dev / md0 --size = max' novamente. Então aguarde para resyncconcluir. Novamente, o acesso ao / dev / md0 foi bloqueado. Portanto, mais uma reinicialização, seguida por xfs_growfs /dev/md0e, em seguida, o redimensionamento foi concluído.

Ole Tange
fonte
Eu gostei muito do plug paralelo (1), Ole :) Obrigado pela investigação, apenas encontrei um caso semelhante.
Michael Shigorin
1
Eu acho que "mdadm --update = devicesize" também faria isso, consulte a página do manual: "Isso fará com que o mdadm determine a quantidade máxima de espaço utilizável em cada dispositivo e atualize o campo relevante nos metadados."
Rudimeier
3

Acho que durante a criação o tamanho do dispositivo foi registrado em algum lugar nos metadados. Alterar o controlador não altera os metadados.

Remova o sobressalente do md e adicione-o novamente ao conjunto RAID como uma nova unidade. Você provavelmente precisará remover os metadados (verifique a página do manual --zero-superblock ou limpe todo o disco). Se isso funcionar para um único disco, repita também o procedimento para todas as unidades restantes. Então finalmente faça o --grow.

Não remova discos adicionais até a sincronização terminar!

jippie
fonte
Não está claro para mim se você testou que isso realmente funciona. Uma reconstrução leva cerca de 1,5 dias. A substituição de todas as 20 unidades fará com que a execução fique degradada por um mês inteiro. Quando você escreve "Se isso funciona para um único disco", como você testa se ele funcionou para o disco único?
precisa saber é o seguinte
Não, eu não testei isso, mas já vi alguns problemas de MD antes e tenho algum sentimento sobre como funciona ... e falha. Não tenho unidades com metadados ruins para testá-lo. Estou ciente do longo tempo de sincronização, por isso aconselho a usar o sobressalente. Você possui RAID6, o que significa que 2 unidades podem falhar e você tem um sobressalente. Isso significa um total de 3 unidades que podem falhar antes que você tenha um problema. Você pode verificar com uma única unidade, pelo menos você sabe se esse é o seu problema. Eu tenho apenas informações limitadas sobre sua configuração. Não puxe unidades do seu conjunto RAID se você não está confortável fazendo isso
jippie
Oh, eu entendo sua pergunta. O mdadm avisará que você está tentando adicionar um dispositivo muito maior que os outros. Ele não se importa com alguns bytes, mas avisa quando a diferença é relativamente grande.
jippie
1
Você pode faildirigir, e removedepois zero-superblockremover os metadados. Como o seu conjunto RAID está em uso, você pode adicioná-lo como sobressalente, o que significa que ele não será sincronizado até que outra unidade falhe (que é um comportamento normal), mas funciona apenas para uma única unidade OU para você adde requer uma sincronização. Eu sei que leva uma eternidade. Ou você aceita o fato de que não pode adicionar todo o armazenamento disponível. Uma das vantagens de usar uma tabela de partição que você não utilizou. Não usar uma tabela de partição não é ruim, mas nesse caso em particular teria ajudado.
jippie
1
Veja meu comentário acima: "O mdadm avisará que você está tentando adicionar um dispositivo que é muito maior que os outros".
jippie