Site menu RAID nivel 1 via software em sistemas Linux
e-mail icon
Site menu

RAID nivel 1 via software em sistemas Linux

e-mail icon

Por Luiz Antonio Cassetari Vieira Filho

RAID (Redundant Arrays of Inexpensive Disks), é uma técnica onde os dados ficam armazenados em vários discos para se aumentar a velocidade de acesso/gravação ou/e aumentar a redundância do sistema. Se uma aplicação necessita de uma taxa de I/O muito alta, pode-se ter os dados espalhados em vários HDs e utilizar esses dados em vários HDs ao mesmo tempo. Se um servidor não pode parar por motivo algum, pode-se colocar 2 HDs e copiar tudo que existe em um para o outro. Assim se um dos HDs sofrer algum problema físico, existe uma copia automática em outro HD.

Existem vários tipos de raid. Os mais comuns são os raid de nivel 0, 1 e 5. O raid de nível 0 faz striping dos dados. Ou seja, ele guarda os dados em vários HDs ao mesmo tempo, aumentando a velocidade de I/O. O raid 1, é apenas uma copia de dados. Assim se um HD sofrer algum tipo de pane física, existirá uma copia pronta para entrar em ação. Já o raid 5 é como o raid 0, mas com a redundância do raid 1. Ele grava os dados em vários HDs, entretanto ele guarda a paridade em vários discos. Isso significa que ele sempre vai ter duas copias de qualquer dado que seja gravado no array raid. No caso de um HD morrer, ele ainda vai ter os dados daquele HD espelhados nos outros HDs, sendo possível uma recuperação dos dados.

Obs: RAID NÃO É BACKUP! Se por acidente você digitar um rm -rf /, o sistema irá apagar todos os dados, inclusive das partições espelhadas.

Esse artigo irá tratar do raid nível 1 via software, usando como sistema o Conectiva Linux 9, usando raid em apenas um ponto de montagem.

0: Requerimentos.
Um computador com linux, não precisa ser conectiva, ou conectiva 9, um kernel com suporte a raid (Multi-device support (RAID and LVM) ---> <*> RAID support, <*> RAID-1 (mirroring) mode), o pacote raidtools, e é claro, mais de um HD em seu computador.

1: Instale fisicamente os HDs.
No nosso exemplo iremos usar HDs ide normais, mas em produção seria ideal usar HDs scsi ou ide ATA133. No caso de se usar HD ide, é importante colocar eles em controladoras separadas, pois se a controladora sofrer algum problema, o problema irá se espalhar para os 2 HDs. Mas no nosso teste, os HDs estão na mesma controladora ;)

2: Particione os HDs.
Os HDs não precisam ter as partições do mesmo tamanho, entretanto a partição raid será do tamanho da menor partição.

[root@arp root]# fdisk /dev/hdc

Comando (m para ajuda): n
Comando - ação
   e   estendida
   p   partição primária (1-4)
p
Número da partição (1-4): 1
Primeiro cilindro (1-784, padrão 1):
Usando valor padrão 1
Último cilindro ou +tamanho ou +tamanho M ou +tamanho K (1-784, padrão
784):
Usando valor padrão 784

Comando (m para ajuda):

Criando uma partição

Usando o fdisk, crie uma nova partição com o comando 'n'. No nosso caso, todo o HD será usado como partição raid, por isso foi criada uma partição ocupando todo o HD. O segundo passo é passar a identidade do HD para RAID.

Comando (m para ajuda): t
Selected partition 1
Código hexadecimal (digite L para listar os códigos): fd
O tipo da partição 1 foi alterado para fd (Detecção automática de RAID
Linux)

Comando (m para ajuda):

Alterando a identificação da partição

Usando o comando 't' do fdisk, a identificação da partição pode ser alterada. O código da partição raid no linux é 'fd'. Fazendo essas alterações, saia do fdisk com o comando 'w'. Repita isso com o segundo HD.

3: Crie o /etc/raidtab.
O /etc/raidtab é o arquivo de configuração do sistema raid. É nele em que estão os HDs a serem usados, o nível de raid, etc.

raiddev /dev/md0
        raid-level               1
        nr-raid-disks            2
        persistent-superblock    1
        chunk-size               8

        device                   /dev/hdc1
        raid-disk                0
        device                   /dev/hdd1
        raid-disk               1

O arquivo /etc/raidtab

raid-level é o nível do raid.

nr-raid-disks é o numero de partições que irão participar nesse array.

persistent-superblock é uma opção para armazenar um superbloco em todos os discos do array. Muito importante se usar o / em raid, como será visto em um artigo posterior

chunk-size o numero de bytes no striping.

device a partição raid. O raid via software no linux, olha a partição e não o HD como algumas soluções via hardware. Assim você pode fazer com que um HD participe de mais de um array raid ao mesmo tempo.

raid-disk é a posição do disco no array.

Mais informações, man raidtab

4: Crie o array
Para criar o array raid, use o comando mkraid /dev/md0.

[root@arp root]# mkraid /dev/md0
disk 0: /dev/hdc1, 6297448kB, raid superblock at 6297344kB
disk 1: /dev/hdd1, 10032561kB, raid superblock at 10032448kB
[root@arp root]#

Criando o array propriamente dito

