Administração de Sistemas

RAID por software com mdadm: níveis, criação e recuperação

• 6 min de leitura

RAID por software com mdadm: níveis, criação e recuperação
RAID (Redundant Array of Independent Disks) combina múltiplos discos físicos em uma unidade lógica para melhorar desempenho, redundância ou ambos. Três técnicas fundamentais sustentam os diferentes níveis: striping (distribuição de dados em blocos entre discos), espelhamento (cópia idêntica dos dados em dois ou mais discos) e paridade (cálculo matemático que permite reconstruir dados perdidos).

RAID por software com mdadm: níveis, criação e recuperação

1. Introdução ao RAID por Software e ao mdadm

RAID (Redundant Array of Independent Disks) combina múltiplos discos físicos em uma unidade lógica para melhorar desempenho, redundância ou ambos. Três técnicas fundamentais sustentam os diferentes níveis: striping (distribuição de dados em blocos entre discos), espelhamento (cópia idêntica dos dados em dois ou mais discos) e paridade (cálculo matemático que permite reconstruir dados perdidos).

O RAID pode ser implementado de três formas: hardware (controladora dedicada com processador próprio), firmware (controladora híbrida que usa recursos da CPU) e software (gerenciado inteiramente pelo sistema operacional). O mdadm é a ferramenta padrão no Linux para RAID por software, oferecendo controle total sem custo adicional de hardware.

Vantagens do RAID por software com mdadm: flexibilidade para criar qualquer nível, independência de fabricante, custo zero, suporte a discos de diferentes tamanhos (limitado pelo menor), e recursos avançados como spare disks e expansão online.

Desvantagens: maior consumo de CPU (especialmente em RAID 5/6 com paridade), complexidade no boot se não configurado corretamente, e dependência do kernel para funcionamento.

2. Níveis de RAID Suportados pelo mdadm

RAID 0 (striping): dados divididos em blocos e distribuídos entre discos. Oferece alto desempenho de leitura/escrita, mas zero tolerância a falhas — a perda de um disco destrói todo o array. Ideal para cache ou dados temporários.

RAID 1 (espelhamento): cada bloco é escrito em dois ou mais discos. Leitura paralela melhora desempenho, e o array continua funcionando com um disco falho. Capacidade útil é igual ao menor disco.

RAID 5 (paridade distribuída): striping com paridade distribuída entre todos os discos. Tolerância a uma falha. Capacidade útil = (N-1) × menor disco. Exige CPU para cálculos de paridade.

RAID 6 (paridade dupla): similar ao RAID 5, mas com dois conjuntos de paridade. Tolerância a duas falhas simultâneas. Capacidade útil = (N-2) × menor disco.

RAID 10 (espelhamento + striping): combina RAID 1 e RAID 0. Dados são espelhados em pares e depois distribuídos em striping. Oferece bom desempenho e tolerância a múltiplas falhas (desde que não no mesmo espelho). Capacidade útil = (N/2) × menor disco.

3. Planejamento e Preparação para Criação de Arrays

Antes de criar um array, identifique os discos disponíveis:

# Listar discos e partições
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

# Verificar detalhes de um disco específico
fdisk -l /dev/sdb

Instale o mdadm se necessário:

# Debian/Ubuntu
apt update && apt install mdadm

# RHEL/CentOS/Fedora
dnf install mdadm

Considerações importantes:
- Chunk: tamanho do bloco de striping (padrão 512KB). Valores menores favorecem acesso aleatório; maiores, acesso sequencial.
- Número de discos: mínimo varia por nível (RAID 0: 2, RAID 1: 2, RAID 5: 3, RAID 6: 4, RAID 10: 4).
- Spare disks: discos reservas que entram automaticamente em caso de falha.

4. Criação de Arrays RAID com mdadm

A sintaxe básica para criar um array é:

mdadm --create /dev/md0 --level=<nível> --raid-devices=<N> /dev/sdX1 /dev/sdY1 ...

Exemplo 1: RAID 0 com dois discos

