Skip to main content

204.1 Configurando RAID


Este tópico trata sobre administração avançada sobre dispositivos de armazenamento, principalmente a administração de RAID implementado em software (como objetivo da LPIC-2, veremos RAID 0, 1 e 5).



RAID - Reduntant Array of Inexpensive Drives


O RAID (Reduntant Array of Inexpensive Drives ou Reduntant Array of Independent Disks) é usado para agrupar dois ou mais discos físicos em apenas 1 disco lógico. O RAID possui alguns níveis, mas todas elas possuem o intuito de criar redundancia para eventuais falhas de HD/SSD.


Os níveis são:

  • 0 - Stripping;
  • 1 - Mirroring
  • 2 até 6
  • RAIDs Híbridos:
    • 01, 10, 50, 100 e JBOD (RAID N + N).

O RAID pode ser implementado via Software ou via Hardware, caso use via Hardware (melhor opção já que possui melhor desempenho, porém, mais caro) o método de gerenciamento vai depender da fabricante da controladora RAID.

No método via Hardware o Linux reconhece o armazenamento como se fosse o disco físico mesmo, nesse caso o processo de RAID fica transparente para o Linux.

No caso de via software, o Linux reconhece ambos e não é transparente!



RAID 0 - Stripping


Nesse nível vamos aumentar a capacidade de armazenamento (é preciso dois ou mais discos), vamos combinar os discos para que virem apenas um único disco no sistema com a somatória da capacidade de todos os discos que estão no pool desse raid. Nesse nível não existe redundância, se perder um único disco, perderá os dados.


RAID0



RAID 1 - Morroring


Nesse nível vamos criar redundancia de disco, aqui os discos são espelhados, ou seja, tudo o que é gravado num disco, também será gravado nos demais, caso um disco seja perdido, teremos a mesma informação daquele disco em outros discos.


raid1



RAID 5 - Distributed parity


Usa o método stripping, mas com paridade distribuída (por isso o nome acima), além disso, é necessário que se tenha pelo menos 3 discos para o funcionamento.


Os dados serão distribuídos entre os discos, assim como no RAID 0, no entanto, existe um dado de paridade que é distribuído entre os discos, mas esse dado de paridade nunca ficará no mesmo disco de onde ele guarda a informação (essa informação é sempre de outro disco).


Quando um arquivo é gravado no disco, ele será dividido entre todos os discos do pool, nesse processo, um bit de paridade será anexado nos discos onde ele não guarde a informação.

O bit de paridade é uma combinação dos bits referente a um determinado dado que foi escrito em todos os discos menos no último do pool de discos. Se perder dois ou mais discos, vamos perder tudo.


Uma visão macro do RAID 5, apenas vendo pela parte de armazenamento:

RAID5-macro


Com RAID 5 sempre vamos perder um disco de armazenamento para Paridade, na prática, os bits de paridade estão divididos entre todos os discos do pool de RAID 5, mas numa visão mais macro, sempre vamos perceber como se tivessemos perdido um disco.


RAID01


Veja abaixo dois exemplos, ambos representando os blocos e a distribuição dos bits de paridade, lembrando que o exemplo abaixo é ilustrativo.

  • Cenário com 3 discos

    RAID5-details_3disks


  • Cenário com 4 discos

    RAID5-details_4disks



MDADM


Vamos instalar o programa mdadm para gerencia o RAID como software no Linux.

# Instale o mdadm:
$ sudo apt install -y mdadm


Criando RAID 5


Precisamos definir as partições/discos com o tipo 0xFD (Linux Raid Auto). Vamos criar um RAID 0:

# Criando o RAID 0:
$ sudo mdadm -v -C /dev/md0 -l0 -n4 /dev/vdb /dev/vdc /dev/vdd /dev/vde
mdadm: chunk size defaults to 512K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

## -v = Verbose;
## -C = --create - Cria;
## -l X = Raid 0 - nível do RAID que vamos usar;
## -n X = --raid-devices - Quantos dispositivos vamos incluir no RAID;

