sábado, 26 de fevereiro de 2011

Instalando e configurando um sistema RAID 1 no Debian Lenny ou qualquer outra distribuição linux

Introdução

Este artigo foi baseado nos seguintes sites:

1. Implementando RAID1 em um sistema sem perder dados - Devin
2. Corrigindo falhas e solucionando problemas de RAID no Ubuntu Intrepid (Ubuntu 8.10) « Andre Ferraro

e nas várias tentativas que fiz de fazer, usando vários caminhos que não deram certo.

O que é RAID?

(texto retirado de: Entendendo os Níveis de RAID (Redundant Array of Inexpensive Disks), texto de Danilo Montagna)

RAID é um acróstico de Redundant Array of Independent Drives - Conjunto Redundante de Discos Independente. Num bom português, o RAID é um sistema que utiliza de vários discos rígidos para criar uma redundância nos dados armazenados. Ao invés de ficar em apenas 1 HD, os dados são replicados em outros, ou seja, se um dos HDs falhar, outro HD assume até que o primeiro seja trocado e o sistema novamente sincronizado.

Tipos de RAID

RAID 0 - striping sem tolerância à falha

Este nível tem o nome de "striping". Os dados do computador são divididos entre dois ou mais discos rígidos, o que oferece uma alta performance de transferência de dados, porém não oferece segurança de dados, pois caso haja alguma pane em um disco rígido, todo o conteúdo gravado neles irá ser perdido. O RAID 0 pode ser usado para se ter uma alta performance, porém não é indicado para sistemas que necessitam de segurança de dados.

É possível usar de dois a quatro discos rígidos em RAID 0, onde os mesmos serão acessados como se fosse um único disco, aumentando radicalmente o desempenho do acesso aos HDs. Os dados gravados são divididos em partes e são gravados por todos os discos. Na hora de ler, os discos são acessados ao mesmo tempo. Na prática, temos um aumento de desempenho de cerca de 98% usando dois discos, 180% usando 3 discos e algo próximo a 250% usando 4 discos. As capacidades dos discos são somadas. Usando 4 discos de 10 GB, por exemplo, você passará a ter um grande disco de 40 GB.

Este modo é o melhor do ponto de vista do desempenho, mas é ruim do ponto de vista da segurança e da confiabilidade, pois como os dados são divididos entre os discos, caso apenas um disco falhe, você perderá os dados gravados em todos os discos. É importante citar que neste nível você deve usar discos rígidos idênticos. É até possível usar discos de diferentes capacidades, mas o desempenho ficará limitado ao desempenho do disco mais lento.

RAID 1 (mirror e duplexing)

O RAID 1 também é conhecido como "espelhamento", ou seja, os dados do computador são divididos e gravados em dois ou mais discos ao mesmo tempo, oferecendo, portanto, uma redundância dos dados com segurança contra falha em disco. Esse nível de RAID tende a ter uma demora maior na gravação de dados nos discos, pelo fato da replicação ocorrer entre os dois discos instalados, mais sua leitura será mais rápida, pois o sistema terá duas pontes de procura para achar os arquivos requeridos.

Neste nível são utilizados dois discos, sendo que o segundo terá uma cópia idêntica do primeiro, ou seja, um CLONE. Na prática, será como se existisse apenas um único disco rígido instalado, pois o segundo seria usado para espelhamento dos dados gravados no primeiro - mas caso o disco principal falhe por qualquer motivo, você terá uma cópia de segurança armazenada no segundo disco. Este é o modo ideal se você deseja aumentar a confiabilidade e a segurança do sistema.

Um detalhe importante em RAID 1 é que, caso os dois discos estejam na mesma IDE, (1º em master e o 2º em slave), você teria que resetar o micro caso o primeiro disco quebrar, usando um disco por IDE a placa fará a troca automaticamente, sem necessidade de reset.

RAID 10 (mirror e striping com alta performance)

O RAID 10 pode ser usado apenas com 4 discos rígidos. Os dois primeiros trabalharão em modo Striping (aumentando o desempenho), enquanto os outros dois armazenarão uma cópia exata dos dois primeiros, mantendo uma tolerância à falhas. Este modo é na verdade uma junção do RAID 0 com o RAID 1 e é muito utilizado em servidores de banco de dados que necessitem alta performance e tolerância à falhas.

RAID 0+1 (alta performance com tolerância)

Ao contrário do que muitos pensam, o RAID 0+1 não é o mesmo que o RAID 10: embora ambos exijam no mínimo quatro discos rígidos para operarem e funcionam de uma maneira similar, o RAID 0+1 e tem a mesma tolerância à falha do RAID 5. No RAID 0+1, se um dos discos rígidos falhar, ele se torna essencialmente um RAID 0

RAID 2 (ECC)