Se a saída foi pelo menos parecida com essa, parabéns ;) Você agora deve estar vendo a luzinha do HD piscando como louca. Os HDs estão sendo sincronizados. Se você quiser acompanhar esse processo, olhe o arquivo /proc/mdstat.

[root@arp proc]# cat mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 hdd1[1] hdc1[0]
      6297344 blocks [2/2] [UU]
      [==>........]  resync = 12.0% (761536/6297344) finish=6.7min
speed=13614K/sec
unused devices: <none>
[root@arp proc]#
Array raid nível 1 sendo criado.

Uma dica legal, é usar um script como esse e ficar olhando o sistema trabalhar ;D

while true; do cat /proc/mdstat; sleep 1; clear; done

Quando o processo acabar, você pode usar o raid como um device normal. Para montar ele, é necessário formatar, exatamente como se faz com um HD comum, mas com a diferença que o processo será espelhado nos 2 HDs.

[root@arp root]# mkfs.ext3 /dev/md0
mke2fs 1.33 (21-Apr-2003)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
788704 inodes, 1574336 blocks
78716 blocks (5.00%) reserved for the super user
First data block=0
49 block groups
32768 blocks per group, 32768 fragments per group
16096 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@arp root]# tune2fs -c0 -i0 /dev/md0
tune2fs 1.33 (21-Apr-2003)
Setting maximal mount count to -1
Setting interval between check 0 seconds
[root@arp root]#

Formatando o device raid

Após a partição formatada, é só colocar ela no fstab e correr pro abraço.

[root@arp mnt]# mount -t ext3 /dev/md0 /mnt/raid
[root@arp mnt]# cd raid
[root@arp raid]# ls
lost+found
[root@arp raid]# mount
/dev/hda2 on / type ext3 (rw)
none on /proc type proc (rw)
/dev/md0 on /mnt/raid type ext3 (rw)
[root@arp raid]# df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/hda2     ext3    9.2G  2.4G  6.4G  27% /
/dev/md0      ext3    5.9G   33M  5.5G   1% /mnt/raid
[root@arp raid]#

Tudo funcionando :D

5: Testando
Para testar nosso array raid, vamos copiar um arquivo cheio de zeros para a partição com raid, e fazer um checksum dele para termos certeza que o arquivo não vai se corromper.

[root@arp raid]# dd if=/dev/zero of=/mnt/raid/zeros count=50 bs=1MB
50+0 registros de entrada
50+0 registros de saída
[root@arp raid]# ls
lost+found  zeros
[root@arp raid]# du -sh zeros
51M     zeros
[root@arp raid]# md5sum zeros
25e317773f308e446cc84c503a6d1f85  zeros
[root@arp raid]#

Criando arquivo cheio de zeros...

Agora pegue uma marreta de 10 kgs, e bata levemente em cima de um dos HDs do array raid, até que se forme um pequeno buraco de uns 15 cm. Se você (ou sua empresa) for como eu e não querer perder permanentemente um dos HDs, apenas retire o cabo de um deles. Se você não quer correr risco algum, desligue o computador, desconecte o cabo, e re-ligue o computador. Se você desligar o HD no quente, normalmente ele irá travar a partição. Isso é completamente esperado, por ser uma solução via software. Ao reiniciar o computador, o sistema irá ler o arquivo /etc/raidtab, e irá verificar os HDs. Como um HD não estará on-line, o raid irá ser iniciado usando apenas um HD. E você não perdeu nenhum dado ;D

[root@arp proc]# cat mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 hdc1[0]
      6297344 blocks [2/1] [U_]

unused devices: <none>
[root@arp proc]#

/proc/mdstat com um HD morto.

Será que não perdemos nenhum dado mesmo?
Vamos montar a partição raid (se é que você já não colocou no fstab) e fazer um checksum daquele arquivo cheio de zeros que fizemos para teste.

[root@arp mnt]# mount /dev/md0 raid
[root@arp mnt]# cd raid
[root@arp raid]# ls
lost+found  zeros
[root@arp raid]# md5sum zeros
25e317773f308e446cc84c503a6d1f85  zeros
[root@arp raid]#

Verificando checksum

O checksum é identico! Nós realmente não perdemos nenhum dado :D Agora vamos digamos que você comprou um HD novo, e quer colocar ele no lugar do HD que você marreteou (ou só tirou o cabo). Em primeiro lugar, crie as partições no HD novo como falado anteriormente. Depois use o comando raidhotadd.

[root@arp root]# raidhotadd /dev/md0 /dev/hdd1
[root@arp root]# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 hdd1[2] hdc1[0]
      6297344 blocks [2/1] [U_]
      [>....................]  recovery =  2.2% (144000/6297344)
finish=6.4min speed=16000K/sec
unused devices: <none>
[root@arp root]#

Reconstruindo o array

Pronto! Agora estamos reconstruindo o array. Para acompanhar o processo, olhe o arquivo /proc/mdstat. Os dados estão sendo copiados de um HD para outro. E você pode usar a partição normalmente enquanto as partições estão sendo reconstruídas, apenas com uma pequena perca de desempenho ;)

Links: Se desejar mais informações, use esses sites.

http://www-106.ibm.com/developerworks/linux/library/l-raid2/index.html
http://www.uni-mainz.de/~neuffer/scsi/what_is_raid.html
http://linas.org/linux/raid.html
http://www.acnc.com/04_01_0p1.html

e-mail icon