Redundância de discos (RAID1) com Debian Squeeze (para sistemas em produção)

De Eriberto Wiki
Ir para navegação Ir para pesquisar

by (C) João Eriberto Mota Filho <eriberto (a) eriberto pro br>

Artigo criado em: 13 de janeiro de 2011.

Última atualização: veja o rodapé desta página.

Tiny URL ou bit.ly: http://bit.ly/raid1_squeeze_producao



Este tutorial é destinado a quem possui algum sistema já em produção (com Debian Squeeze) e precisa implementar a redundância de dados entre dois HDs (RAID1).

O RAID1

RAID é a sigla de Redundant Array of Independent Drives ou agrupamento redundante de discos independentes. Há vários níveis de RAID, sendo que neste artigo nos interessa o nível um.

No nível um (RAID1), teremos que trabalhar com pares de disco. Neste artigo trabalharemos apenas com um par. Quando um dado é enviado para o disco, na verdade, ele é escrito, ao mesmo tempo, nos dois discos. Caso um dos dois discos falhe, o outro continuará a operar normalmente. Com isso, não teremos a perda de dados e nem da disponibilidade do sistema.

Tendo em vista o baixo custo dos HDs atualmente, é extremamente indicado o uso de RAID1 em todos os ambientes, inclusive em casa.

O cenário deste artigo e as variações possíveis

Neste artigo utilizaremos um cenário onde teremos que espelhar um HD com duas partições: uma que contém a raiz e outra que contém o /home.

A clonagem da partição raiz é um pouco complicada, pois o sistema já está em produção e ela é necessária todo o tempo. Então, procedimentos especiais deverão ser adotados. Já a partição /home será bem mais simples. Não haverá partição de swap, pois partimos do princípio que, atualmente, todos preferem trabalhar com swap em arquivo.

Outras variações que poderão ser implementadas facilmente após o entendimento deste tutorial. Três delas:

  • A existência de uma única partição para todo o sistema, sendo esta espelhada.
  • A existência de várias partições para todo o sistema, sendo todas espelhadas.
  • O espelhamento de apenas algumas partições do sistema, como a que contém o /home, por exemplo.

É importante dizer que a partição que será espelho de outra deverá ter o exato tamanho da original (situação ideal) ou ser maior.

Procedimentos iniciais

Inicialmente, instale o pacote mdadm, que é responsável pela administração do sistema de RAID:

# apt-get install mdadm
Obs: MD é a sigla de Multiple Devices. Essa sigla será muito utilizada a partir de agora. Um exemplo disso é o dispositivo /dev/md0, que será criado adiante.

Considerando que o HD principal seja o /dev/sda e que o segundo HD já esteja disponível como /dev/sdb e, ainda, que os dois discos sejam exatamente do mesmo tamanho, utilizando o comando dd, clone o MBR do primeiro disco para o segundo, de forma que os esquema de particionamento permaneça o mesmo. Para isso, execute o comando:

# dd if=/dev/sda of=/dev/sdb bs=512 count=1
Lembre-se que você poderá adotar outros modelos de implementação, como espelhar apenas uma partição em um disco menor. Neste caso, o particionamento deverá ser feito manualmente, dispensando a cópia com o dd.

O próximo passo será reiniciar a máquina para que os módulos RAID sejam carregados e para que o sistema operacional reconheceça o novo esquema de particionamento do segundo HD. Para isso, execute:

# reboot



Clonagem da partição raiz

A partir de agora, teremos que criar um array RAID (/dev/md0), associar a primeira partição do segundo HD (/dev/sdb1) ao primeiro dispositivo RAID (/dev/md0). Depois disso, como só poderemos escrever em /dev/md0 (e não mais em /dev/sdb1), necessitaremos formatar /dev/md0 e, depois, copiar todos os dados de /dev/sda1 para /dev/md0 (que contém /dev/sdb1).

Para criar o array /dev/md0, associando o /dev/sdb1 ao mesmo, execute:

# mdadm -C /dev/md0 -l 1 -n 2 missing /dev/sdb1
No comando anterior, dissemos que queremos criar o /dev/md0, nível 1 (RAID1), com dois dispositivos (que serão o /dev/sda1 e o /dev/sdb1). Como só iremos adicionar o /dev/sdb1 por enquanto, pois o /dev/sda1 possui o sistema e está ocupado, temos que usar a palavra missing, pois dissemos no comando que seriam adicionados dois dispositivos.

Depois de pressionar o ENTER no comando anterior, surgirá na tela:

mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array?

Para responder à pergunta, pressione a tecla "y" e ENTER. Como resultado, surgirá na tela:

mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Para ver o array criado, utilize o comando:

# cat /proc/mdstat

O resultado será:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active (auto-read-only) raid1 sdb1[1]
      19529656 blocks super 1.2 [2/1] [_U]
      
unused devices: <none>
Observe que foi criado um dispositivo /dev/md0, funcionando como RAID1, e que o mesmo contém o /dev/sdb1.

O próximo passo será formatar o /dev/md0. Usarei o filesystem Ext4 com 0.5% de espaço reservado ao superusuário.

# mkfs.ext4 -m .5 /dev/md0

A seguir, deveremos montar o /dev/md0 em /mnt e copiar o conteúdo da partição raiz (exceto o /home). Para isso, utilizaremos o comando rsync, que permite excluir arquivos e diretórios de uma cópia. Então, inicialmente, instale o rsync:

# apt-get install rsync

Monte o /dev/md0:

# mount /dev/md0 /mnt

Copie tudo, menos o conteúdo do /home (que será colocado em outro array), o conteúdo do próprio /mnt (para evitar um loop de sistema) e o conteúdo do /proc e do /sys (para evitar uma paralisação do sistema):

# rsync -av --exclude=/home/* --exclude=/mnt/* --exclude=/proc/* --exclude=/sys/* / /mnt
Observe que o conteúdo de /proc e de /sys é virtual e estará disponível quando a máquina for reinicializada.

Terminada a cópia, verifique se tudo está ok:

# ls /mnt

Desmonte o /dev/md0:

# umount /dev/md0



Clonagem da partição que contém o /home

Deveremos realizar o mesmo procedimento feito com a partição raiz, em relação à partição que contém o /home, gerando o /dev/md1. Mas por que simplesmente não associamos o /dev/sda2, que contém o diretório /home, ao /dev/md1? Simples: porque o filesystem a ser utilizado tem que ser estabelecido em /dev/md1 e, em consequência, não podemos aproveitar o existente em /dev/sda2.

Para criar o array /dev/md1, associado a /dev/sdb2, utilize o comando:

# mdadm -C /dev/md1 -l 1 -n 2 missing /dev/sdb2

Ao ser feita a pergunta Continue creating array?, responda "y" e ENTER. Depois, verifique se o /dev/md1 foi criado corretamente:

# cat /proc/mdstat

Formate o /dev/md1:

# mkfs.ext4 -m .5 /dev/md1

O próximo passo será copiar todo o conteúdo de /home para o /dev/md1. Assim sendo, monte o /dev/md1 em /mnt e faça a cópia de conteúdo:

# mount /dev/md1 /mnt
# cp -av /home/* /mnt

Verifique se a cópia foi realizada corretamente:

# ls /mnt

Desmonte o dispositivo:

# umount /dev/md1



Adequação do GRUB2

Verificação da sincronização da partição raiz

A sincronização da partição /home

Teste de funcionamento

A troca de um disco danificado

Controle de acessos

<absHTML>

<a href="http://www2.clustrmaps.com/user/9abcc756"><img src="http://www2.clustrmaps.com/stats/maps-no_clusters/bit.ly-raid1_squeeze_producao-thumb.jpg" alt="Locations of visitors to this page" /> </a>


Consulte também o contador abaixo, iniciado em 13 jan. 11, além do gráfico acima.

</absHTML>