Este nível de RAID é direcionado para uso em discos que não possuem detecção de erro de fábrica. O RAID 2 é muito pouco usado uma vez que os discos modernos já possuem de fábrica a detecção de erro no próprio disco.

RAID 3 (cópia em paralelo com paridade)

O RAID 3 divide os dados, a nível de byte, entre vários discos. A paridade é gravada em um disco em separado. Para ser usado este nível, o hardware deverá possuir este tipo de suporte implementado. Ele é muito parecido com o RAID 4.

RAID 4 (paridade em separado)

O RAID 4 divide os dados, a nível de "blocos", entre vários discos. A paridade é gravada em um disco separado. Os níveis de leitura são muito parecidos com o RAID 0, porém a gravação requer que a paridade seja atualizada toda as vezes que ocorrerem gravações no disco, tornando-a mais lenta a gravação dos dados no disco. O RAID 4 exige no mínimo três discos rígidos.

RAID 5 (paridade distribuída)

O RAID 5 é comparável ao RAID 4, mas ao invés de gravar a paridade em um disco separado, a gravação é distribuída entre os discos instalados. O RAID 5 aumenta a velocidade em gravações de arquivos pequenos, uma vez que não há um disco separado para a paridade. Porém como o dado de paridade tem que ser distribuído entre todos os discos instalados, durante o processo de leitura, a performance deverá ser um pouco mais lenta que o RAID 4. O RAID 5 exige no mínimo três discos rígidos.

Existem outros RAID que são utilizados em menor escala e/ou são baseados naquele acima mencionados:

RAID 6 (dupla paridade)

É essencialmente uma extensão do RAID 5 com dupla paridade

RAID 7 (altíssima performance)

As informações são transmitidas em modo assíncrono que são controladas e cacheadas de modo independente, obtendo performances altíssimas.

RAID 53 (alta performance)

É essencialmente um RAID 3 com cinco discos rígidos.

Com certeza pode-se afirmar que o Sistema de arquitetura RAID é o mais utilizado entre empresas que querem manter segurança de dados em seus servidores. Algumas soluções são bastante caras, mas permitem um nível de segurança compatível com o investimento realizado.

Descrição do RAID feito por Danilo Montagna - obrigado pelo texto!

Montando o sistema RAID

Depois de analisar o cenário que estamos inseridos, optei pelo RAID 1. Fazer a redundância entre 2 HDs resolvia eficientemente nosso problema.

Nosso hardware:
  • Pentium dual core
  • 4 gigas de RAM
  • 2 HDS sata de 500 gigas
  • placa mãe asus

Instalando o Debian no primeiro HD, /dev/sda

A instalação do Debian não tem segredo. Os passos não serão descritos aqui neste artigo. Um artigo, aqui mesmo do VOL trata detalhadamente do assunto: Instalação do Debian GNU/Linux - Passo a passo

No meu caso específico, a instalação foi default, a única interação de minha parte foi no particionamento:
  • /dev/sda1 - / - raiz - ext3 - 300.1 gigas
  • /dev/sda5 - /home - ext3 - 198 gigas
  • /dev/sda6 - swap - 2 gigas

Instalação do mdadm

Depois de instalado o Debian, a instalação do pacote mdadm é fundamental para a configuração do RAID.

# apt-get install mdadm

Configurando o HD e as partições

Depois de instalado o mdadm, vamos utilizar o cfdisk para alterar o tipo de filesystem das partições. Durante a criação das partições na instalação, a raiz e o home foram formatadas como ext3 e a memória virtual como swap.

Alteração das partições sda1, sda5 e sda6 para "FD":

# cfdisk /dev/sda

O cfdisk é um dos programas para criação e alteração das partições do HD. Para alterar o tipo de filesystem das partições, depois de executar o comando cfdisk, com as setas do teclado, as setas PARA BAIXO e PARA CIMA, selecione a partição "sda1".

Com as setas PARA A ESQUERDA e PARA A DIREITA, selecione TYPE , serão mostradas todos os filesystens que o Linux suporta, escolha a opção LINUX RAID AUTODETECT, ou digite na caixinha as letras referentes a esta opção: "FD".

Repita a operação para todas partições. Depois é só selecionar a opção ESCREVER. A nova tabela de partições será refeita. Para que as novas configurações sejam efetivadas, vamos reiniciar o micro.

Copiando a tabela de particionamento

Depois de reiniciar, as modificações feitas já foram efetivadas. Como temos dois HDs, temos que fazer o particionamento deste. Uma alternativa é abrir o cfdisk, desta vez trabalhando com o /dev/sdb, ou usar o sfdisk para copiar a tabela de partições do HD master (/dev/sda) para um arquivo txt e depois pegar a tabela de partições descritas neste arquivo e importar para o segundo HD.

