Eu criei 3 arrays RAID0 usando o mdadm em 3 Rackspace CloudServers usando CloudBlockStorage da Rackspace como seus dispositivos. Cada matriz possui seu próprio conjunto de volumes CBS. O RS-CBS tem um limite superior de 1 TB para suas unidades e eu precisava de armazenamento maior. Um dos servidores é para armazenamento de dados, o segundo é um espelho ao vivo desse servidor e o terceiro é um instantâneo noturno. Eu criei o array em cada um dos servidores usando este comando:
mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/xvdb1 /dev/xvdd1 /dev/xvde1
Quando chegou a hora de aumentar o array, e como essa foi a primeira vez que desenvolvi um, comecei no servidor menos crítico: o servidor de instantâneos. Eu adicionei um novo volume e, com um pouco de brincadeira, surgiu com este comando:
mdadm --grow /dev/md0 --raid-devices=4 --add /dev/xvdf1
De acordo com a página do manual do mdadm, ele diz que você não é capaz de desenvolver um RAID0, então o mdadm o converte em RAID4, cresce e converte de volta. (Nunca converte de volta, mas isso é outro problema). O array é reformulado, mas o tamanho nunca muda. Minha suposição é que a nova unidade acabou se tornando a unidade de paridade para a matriz. Então, para obter o espaço de que preciso, adicionei outro volume:
mdadm --grow /dev/md0 --raid-devices=5 --add /dev/xvdg1
Isso remodela e me dá os 500 GB extras que eu esperava, então eu faço o resize2fs /dev/md0
e estou pronto para ir; 2 TB de espaço.
Então é aí que a estranheza acontece. Eu mudo para crescer a matriz no servidor espelho. Sabendo das etapas anteriores que precisarei adicionar dois volumes para obter o espaço extra de que preciso, uso este comando:
mdadm --grow /dev/md0 --raid-devices=5 --add /dev/xvdf1 /dev/xvdg1
Ele é reformulado e tudo parece bem, mas quando eu faço o resize2fs /dev/md0
seguido por um df -hal
eu vejo que ele cresceu e está reportando 2.5 TB de espaço, não o 2.0 TB que eu esperava. É como se ele não criasse a unidade de paridade que eu assumi que fizesse desde a primeira execução e usei todo o espaço disponível para a matriz.
Uma coisa que parecia diferente foi a saída de mdadm -D /dev/md0
após a reformulação no servidor espelho. Eu vi isso para os dispositivos RAID:
Number Major Minor RaidDevice State
0 202 17 0 active sync /dev/xvdb1
1 202 49 1 active sync /dev/xvdd1
2 202 65 2 active sync /dev/xvde1
5 202 97 3 active sync /dev/xvdg1
4 202 81 4 active sync /dev/xvdf1
5 0 0 5 removed
A saída de cat /proc/mdstat
mostra que ele foi convertido em RAID4:
Personalities : [raid0] [raid6] [raid5] [raid4]
md0 : active raid4 xvdg1[5] xvdf1[4] xvdd1[1] xvdb1[0] xvde1[2]
2621432320 blocks super 1.2 level 4, 512k chunk, algorithm 5 [6/5] [UUUUU_]
unused devices: <none>
Então, minhas preocupações são ... eu cresci o primeiro array (servidor de snapshots) incorretamente e ele deveria ter obtido 2,5 TB, mas meu erro só deu 2,0 TB? Ou eu cresci o segundo array (mirror server) incorretamente e não tenho a unidade de paridade que eu pensei que iria conseguir? O que posso fazer ou o que devo fazer para aumentar consistentemente essas matrizes?