# RAID (Redundant Array of Independent Disks)

## 1. Introducció

**RAID** (*Redundant Array of Independent Disks*, anteriorment *Inexpensive Disks*) és una tecnologia que combina múltiples discos durs o SSD en una única unitat lògica per aconseguir un o més d'aquests objectius:

- **Redundància:** protecció contra la pèrdua de dades per fallada d'un disc.
- **Rendiment:** augment de la velocitat de lectura o escriptura.
- **Capacitat:** combinació de la capacitat de múltiples discos.

> **Important:** RAID **no substitueix** les còpies de seguretat. Protegeix contra fallades de maquinari, però no contra esborraments accidentals, ransomware, incendis o robatoris.



## 2. Tipus d'implementació RAID

| Tipus              | Descripció                                                              |
|--------------------|-------------------------------------------------------------------------|
| **RAID per maquinari** | Controladora RAID dedicada (PCIe, integrada a la placa). La CPU no intervé. Més rendiment i funcions avançades. |
| **RAID per programari** | El sistema operatiu gestiona el RAID (Linux `mdadm`, Windows). Més flexible i econòmic. |
| **RAID híbrid (fakeRAID)** | Controladora bàsica a la placa base amb suport parcial per programari (BIOS RAID). No recomanat per a servidors. |



## 3. Nivells RAID estàndard

### 3.1 RAID 0 — Striping (divisió)

```bash
Disc 1:  [A1][A3][A5][A7]
Disc 2:  [A2][A4][A6][A8]
```

- **Funcionament:** Les dades es distribueixen en blocs alternats entre tots els discos.
- **Discos mínims:** 2
- **Capacitat:** N × mida del disc més petit
- **Rendiment lectura:** ↑↑ (paral·lel)
- **Rendiment escriptura:** ↑↑ (paral·lel)
- **Redundància:** Cap. Si falla **qualsevol** disc, es perden totes les dades.
- **Ús típic:** Edició de vídeo, jocs, cau temporal. Mai per a dades crítiques.

**Resum:**

| Característica  | Valor            |
|-----------------|------------------|
| Redundància     | Cap              |
| Rendiment       | Excel·lent        |
| Capacitat útil  | 100%             |
| Discos mínims   | 2                |



### 3.2 RAID 1 — Mirroring (miralls)

```bash
Disc 1:  [A1][A2][A3][A4]
Disc 2:  [A1][A2][A3][A4]  ← còpia exacta
```

- **Funcionament:** Totes les dades s'escriuen simultàniament a tots els discos (mirall exacte).
- **Discos mínims:** 2
- **Capacitat:** Mida d'un sol disc (la resta és redundància)
- **Rendiment lectura:** ↑ (pot llegir de qualsevol disc)
- **Rendiment escriptura:** = (cal escriure a tots els discos)
- **Redundància:** Pot fallar N-1 discos (amb 2 discos, aguanta 1 fallada).
- **Ús típic:** Sistema operatiu, bases de dades crítiques, servidors on la disponibilitat és prioritària.

**Resum:**

| Característica  | Valor            |
|-----------------|------------------|
| Redundància     | Excel·lent        |
| Rendiment       | Bo (lectura)     |
| Capacitat útil  | 50%              |
| Discos mínims   | 2                |



### 3.3 RAID 5 — Striping amb paritat distribuïda

```bash
Disc 1:  [A1][B1][C1][P4]
Disc 2:  [A2][B2][P3][C2]
Disc 3:  [A3][P2][B3][C3]
Disc 4:  [P1][A4][B4][C4]
           ↑ Paritat distribuïda entre tots els discos
```

- **Funcionament:** Les dades es distribueixen entre tots els discos. La paritat (que permet reconstruir les dades) es distribueix rotatòriament.
- **Discos mínims:** 3
- **Capacitat:** (N-1) × mida del disc més petit
- **Rendiment lectura:** ↑↑ (paral·lel)
- **Rendiment escriptura:** ↓ (cal calcular la paritat)
- **Redundància:** Aguanta la fallada d'**1 disc**.
- **Ús típic:** Servidors de fitxers, NAS, entorns on cal equilibri entre rendiment, capacitat i redundància.

**Resum:**

| Característica  | Valor                   |
|-----------------|-------------------------|
| Redundància     | 1 disc                  |
| Rendiment       | Bona lectura            |
| Capacitat útil  | (N-1)/N × 100%          |
| Discos mínims   | 3                       |