## Agora podemos verificar se criou o disco lógico no sistema.
# Usando o comando LSBLK:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 128G 0 disk
├─vda1 252:1 0 487M 0 part /boot
├─vda2 252:2 0 1.9G 0 part [SWAP]
└─vda3 252:3 0 125.6G 0 part /
vdb 252:16 0 10G 0 disk
└─md0 9:0 0 20G 0 raid0
vdc 252:32 0 3G 0 disk
└─md0 9:0 0 20G 0 raid0
vdd 252:48 0 5G 0 disk
└─md0 9:0 0 20G 0 raid0
vde 252:64 0 2G 0 disk
└─md0 9:0 0 20G 0 raid0

# Usando o comando FDISK:
$ sudo fdisk -l /dev/md0
Disk /dev/md0: 19.99 GiB, 21437087744 bytes, 41869312 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 2097152 bytes

# Usando o próprio MDADM:
$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Jul 12 00:51:22 2022
Raid Level : raid0
Array Size : 20934656 (19.96 GiB 21.44 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Tue Jul 12 00:51:22 2022
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : original
Chunk Size : 512K

Consistency Policy : none

Name : LPIC2:0 (local to host LPIC2)
UUID : 04da79bc:ec2d4c21:a2f2727d:c967b2cc
Events : 0

Number Major Minor RaidDevice State
0 252 16 0 active sync /dev/vdb
1 252 32 1 active sync /dev/vdc
2 252 48 2 active sync /dev/vdd
3 252 64 3 active sync /dev/vde

MD0 é igual a Multiple Devices 0.


Com os discos no sistema do RAID, podemos formatar para começar a usar:

$ sudo mkfs.ext4 /dev/md0
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 5233664 4k blocks and 1310720 inodes
Filesystem UUID: 2ab411e0-dfcf-4ffd-a000-8b9f19469189
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

# Agora pode montar e usar:
$ sudo mount /dev/md0 /mnt/

# Verifique se montou:
$ df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/md0 20G 45M 19G 1% /mnt

Vamos ver um comando para listar os MDs que temos no sistema:

$ sudo mdadm -v --detail --scan
ARRAY /dev/md0 level=raid0 num-devices=4 metadata=1.2 name=LPIC2:0 UUID=04da79bc:ec2d4c21:a2f2727d:c967b2cc
devices=/dev/vdb,/dev/vdc,/dev/vdd,/dev/vde

# Agora inclua no sistema para subir o RAID no boot:
$ sudo bash -c 'mdadm -v --detail --scan >> /etc/mdadm/mdadm.conf'

Se você nao anexar no arquivo, quando subir a máquina ela terá um nome diferente de md0, normalmente junta com o nome da máquina ficando /dev/md/$HOSTNAME:0.



MDSTAT


Arquivo usado para ver informações sobre RAID gerenciados pelo mdadm, principalmente qual RAID o sistema suporta.

$ sudo cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid0 vde[3] vdd[2] vdc[1] vdb[0]
20934656 blocks super 1.2 512k chunks

unused devices: <none>


Criando RAID 1


Vamos criar um RAID 1, para isso, é recomendado (forte recomendado) que todos os discos possuam a mesma capacidade de armazenamento e RPM:

$ sudo mdadm -v -C /dev/md0 -l1 -n4 /dev/vdb /dev/vdc /dev/vdd /dev/vde
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
mdadm: size set to 10476544K
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
vagrant@LPIC2:~$

# Veja a configuração do RAID 1:
$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Jul 12 01:18:52 2022
Raid Level : raid1
Array Size : 10476544 (9.99 GiB 10.73 GB)
Used Dev Size : 10476544 (9.99 GiB 10.73 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Tue Jul 12 01:19:02 2022
State : clean, resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Consistency Policy : resync

Resync Status : 12% complete

Name : LPIC2:0 (local to host LPIC2)
UUID : 652631c2:6df46bb4:7bbd68aa:81df7bac
Events : 2

Number Major Minor RaidDevice State
0 252 16 0 active sync /dev/vdb
1 252 32 1 active sync /dev/vdc
2 252 48 2 active sync /dev/vdd
3 252 64 3 active sync /dev/vde

# Verificando no mdstat:
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 vde[3] vdd[2] vdc[1] vdb[0]
10476544 blocks super 1.2 [4/4] [UUUU]

unused devices: <none>

Como todos possuem 10GB, temos 4 discos em espelho, ou seja, mesmo dado sendo replicado para 4 discos.


Se atente para a respresentação de RAID 1:

  • 10476544 blocks super 1.2 [4/4][UUUU]

    Vermelho são os ativos e azul a quantidade total.

    • [4/4]

      Quatro dispositivos estão ativos num total de 4.

    • [4/3]

      Três dispositivos estão ativos num total de 4, possível falha de disco nesse caso.

    • [UUUU]

      Cada U representa um disco que está Up.

      • [UUU_]

        Três discos estão Up e um está em falha.


Podemos simular uma falha com o comando abaixo:

# -f ou --fail são similares.
$ sudo mdadm --manage --fail /dev/md0 /dev/vdd
mdadm: set /dev/vdd faulty in /dev/md0

# Verifique com mdadm:
$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Jul 12 01:18:52 2022
Raid Level : raid1
Array Size : 10476544 (9.99 GiB 10.73 GB)
Used Dev Size : 10476544 (9.99 GiB 10.73 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Tue Jul 12 01:28:19 2022
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0

Consistency Policy : resync

Name : LPIC2:0 (local to host LPIC2)
UUID : 652631c2:6df46bb4:7bbd68aa:81df7bac
Events : 19

Number Major Minor RaidDevice State
0 252 16 0 active sync /dev/vdb
1 252 32 1 active sync /dev/vdc
- 0 0 2 removed
3 252 64 3 active sync /dev/vde

2 252 48 - faulty /dev/vdd

# Verifique com mdstat:
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 vde[3] vdd[2](F) vdc[1] vdb[0]
10476544 blocks super 1.2 [4/3] [UU_U]

unused devices: <none>


Gerenciando RAIDs


Vamos ver como parar, iniciar e mais algumas opções.

Vamos remover um disco:

$ sudo mdadm /dev/md0 -r /dev/vdd
mdadm: hot removed /dev/vdd from /dev/md0

# Verifique com mdstat:
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 vde[3] vdc[1] vdb[0]
10476544 blocks super 1.2 [4/3] [UU_U]

unused devices: <none>

Vamos adicionar um disco:

$ sudo mdadm /dev/md0 -a /dev/vdd
mdadm: added /dev/vdd

# Verifique com mdstat:
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 vdd[4] vde[3] vdc[1] vdb[0]
10476544 blocks super 1.2 [4/3] [UU_U]
[===>.................] recovery = 15.2% (1601664/10476544) finish=0.6min speed=228809K/sec

unused devices: <none>
## Assim que sobe começa a fazer o sync!
## Depois de um tempo:
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 vdd[4] vde[3] vdc[1] vdb[0]
10476544 blocks super 1.2 [4/4] [UUUU]

unused devices: <none>

Pare a execução do RAID:

$ sudo mdadm --stop /dev/md0 
mdadm: stopped /dev/md0

Inicie a execução do RAID de novo:

$ sudo mdadm --assemble --run /dev/md0 
mdadm: /dev/md0 has been started with 4 drives.

Caso tenha parado o RAID sem ter a configuração no arquivo, pode subir ele com o comando abaixo:

$ sudo mdadm --assemble --scan 
mdadm: /dev/md/0 has been started with 3 drives (out of 4).
mdadm: Found some drive for an array that is already active: /dev/md/0
mdadm: giving up.

A opção --assemble é muito usada para gerenciar os RAIDs, podemos fazer rebuild, sync e muito mais.


Podemos remoer o RAID:

$ sudo mdadm --remove /dev/md0

# Agora pare a execução:
$ sudo mdadm --stop /dev/md0
mdadm: stopped /dev/md0

Examine um disco que está dentro de um RAID:

$ sudo mdadm --examine /dev/vdc
/dev/vdc:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 2f0cbed5:5c91fe68:772be113:d1d62daf
Name : LPIC2:0 (local to host LPIC2)
Creation Time : Tue Jul 12 01:35:41 2022
Raid Level : raid1
Raid Devices : 4

Avail Dev Size : 20953088 (9.99 GiB 10.73 GB)
Array Size : 10476544 (9.99 GiB 10.73 GB)
Data Offset : 18432 sectors
Super Offset : 8 sectors
Unused Space : before=18280 sectors, after=0 sectors
State : clean
Device UUID : 1df89a91:873aedb7:3f6724fd:b63694ce

Update Time : Tue Jul 12 01:40:31 2022
Bad Block Log : 512 entries available at offset 136 sectors
Checksum : cbd6a42a - correct
Events : 41


Device Role : Active device 1
Array State : AAAA ('A' == active, '.' == missing, 'R' == replacing)