# Criar partições (opcional, pode usar discos inteiros)
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0% 100%
# Repetir para /dev/sdc

# Criar array RAID 0
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1

# Formatar e montar
mkfs.ext4 /dev/md0
mount /dev/md0 /mnt/raid0

Exemplo 2: RAID 1 com dois discos e um spare

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 --spare-devices=1 /dev/sdd1
mkfs.xfs /dev/md1
mount /dev/md1 /mnt/raid1

Exemplo 3: RAID 5 com três discos

mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 --chunk=256
mkfs.ext4 /dev/md5
mount /dev/md5 /mnt/raid5

Exemplo 4: RAID 10 com quatro discos

mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mkfs.btrfs /dev/md10
mount /dev/md10 /mnt/raid10

Após a criação, atualize a configuração:

# Salvar configuração
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

# Atualizar initramfs
update-initramfs -u   # Debian/Ubuntu
dracut -f             # RHEL/CentOS/Fedora

5. Gerenciamento e Monitoramento de Arrays em Operação

Verificação de status:

# Status resumido
cat /proc/mdstat

# Detalhes completos
mdadm --detail /dev/md0

Adicionar ou remover spare disks:

# Adicionar spare
mdadm /dev/md0 --add /dev/sde1

# Remover disco (se falho)
mdadm /dev/md0 --fail /dev/sdb1
mdadm /dev/md0 --remove /dev/sdb1

Arquivo de configuração:

# /etc/mdadm/mdadm.conf típico
ARRAY /dev/md0 metadata=1.2 UUID=xxxx:xxxx:xxxx:xxxx name=host:0
ARRAY /dev/md1 metadata=1.2 UUID=yyyy:yyyy:yyyy:yyyy name=host:1

6. Recuperação e Reparo de Arrays com Falhas

Identificação de falhas:

# Monitorar eventos
mdadm --monitor --scan --syslog

# Verificar discos com problemas
cat /proc/mdstat
# Se mostrar (F) ao lado de um disco, ele falhou

Substituição de disco defeituoso:

# 1. Marcar disco como falho
mdadm /dev/md0 --fail /dev/sdb1

# 2. Remover disco falho
mdadm /dev/md0 --remove /dev/sdb1

# 3. Adicionar novo disco (pode ser o mesmo substituído)
mdadm /dev/md0 --add /dev/sdf1

# A recuperação (resync) começa automaticamente.
# Monitore o progresso:
watch -n 1 cat /proc/mdstat

Reconstrução após reinicialização:

Se o array não montar automaticamente:

# Tentar montar diretamente
mount /dev/md0 /mnt

# Se falhar, reassemblar manualmente
mdadm --assemble --scan

# Ou especificar os discos
mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1

Recuperação de superbloco corrompido:

# Forçar reassembly ignorando superbloco
mdadm --assemble --force /dev/md0 /dev/sdb1 /dev/sdc1

7. Boas Práticas e Considerações Finais

  • Backup é obrigatório: RAID protege contra falha de disco, não contra exclusão acidental, corrupção de dados ou desastres.
  • Teste de integridade: use fsck periodicamente e verifique smartmontools para monitorar saúde dos discos.
  • Limitações: RAID por software consome CPU (especialmente RAID 5/6). Em servidores com processadores antigos, pode impactar desempenho. O boot pode ser complexo se o initramfs não incluir o mdadm.
  • Alternativas modernas: Btrfs e ZFS oferecem RAID integrado com checksums e snapshots, mas com maior complexidade. Para ambientes Linux tradicionais, mdadm continua sendo a solução mais estável e amplamente suportada.

Cenários recomendados:
- RAID 1: sistemas críticos com poucos discos (servidores de banco de dados pequenos).
- RAID 5/6: armazenamento de grande capacidade com orçamento limitado (NAS caseiro).
- RAID 10: alto desempenho e redundância (servidores de virtualização).
- RAID 0: apenas para dados descartáveis (cache de renderização).

Referências

💬 Comentários
Mais em Administração de Sistemas