> **Perill de RAID 5:** Durant la reconstrucció després d'una fallada, la càrrega sobre els discos restants és molt alta. Si falla un segon disc durant la reconstrucció, es perden totes les dades. Amb discos grans (>2 TB), el risc és significatiu.



### 3.4 RAID 6 — Striping amb doble paritat

```bash
Disc 1:  [A1][B1][P4][Q4]
Disc 2:  [A2][P3][Q3][B2]
Disc 3:  [P2][Q2][A3][B3]
Disc 4:  [Q1][A4][B4][P4]
           ↑ Doble paritat (P i Q)
```

- **Funcionament:** Com el RAID 5 però amb dos blocs de paritat independents.
- **Discos mínims:** 4
- **Capacitat:** (N-2) × mida del disc més petit
- **Rendiment lectura:** ↑↑
- **Rendiment escriptura:** ↓↓ (càlcul de doble paritat)
- **Redundància:** Aguanta la fallada de **2 discos simultàniament**.
- **Ús típic:** Servidors amb discos grans, entorns crítics que necessiten més protecció que RAID 5.

**Resum:**

| Característica  | Valor                   |
|-----------------|-------------------------|
| Redundància     | 2 discos                |
| Rendiment       | Bona lectura            |
| Capacitat útil  | (N-2)/N × 100%          |
| Discos mínims   | 4                       |



### 3.5 RAID 10 (1+0) — Mirroring + Striping

```bash
           RAID 0 (striping)
          ┌────────────────────┐
    RAID 1│              RAID 1│
  [D1][D2]│            [D3][D4]│
   mirall │             mirall │
```

- **Funcionament:** Primer es fan parelles en mirall (RAID 1), i després s'aplica striping sobre els miralls (RAID 0).
- **Discos mínims:** 4 (nombre parell)
- **Capacitat:** 50% del total
- **Rendiment lectura:** ↑↑↑ (excel·lent)
- **Rendiment escriptura:** ↑↑ (molt bo)
- **Redundància:** Pot fallar 1 disc de cada parella mirall. En el millor cas, poden fallar fins a N/2 discos.
- **Reconstrucció:** Molt ràpida (només cal copiar el mirall).
- **Ús típic:** Bases de dades transaccionals, entorns OLTP, qualsevol aplicació que necessiti alt rendiment i alta disponibilitat.

**Resum:**

| Característica  | Valor                     |
|-----------------|---------------------------|
| Redundància     | Excel·lent                 |
| Rendiment       | Excel·lent                 |
| Capacitat útil  | 50%                       |
| Discos mínims   | 4                         |



### 3.6 Altres nivells RAID

| Nivell | Descripció |
|---|--------|
| **RAID 2** | Striping a escala de bits amb codi Hamming. Obsolet.              |
| **RAID 3** | Striping a escala de bytes amb disc de paritat dedicat. Obsolet.  |
| **RAID 4** | Striping a escala de blocs amb disc de paritat dedicat. Gairebé obsolet. |
| **RAID 01 (0+1)** | Striping primer, mirall després. Menys tolerant a fallades que RAID 10. |
| **RAID 50** | RAID 5 sobre conjunts en RAID 0. Mínim 6 discos.               |
| **RAID 60** | RAID 6 sobre conjunts en RAID 0. Mínim 8 discos.               |



## 4. Comparativa de nivells RAID

| Nivell | Discos mín. | Capacitat útil | Fallades tolerades | Lectura | Escriptura | Ús típic |
|---|---|----|----|---|---|-----|
| RAID 0   | 2           | 100%              | 0                  | ↑↑↑     | ↑↑↑        | Rendiment pur             |
| RAID 1   | 2           | 50%               | N-1                | ↑↑      | =          | Alta disponibilitat       |
| RAID 5   | 3           | (N-1)/N           | 1                  | ↑↑      | ↑          | NAS, fitxers              |
| RAID 6   | 4           | (N-2)/N           | 2                  | ↑↑      | ↑          | Discos grans              |
| RAID 10  | 4           | 50%               | 1 per parella      | ↑↑↑     | ↑↑         | BBDD, alt rendiment       |



## 5. RAID per programari a Linux: `mdadm`

### 5.1 Instal·lació

```bash
# Debian/Ubuntu
sudo apt install mdadm

# Fedora/RHEL
sudo dnf install mdadm

# Arch/Manjaro
sudo pacman -S mdadm
```

