Serveur avec baies de disques, double attachement

Ceci est un exemple de configuration comprenant un serveur et trois baies de disques, en attachement multiple. Terminologie : NAS + DAS.

matériel :

  • Serveur :
    • Dell R740 (de l’année 2020),

    • 2x Intel Xéon Silver 4214R CPU @ 2.40GHz, 2 threads par coeur, soit 48 coeurs logiques,

    • 192 GiB de RAM,

    • Carte BOSS 250 GiB pour l”OS, Debian 11 Bullseye,

    • 2x 10Gib/s Ethernet Controller,

    • 8x emplacements 2,5" SAS libres,

    • 2x contrôleurs HBA externes.

  • Baies
    • 3x chassis MD1200,

    • 2x EMM par chassis,

    • 12x disques 16 TiB SAS par chassis.

multipath :

Cette disposition est la plus courante, lorsque l’on utilise des contrôleurs RAID matériel. Avec de simples contrôleurs HBA, et dans le cadre de notre exemple, elle nécessite l’usage du logiciel multipath.

DAS, double, illustration Dell

Fig. 3 DAS, double attachement (illustration Dell)

Il est aussi possible d’utiliser un attachement en anneau, ou « Daisy Chain ». Cette disposition n’est pas toujours supportée par les contrôleurs RAID matériel. Elle fonctionne pourtant parfaitement avec des contrôleurs HBA et multipath.

DAS, "Daisy Chain", ring

Fig. 4 DAS, double attachement en « Daisy Chain » (ou en anneau)

En fait, avec multipath, le type d’attachement physique importe peu. Il suffit d’indiquer quels disques doivent être gérés et c’est le logiciel qui va découvrir les chemins (la topologie). Le modèle, ou la génération, de contrôleur SAS, supportant plus ou moins de disques (le LSI SAS2008 supporte de 256 à 512 devices), on pourra attacher plus ou moins de baies DAS (jusqu’à 8 baies MD1200, soit 96 disques, ou 4 baies MD3060e, soit 240 disques).

  • Pour les distributions Debian et dérivées, installez multipath-tools :

apt install multipath-tools
  • fichier /etc/modprobe.d/zfs.conf :

options spl spl_kmem_cache_slab_limit=16384
# ARC entre 96GiB et 144GiB
options zfs zfs_arc_min=103079215104 zfs_arc_max=154618822656
  • fichier /etc/zfs/vdev_id.conf :

multipath yes

Oui, c’est tout. Par contre, il n’est pas possible de mélanger des disques gérés dans vdev_id.conf et d’autres avec multipath. Dans ce cas de figure, même les disques en simple attachement, ceux de la baie frontale du serveur par exemple, devront être gérés par multipath.

configuration :

  • fichier /etc/multipath.conf :

De la même manière qu’avec le fichier vdev_id.conf en simple attachement, il faut décrire les disques (par leur GUID), les nommer (leur donner un alias). Il est fortement recommandé de blacklister le disque système.

# /etc/multipath.conf
# see /usr/share/doc/multipath-tools/examples/multipath.conf.annotated.gz

defaults {
    verbosity 1
    user_friendly_names no
    find_multipaths yes  # or greedy, or smart
}

blacklist {
    wwid  ata-DELLBOSS_VD_60482ec238880010  # as in /dev/disk/by-id/
}

multipaths {
# baie1 MD1200 double attachement

multipath {
    wwid  35000cca01aa65e50
    alias  B1D0
}
multipath {
    wwid  35000cca01aa7a0d0
    alias  B1D1
}

# [ ... ]

multipath {
    wwid  35000cca01aa68344
    alias  B3D11
}

}  # fin multipaths

Vous retrouvez l’association entre un GUID (préfixé d’un 3) et un alias humainement compréhensible. Cela peut paraître laborieux, mais c’est trés facile à scripter. Quelques exemples de scripts.

Après vérification que multipathd a bien démarré lors de son installation, il faut lui faire prendre en compte sa nouvelle configuration :

ps faxu | grep [m]ulti
root      3210  0.0  0.0 2687520 22752 ?       SLsl  2013 124:16 /sbin/multipathd -d -s
multipath -F  # Flush all unused multipath device maps.
multipath -r  # Force devmap reload.
[ ... output may differ ... ]
multipath  # list all new added devices
[ ... output may differ ... ]
  • commande multipath -v2 -ll :