É bom lembrar e deixar bem claro que os dois HDs não precisam obrigatoriamente ser do mesmo tamanho, o fundamental é que as partições tenham exatamente o mesmo tamanho. No meu caso, os dois HDs eram exatamente iguais, então a tabela de particionamento é a mesma para ambos. No caso de HDs com tamanhos diferentes, ou mesmo fazer o RAID em uma ou duas partições, o uso do cfdisk talvez seja a opção mais adequada.

Se os dois HDs forem idênticos, é só seguir a próxima etapa. O sfdisk é um manipulador das tabelas de partições do Linux, o "-d" fará um dump do /dev/sda e a saída será redirecionada para /root/partitions.txt.

# sfdisk -d /dev/sda > /root/partitions.txt

Depois é só fazer o caminho inverso, pegar a tabela de particionamento que está descrita no arquivo /root/partitions.txt e jogar no copiar depois a tabela de partições do arquivo partitions.txt para o o segundo HD, (sdb):

# sfdisk /dev/sdb < /root/partitions.txt

Para efetivar as mudanças, reiniciar o computador.

Criando os dispositivos RAID

Com todos os HDs e partições já configurados para trabalharem como RAID, agora está na hora de fazer a configuração.

Relembrando a estrutura criada na hora da instalação do Ubuntu.
  • O /dev/sda tem 3 partições: Raiz, /home e swap
  • O /dev/sdb tem 3 partições: Raiz, /home e swap, feitas a partir do sfdisk.

O RAID irá trabalhar utilizando um dos HDs e suas respectivas partições e atualizando as partições do outro HD, deixando-as sempre em sincronia para uma eventual falha. Desde modo, podemos dizer que a estrutura do RAID será:
  • a raiz é /dev/sda1 e /dev/sdb1
  • o home é /dev/sda5 e /dev/sdb5
  • swap é /dev/sda6 e /dev/sda6

Criando o primeiro dispositivo md0

Até este ponto de nossa instalação, criamos toda a estrutura para que o RAID fosse implementado, mas ele ainda não foi efetivamente feito. A partir de agora usaremos toda a estrutura para implementar o sistema.

O mdadm foi instalado e está pronto para ser usado.

# mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1

A sintaxe e os parâmetros do comando:
  • --create: cria o dispositivo;
  • /dev/md0: ao invés de ser um dispositivo do tipo /dev/md0, ele cria um dispositivo MD, que significa Multiple Device, ou seja, pode-se ter múltiplos dispositivos neste array;
  • --level=1: é o nível do RAID, estamos usando RAID 1
  • --raid-devices=2: número de devices/HDs no RAID. No nosso caso são 2 HDs;
  • missing: uma partição está faltando no array (momentaneamente, depois será adicionada)
  • /dev/sdb1: Partição que será adicionada ao array /dev/md0

Criando o segundo dispositivo md1

Vamos criar agora o /dev/md1. Ele será o /home:

# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb5

Criando o terceiro dispositivo md2

Vamos criar agora o /dev/md2. Ele será a swap:

# mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb6

Vamos reiniciar o sistema para o kernel ler as novas configurações (não é necessário, mas é bom né?).

Depois do reboot, vamos verificar se os novos dispositivos foram criados.

Digite:

# cat /proc/mdstat

Provavelmente eles estarão como: --active (auto-read-only)

Depois de criados o sistema de arquivos os dispositivos (md0 e md1) ficarão: active raid1 sdb1

Criando o sistema de arquivos das partições RAID

Com o segundo HD, e suas respectivas partições, já inserido no array, vamos criar o filesystem para cada uma destas partições.

Criar um filesystem ext3 na partição /dev/md0 - RAIZ:

# mke2fs -j /dev/md0

Cria um filesystem ext3 na partição /dev/md1 - /home:

# mke2fs -j /dev/md1

Criar um filesystem swap na partição /dev/md2:

# mkswap /dev/md2

Copiando o conteúdo do primeiro HD para o segundo

O segundo HD já está pronto, o filesystem já foi criado, mas as partições ainda estão vazias, sem a estrutura de diretórios e seus respectivos arquivos.

Antes de iniciar a cópia dos dados, vamos alterar o menu.lst.

1) Alterar o menu.lst

title           Debian  GNU/Linux, kernel 2.6.24-1-686
root            (hd1,0)
kernel          /vmlinuz-2.6.24-1-686 root=/dev/md0 ro
initrd          /initrd.img-2.6.24-1-686
savedefault

Este é o menu.lst de meu Debian. Em outro Linux, a versão do kernel e do initrd podem ser diferentes.

As alterações ocorreram nas linhas:
root            (hd1,0)
kernel          /vmlinuz-2.6.24-1-686 root=/dev/md0 ro