### 5.2 Crear un RAID

```bash
# RAID 0 amb 2 discos
sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

# RAID 1 amb 2 discos
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

# RAID 5 amb 3 discos
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

# RAID 6 amb 4 discos
sudo mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# RAID 10 amb 4 discos
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# RAID 5 amb disc de recanvi (spare)
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 \
    --spare-devices=1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
```

### 5.3 Desar la configuració

```bash
# Desar la configuració a /etc/mdadm/mdadm.conf
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

# Actualitzar initramfs (Debian/Ubuntu)
sudo update-initramfs -u
```

### 5.4 Formatar i muntar

```bash
# Formatar el dispositiu RAID
sudo mkfs.ext4 /dev/md0
sudo mkfs.xfs /dev/md0

# Muntar
sudo mount /dev/md0 /mnt/raid

# Afegir a /etc/fstab per al muntatge automàtic
echo "/dev/md0  /mnt/raid  ext4  defaults  0  2" | sudo tee -a /etc/fstab
```

### 5.5 Monitoratge

```bash
# Veure l'estat del RAID
sudo mdadm --detail /dev/md0
cat /proc/mdstat

# Veure informació d'un disc del RAID
sudo mdadm --examine /dev/sdb

# Monitoratge continu
watch -n 1 cat /proc/mdstat
```

Exemple de sortida de `/proc/mdstat`:

```ini
Personalities : [raid1] [raid5] [raid6]
md0 : active raid5 sdb[0] sdc[1] sdd[2]
      2930276352 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>
```

Els estats possibles de cada disc:

| Indicador | Significat                    |
|-----------|-------------------------------|
| `U`       | Disc actiu i en bon estat     |
| `_`       | Disc fallat o absent          |
| `S`       | Disc de recanvi (spare)       |

### 5.6 Gestió de fallades i reconstrucció

```bash
# Marcar un disc com a fallat (simulació o disc defectuós)
sudo mdadm /dev/md0 --fail /dev/sdc

# Treure el disc fallat
sudo mdadm /dev/md0 --remove /dev/sdc

# Afegir un disc nou (reconstrucció automàtica)
sudo mdadm /dev/md0 --add /dev/sde

# Seguir la reconstrucció
watch cat /proc/mdstat
```

Durant la reconstrucció, `/proc/mdstat` mostrarà el progrés:

```ini
md0 : active raid5 sde[3] sdb[0] sdd[2]
      2930276352 blocks super 1.2 level 5 [3/2] [U_U]
      [========>..........]  recovery = 45.3% (443648/976896) finish=12.3min
```

### 5.7 Ampliar el RAID

```bash
# Afegir un disc al RAID 5 (ampliar de 3 a 4 discos)
sudo mdadm --add /dev/md0 /dev/sdf
sudo mdadm --grow /dev/md0 --raid-devices=4

# Redimensionar el sistema de fitxers
sudo resize2fs /dev/md0      # ext4
# o
sudo xfs_growfs /mnt/raid    # xfs
```

### 5.8 Aturar i eliminar un RAID

```bash
# Desmuntar i aturar
sudo umount /mnt/raid
sudo mdadm --stop /dev/md0

# Eliminar les signatures RAID dels discos
sudo mdadm --zero-superblock /dev/sdb
sudo mdadm --zero-superblock /dev/sdc
```



## 6. RAID i ZFS

**ZFS** és un sistema de fitxers avançat que integra RAID de manera nativa (anomenat **RAID-Z**):

| RAID-Z    | Equivalent aprox. | Fallades tolerades |
|-----------|-------------------|--------------------|
| RAID-Z1   | RAID 5            | 1 disc             |
| RAID-Z2   | RAID 6            | 2 discos           |
| RAID-Z3   | —                 | 3 discos           |
| Mirror    | RAID 1            | N-1 discos         |

ZFS afegeix checksums de dades, de duplicació, compressió, snapshots i protecció contra *bit rot* (corrupció silenciosa).

```bash
# Crear un pool RAID-Z1 amb 3 discos
sudo zpool create dades raidz1 /dev/sdb /dev/sdc /dev/sdd

# Veure l'estat
sudo zpool status
sudo zpool list
```



## 7. RAID i LVM

**LVM** (*Logical Volume Manager*) pot combinar-se amb RAID per afegir flexibilitat:

