Ubuntu RAID (mdadm)
RAID (Redundant Array of Independent Disks, "conjunto redundante de discos independentes") combina vários discos para ganhar segurança (o servidor continua funcionando se um disco quebrar), velocidade ou as duas coisas. No Ubuntu, o RAID por software é feito com o mdadm.
- O que cada nível de RAID (0, 1, 5, 10) oferece e quanto espaço você perde.
- Criar um espelho (RAID 1) com
mdadmnum laboratório seguro. - Ler o
/proc/mdstate saber se o RAID está saudável. - Salvar a configuração para o RAID voltar após reiniciar.
- Simular a quebra de um disco e trocá-lo sem desligar nada.
RAID protege contra disco quebrado. Ele não protege contra arquivo apagado, vírus, erro de comando ou incêndio: um rm errado apaga nos dois discos ao mesmo tempo. Mantenha backups (veja Backup).
Conceito: os níveis de RAID
Cada nível é uma forma diferente de distribuir os dados entre os discos. Na tabela, considere discos de 1 TB:
| Nível | Como funciona | Discos mín. | Espaço útil (4 × 1 TB) | Aguenta perder | Bom para |
|---|---|---|---|---|---|
| RAID 0 | Divide cada arquivo em pedaços, um em cada disco (striping) | 2 | 4 TB | Nenhum disco | Velocidade em dados descartáveis |
| RAID 1 | Cópia idêntica em todos os discos (espelho) | 2 | 1 TB | Todos menos um | Sistema e dados importantes em 2 discos |
| RAID 5 | Dados + informação de paridade espalhada | 3 | 3 TB | 1 disco | Arquivos grandes, muito espaço |
| RAID 6 | Como o 5, com paridade dupla | 4 | 2 TB | 2 discos | Muitos discos grandes |
| RAID 10 | Espelhos (RAID 1) combinados em striping (RAID 0) | 4 | 2 TB | 1 por espelho | Bancos de dados: rápido e seguro |
Paridade é uma conta feita sobre os dados que permite reconstruir o pedaço de um disco que sumiu, a partir dos outros. É o mesmo princípio de saber que, se a + b = 10 e a = 3, então b = 7.
Para quem está começando, o espelho com dois discos iguais é o mais simples de entender, de montar e de consertar. É ele que você vai montar nesta aula.
Laboratório seguro
Crie três "discos" com arquivos e losetup (explicado em LVM). Dois formam o espelho; o terceiro será o "disco novo" da troca.
$ sudo apt install mdadm $ truncate -s 1G r1.img r2.img r3.img $ for f in r1.img r2.img r3.img; do sudo losetup -f --show $f; done /dev/loop20 /dev/loop21 /dev/loop22
Nos exemplos, /dev/sdb, /dev/sdc e /dev/sdd correspondem a /dev/loop20, loop21 e loop22. Use discos do mesmo tamanho: o RAID usa o tamanho do menor.
Criar um espelho (RAID 1)
- sudo mdadm
- "multiple device admin": administra os dispositivos RAID (
/dev/md…). - --create /dev/md0
- Cria um RAID novo chamado
/dev/md0. - --level=1
- O nível: 1 = espelho.
- --raid-devices=2
- Quantos discos participam.
- /dev/sdb /dev/sdc
- Os discos (ou partições).
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
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? y « digite y e Enter
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
O aviso fala de usar o RAID para dar boot; para dados, pode ignorar. O RAID já está funcionando, mas os discos ainda estão sendo sincronizados em segundo plano.
Ler o estado: /proc/mdstat
O /proc/mdstat é um "arquivo" que o kernel mantém com o estado de todos os RAIDs. É o primeiro lugar a olhar.
$ cat /proc/mdstat
Personalities : [raid1] [linear] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc[1] sdb[0] « nome, estado, nível e discos
52395008 blocks super 1.2 [2/2] [UU] « 2 de 2 discos, os dois "Up"
[=====>...............] resync = 27.3% (14304128/52395008) finish=3.1min speed=203612K/sec
unused devices: <none>
| Trecho | Significado |
|---|---|
active raid1 | O RAID está ligado e é um espelho |
sdb[0] sdc[1] | Os discos e sua posição no RAID |
[2/2] | Discos esperados / discos funcionando |
[UU] | Um caractere por disco: U = funcionando (up), _ = faltando |
resync / recovery | Sincronização inicial / reconstrução após troca de disco |
(F) depois do disco | Disco marcado como com defeito (failed) |
Para acompanhar a sincronização ao vivo: watch cat /proc/mdstat (Ctrl+C para sair). Mais detalhes com sudo mdadm --detail /dev/md0:
$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Raid Level : raid1
Array Size : 52395008 (49.97 GiB 53.65 GB)
Raid Devices : 2
Total Devices : 2
State : clean « clean = saudável e sincronizado
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Name : servidor:0 (local to host servidor)
UUID : 6a1c2f4e:9b3d7e10:5c8a2b6f:0d4e1a73
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
Usar o RAID
O /dev/md0 se comporta como um disco único. Formate e monte normalmente:
$ sudo mkfs.ext4 -L espelho /dev/md0 $ sudo mkdir -p /srv/espelho $ sudo mount /dev/md0 /srv/espelho $ df -h /srv/espelho Sist. Arq. Tam. Usado Disp. Uso% Montado em /dev/md0 49G 24K 47G 1% /srv/espelho « 2 discos de 50 GB = 50 GB úteis
É comum usar o /dev/md0 como PV do LVM: o RAID cuida da segurança e o LVM da flexibilidade de tamanho.
Salvar a configuração (essencial)
Sem este passo, depois de reiniciar o RAID pode voltar com outro nome (/dev/md127) ou nem montar. Grave a descrição do RAID no arquivo de configuração e atualize o initramfs, o mini-sistema que o kernel usa no boot.
- sudo mdadm --detail --scan
- Gera uma linha
ARRAY …para cada RAID ativo. - |
- Passa essa linha para o próximo comando.
- sudo tee -a /etc/mdadm/mdadm.conf
- Acrescenta (
-a) a linha no arquivo, com permissão de root.
$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf ARRAY /dev/md0 metadata=1.2 UUID=6a1c2f4e:9b3d7e10:5c8a2b6f:0d4e1a73 $ sudo update-initramfs -u update-initramfs: Generating /boot/initrd.img-7.0.0-38-generic
Depois, adicione o RAID ao /etc/fstab pelo UUID do sistema de arquivos (sudo blkid /dev/md0), como em mount e fstab, com a opção nofail.
Simular um disco com defeito e trocá-lo
Treine isso no laboratório. No dia em que um disco quebrar de verdade, você vai saber o que fazer com calma.
- Marque o disco como defeituoso. Num caso real, o kernel faz isso sozinho.
$ sudo mdadm /dev/md0 --fail /dev/sdc mdadm: set /dev/sdc faulty in /dev/md0 $ cat /proc/mdstat md0 : active raid1 sdc[1](F) sdb[0] « (F) = failed 52395008 blocks super 1.2 [2/1] [U_] « só 1 de 2 funcionandoRepare: o RAID continua
activee os arquivos em/srv/espelhocontinuam acessíveis. Esse é o "modo degradado". - Remova o disco do RAID.
$ sudo mdadm /dev/md0 --remove /dev/sdc mdadm: hot removed /dev/sdc from /dev/md0
- Coloque o disco novo (no laboratório, o
/dev/sdd) e adicione:$ sudo mdadm /dev/md0 --add /dev/sdd mdadm: added /dev/sdd $ cat /proc/mdstat md0 : active raid1 sdd[2] sdb[0] 52395008 blocks super 1.2 [2/1] [U_] [==>..................] recovery = 12.5% (6549376/52395008) finish=4.0min speed=187124K/sec - Espere a reconstrução terminar e confira
[2/2] [UU].
Num servidor real, anote o número de série antes de abrir a máquina: sudo smartctl -i /dev/sdc | grep -i serial (pacote smartmontools). A etiqueta do disco tem o mesmo número.
Ser avisado quando um disco falhar
O mdadm tem um monitor que pode mandar e-mail. Coloque MAILADDR seu@email no /etc/mdadm/mdadm.conf (exige um servidor de e-mail configurado) ou verifique periodicamente com um cron que procure _ no /proc/mdstat.
Outros níveis
A sintaxe é a mesma; mudam o --level e a quantidade de discos:
# RAID 5 com 3 discos $ sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd # RAID 10 com 4 discos $ sudo mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sd[b-e] # RAID 1 com um disco reserva (spare), que entra sozinho se outro falhar $ sudo mdadm --create /dev/md3 --level=1 --raid-devices=2 --spare-devices=1 /dev/sdb /dev/sdc /dev/sdd
No último exemplo, /dev/sd[b-e] é um curinga que vira /dev/sdb /dev/sdc /dev/sdd /dev/sde.
Desmontar o laboratório
$ sudo umount /srv/espelho $ sudo mdadm --stop /dev/md0 mdadm: stopped /dev/md0 $ sudo mdadm --zero-superblock /dev/loop20 /dev/loop21 /dev/loop22 $ sudo losetup -d /dev/loop20 /dev/loop21 /dev/loop22 $ rm r1.img r2.img r3.img
--zero-superblock apaga a marca de RAID dos discos, para que não sejam reconhecidos como RAID no futuro. Lembre de tirar a linha ARRAY do mdadm.conf se ela foi gravada.
Quando não funciona
/dev/md127
$ cat /proc/mdstat md127 : active (auto-read-only) raid1 sdb[0] sdc[1]
O que aconteceu: o RAID não estava no mdadm.conf (ou o initramfs não foi atualizado). O sistema montou mesmo assim, com um nome automático.
Como resolver: faça a seção "Salvar a configuração". Montar pelo UUID no fstab evita depender do nome md0.
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc mdadm: cannot open /dev/sdb: Device or resource busy
O que aconteceu: o disco está em uso: montado, fazendo parte de outro RAID ou de um VG do LVM.
Como confirmar: lsblk /dev/sdb e cat /proc/mdstat.
Como resolver: desmonte, pare o RAID antigo (mdadm --stop) e limpe as marcas (mdadm --zero-superblock ou wipefs -a).
[U_] e ninguém percebeu
O que aconteceu: um disco falhou e o RAID está degradado. Funciona, mas sem proteção: se o segundo disco falhar, os dados se perdem.
Como resolver: troque o disco o quanto antes (seção acima) e configure um aviso. Verifique o estado dos discos com sudo smartctl -H /dev/sdb.
Referência rápida
| Comando | O que faz |
|---|---|
cat /proc/mdstat | Estado de todos os RAIDs |
sudo mdadm --create /dev/md0 --level=N --raid-devices=N DISCOS | Cria um RAID |
sudo mdadm --detail /dev/md0 | Detalhes de um RAID |
sudo mdadm --detail --scan | Linhas para o mdadm.conf |
sudo update-initramfs -u | Atualiza o boot com a nova configuração |
sudo mdadm /dev/md0 --fail DISCO | Marca um disco como defeituoso |
sudo mdadm /dev/md0 --remove DISCO | Tira o disco do RAID |
sudo mdadm /dev/md0 --add DISCO | Adiciona disco (reconstrução automática) |
sudo mdadm --stop /dev/md0 | Para o RAID |
sudo mdadm --zero-superblock DISCO | Apaga a marca de RAID do disco |
Exercícios
1. Criar um espelho
Complete para criar um RAID 1 com dois discos:
2. Trocar o disco
O /dev/sdc foi removido. Complete para colocar o /dev/sdd no lugar:
3. Onde olhar primeiro
Complete o comando que mostra o estado de todos os RAIDs:
4. O /proc/mdstat mostra [2/1] [U_]. O que significa?
5. Quatro discos de 2 TB em RAID 5. Quanto espaço útil?
Resumo
- RAID 1 espelha, RAID 0 só acelera (sem proteção), RAID 5/6 economizam espaço com paridade, RAID 10 é rápido e seguro.
mdadm --createcria;/proc/mdstatmostra a saúde:[UU]bom,[U_]degradado.- Salve sempre:
mdadm --detail --scannomdadm.conf+update-initramfs -u. - Troca de disco:
--fail→--remove→--add→ esperar a reconstrução. - RAID não substitui backup.