Esta alteração vai fazer com que o sistema dê o boot pelo /dev/md0, a partição raiz, mas no segundo HD, o hd1,0.

Antes o boot era dado no HD (hd0,0), primeiro HD, primeira partição. Agora é dado no (hd1,0), segundo HD, primeira partição, ou seja, no HD RAID.

Criando o sistema de arquivos das partições RAID - cont

Copiando para o segundo HD (hd1) os dados das partições do primeiro HD (hd0).

Vamos agora copiar os dados do /dev/sda para /dev/sdb. Primeiro vamos montar as partições do segundo HD em /mnt.

Nós temos duas partições com dados: raiz e /home. Primeiro copiaremos a partição raiz.

# cd /mnt
# mkdir raiz
# mount -t ext3 /dev/md0 raiz
# cd raiz
# mkdir initrd mnt proc sys
# cp -a /boot /bin /cdrom /dev /etc /initrd.img /lib /media ./
# cp -a /opt /root /sbin /selinux /srv /tmp /usr /var /vmlinuz ./


Foram criados dentro do diretório raiz algumas pastas, mas não foram copiados para elas nenhum dado. Isto se deu porque estes diretórios são diretórios com conteúdos dinâmicos.

A cópia dos outros diretórios tem o parâmetro "-a". Este parâmetro faz a cópia dos arquivos com suas respectivas permissões.

Seguindo o mesmo raciocínio, copiaremos a partição /home:

# cd /mnt
# mkdir home
# mount -t ext3 /dev/md1 home
# cd home
# cp -a /home/* ./


Este processo de cópia poderá demorar devido o tamanho do HD, então é só esperar.

O próximo passo é alterar o arquivo /etc/fstab que está no diretório /mnt/raiz/etc/fstab. A alteração deste arquivo é importante pois ele montará os devices do sistema. O fstab que foi lido na hora do boot não reflete o novo ambiente com o RAID 1 configurado. No novo fstab, os devices devem ser alterados para md0 e md1. /etc/fstab: proc/procprocdefaults        0       0
/dev/md1/ext3 defaults,errors=remount-ro 0       1
/dev/md1 /home ext3defau02
/dev/sda6        none            swap    sw              0       0
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0    0

Agora é hora de reiniciar o sistema. Com a cópia do conteúdo das partições para o novo HD montado em /mnt, a alteração do menu.lst dando o boot em (HD1,0) e do fstab montando os devices /dev/md0 e /dev/md1 o sistema carregará o novo HD.

É só cruzar os dedos e esperar que dê boot corretamente.

Adicionando o primeiro HD ao RAID 1

Se tudo correu bem, o gdm pediu o usuário e a senha. Depois do login o Debian abriu direitinho. Parece que nada mudou, tudo estava igual como era antes. Mas há um pequeno detalhe, o boot foi dado no segundo HD, recém configurado.

Nós adicionamos inicialmente o segundo HD ao RAID 1, agora com o sistema rodando no segundo HD do RAID, vamos adicionar o primeiro HD.

# mdadm /dev/md0 -a /dev/sda1
# mdadm /dev/md1 -a /dev/sda5
# mdadm /dev/md2 -a /dev/sda6


A adição de cada elemento no RAID pode demorar dependendo do tamanho da partição. Depois do primeiro comando mdadm que adicionou o /dev/md0 a sincronização começa imediatamente, só depois que terminar a sincronização é que o terminal estará livre para o segundo comando e a sincronia do segundo elemento.

Para verificar o processo de sincronização pode-se usar o comando:

# watch --interval 1 'cat /proc/mdstat'

Este comando lhe passará o conteúdo do arquivo /proc/mdstat (que contém o status atual dos dispositivos RAID do sistema) em um intervalo de 1 segundo.

Depois do término da sincronização pode-se ver o conteúdo o do arquivo /proc/mdstat:

# cat /proc/mdstat

Repita a adição de cada partição.

Instalando o Grub nos dois HDs

Depois da sincronização dos 2 HDs, o /boot/grub/menu.lst deixou de refletir o estado real do sistema, então é fundamental a instalação do grub. Para a instalação, abra um terminal e logue como root.

Digite:

# grub (o programa de configuração do grub é executado)
grub> device (hd0) /dev/sda - habilita o /dev/sda como primeiro HD do sistema
grub> root (hd0,0) - especifica a partição onde está instalado o sistema
grub> setup (hd0) - especifica onde será gravado o grub

Depois é preciso repetir a mesma operação para o segundo HD, o /dev/sdb

grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> setup (hd0)

A diferença na execução dos 2 grupos de comandos é que no primeiro ele assume o /dev/sda como partição de trabalho, no segundo ele assume o /dev/sdb. Isto foi feito para escrever na MBR de cada HD as informações de onde está o /boot.
 

Nenhum comentário:

Postar um comentário