```bash
# Crear volums físics
sudo pvcreate /dev/md0

# Crear grup de volums
sudo vgcreate vg_dades /dev/md0

# Crear volum lògic
sudo lvcreate -L 100G -n lv_dades vg_dades
sudo mkfs.ext4 /dev/vg_dades/lv_dades
```

LVM també pot crear RAID intern sense `mdadm`:

```bash
# RAID 1 amb LVM
sudo lvcreate --type raid1 -m 1 -L 100G -n lv_mirall vg_dades
```



## 8. Discos de recanvi (hot spare)

Un **disc de recanvi** (*hot spare*) és un disc inactiu que entra en funcionament automàticament quan falla un disc actiu, iniciant la reconstrucció sense intervenció manual.

```bash
# Afegir un spare a un RAID existent
sudo mdadm /dev/md0 --add /dev/sde
# Si el RAID ja és complet, sde queda com a spare

# Veure els spares
sudo mdadm --detail /dev/md0 | grep spare
```



## 9. Bones pràctiques

1. **RAID no és backup:** complementar sempre amb còpies de seguretat externes.
2. **Discos de la mateixa mida:** els discos de mides diferents aprofiten només la mida del més petit.
3. **No barrejar discos de marques/lots iguals:** si venen del mateix lot, poden fallar alhora.
4. **Hot spare:** tenir sempre un disc de recanvi preparat, especialment en RAID 5/6.
5. **Monitoratge actiu:** configurar alertes per correu quan hi hagi degradació:
   ```bash
   # /etc/mdadm/mdadm.conf
   MAILADDR admin@exemple.cat
   ```
6. **Substituir discos degradats immediatament:** no deixar un RAID degradat durant molt de temps.
7. **Fer proves de reconstrucció** periòdicament en entorn de proves.
8. **RAID 6 o RAID 10** per a discos de gran capacitat (>4 TB) on el risc de fallada durant reconstrucció és alt.
9. **Checksums:** usar ZFS o sistemes de fitxers amb integritat per detectar *bit rot*.
10. **Documentar la configuració** per facilitar la recuperació en cas d'emergència.



## 10. Recuperació d'un RAID degradat

```bash
# 1. Identificar l'estat
cat /proc/mdstat
sudo mdadm --detail /dev/md0

# 2. Identificar el disc fallat
sudo mdadm --detail /dev/md0 | grep -i fail
dmesg | grep -i "I/O error"

# 3. Marcar com a fallat i treure (si no ho ha fet el sistema)
sudo mdadm /dev/md0 --fail /dev/sdc
sudo mdadm /dev/md0 --remove /dev/sdc

# 4. Substituir físicament el disc

# 5. Afegir el nou disc
sudo mdadm /dev/md0 --add /dev/sdc

# 6. Seguir la reconstrucció
watch cat /proc/mdstat
```



## 11. Resum visual de nivells RAID

![Nivells de RAID](https://proferamon.com/tic/imatges/raid/raid01.png)

## 12. Resum d'ordres `mdadm`

```bash
# Crear RAID
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

# Estat
mdadm --detail /dev/md0
cat /proc/mdstat

# Desar configuració
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

# Fallar disc
mdadm /dev/md0 --fail /dev/sdc

# Treure disc
mdadm /dev/md0 --remove /dev/sdc

# Afegir disc
mdadm /dev/md0 --add /dev/sde

# Aturar RAID
mdadm --stop /dev/md0

# Esborrar superbloc
mdadm --zero-superblock /dev/sdb
```



## 13. Referències

- `man mdadm` — Manual complet de mdadm
- `man md` — Documentació del driver md del kernel
- [The Linux Kernel Documentation](https://docs.kernel.org/admin-guide/md.html)
- [Arch Wiki: RAID](https://wiki.archlinux.org/title/RAID)
- [Arch Wiki: ZFS](https://wiki.archlinux.org/title/ZFS)
- [Debian mdadm documentation](https://debian-handbook.info/browse/stable/advanced-administration.html#sect.raid-soft)

#### Versions d'aquest document

+ HTML - [raid.html](https://proferamon.com/tic/raid.html)
+ PDF - [raid.pdf](https://proferamon.com/tic/docs/raid.pdf)
+ ODT - [raid.odt](https://proferamon.com/tic/odt/raid.odt)
+ MD - [raid.md](https://proferamon.com/tic/md/raid.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)
