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
fsckperiodicamente 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
- Documentação oficial do mdadm (Linux man page) — Manual completo com todos os parâmetros e opções do comando mdadm.
- Guia RAID do Ubuntu Server — Tutorial oficial da Canonical sobre criação e gerenciamento de RAID com mdadm no Ubuntu.
- Arch Linux Wiki: RAID — Referência técnica detalhada sobre configuração de RAID por software, incluindo troubleshooting.
- Red Hat Enterprise Linux 8: Configuring and Managing RAID — Documentação oficial da Red Hat com exemplos práticos para ambientes corporativos.
- Tutorial de Recuperação de RAID com mdadm (Linux Journal) — Artigo técnico focado em cenários de falha e procedimentos de recuperação de arrays.