Permet d’afficher la topologie, telle que détectée par multipath (-v2 : be verbose, -ll : show the current multipath topology from all available sources).

data11:~# multipath -v2 -ll | less
B1D8 (35000039a7843b7ad) dm-17 TOSHIBA,MG08SCA16TEY
size=15T features='2 queue_mode mq' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 4:0:16:0 sdag 66:0   active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 5:0:16:0 sdbe 67:128 active ready running
B2D8 (35000039a785811e1) dm-5 TOSHIBA,MG08SCA16TEY
size=15T features='2 queue_mode mq' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 4:0:3:0  sdu  65:64  active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 5:0:3:0  sdas 66:192 active ready running
B1D7 (35000039a7818ed75) dm-15 TOSHIBA,MG08SCA16TEY
size=15T features='2 queue_mode mq' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 4:0:24:0 sdao 66:128 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 5:0:24:0 sdbm 68:0   active ready running
B2D11 (35000039a78581391) dm-2 TOSHIBA,MG08SCA16TEY
size=15T features='2 queue_mode mq' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=enabled
| `- 4:0:10:0 sdab 65:176 active ready running
`-+- policy='service-time 0' prio=1 status=active
  `- 5:0:10:0 sdaz 67:48  active ready running
B2D7 (35000039a78581595) dm-3 TOSHIBA,MG08SCA16TEY
size=15T features='2 queue_mode mq' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 4:0:11:0 sdac 65:192 active ready running
  `-+- policy='service-time 0' prio=1 status=enabled
[ ... ]

Vous retrouvez pour chaque disque, une ligne rappelant l’alias, le GUID, le device mappé, VENDOR et MODEL. Puis une deuxième ligne avec la taille et les options. Enfin les chemins (ou le chemin) vers le device, ainsi que son état. Fun fact : La sortie n’est jamais dans le même ordre.

Vous retrouverez aussi les alias des disques dans /dev/mapper/.

Retour à ZFS :

  • commande zpool create :

Oui, c’est la même que dans l’exemple précédent.

zpool create -f data \
raidz2 B1D0 B1D1 B1D2 B1B3 B1D4 B1D5 \
raidz2 B1D6 B1D7 B1D8 B1D9 B1D10 B1D11 \
raidz2 B2D0 B2D1 B2D2 B2B3 B2D4 B2D5 \
raidz2 B2D6 B2D7 B2D8 B2D9 B2D10 B2D11 \
raidz2 B3D0 B3D1 B3D2 B3B3 B3D4 B3D5 \
raidz2 B3D6 B3D7 B3D8 B3D9 B3D10 B3D11 \

zfs set compression=on data
zfs set atime=off data
  • commande zpool status :

Pour ZFS, la présentation ne change pas. Le chemin vers les vdev n’a pas d’importance.

zpool status
  pool: data
state: ONLINE
  scan: scrub repaired 0B in 00:10:32 with 0 errors on Sun Jan  9 00:24:55 2022
config:

    NAME        STATE     READ WRITE CKSUM
    data        ONLINE       0     0     0
      raidz2-0  ONLINE       0     0     0
        B1D0    ONLINE       0     0     0
        B1D1    ONLINE       0     0     0
        B1D2    ONLINE       0     0     0
        B1D3    ONLINE       0     0     0
        B1D4    ONLINE       0     0     0
        B1D5    ONLINE       0     0     0
      raidz2-1  ONLINE       0     0     0
        B1D6    ONLINE       0     0     0
        B1D7    ONLINE       0     0     0
    [ ... ]
      raidz2-5  ONLINE       0     0     0
        B3D6    ONLINE       0     0     0
        B3D7    ONLINE       0     0     0
        B3D8    ONLINE       0     0     0
        B3D9    ONLINE       0     0     0
        B3D10   ONLINE       0     0     0
        B3D11   ONLINE       0     0     0

errors: No known data errors
  • commande zfs list :

Ces données sont tirées d’un ensemble déjà en production.

zfs list
NAME           USED  AVAIL     REFER  MOUNTPOINT
data          83.6T  91.9T     36.5K  none
data/crlfd1   83.6T  16.4T     83.6T  /data/crlfd1
[ ... ]