Enlarge your p… partitions (drbd)

Je cherchais un titre valable pour cet article et m’est revenu l’objet des spams du début des années 2000. Ahhh le bon vieux temps… Désolé, je m’égare de toute façon je ne pourrai t’apporter la solution que pour : agrandir les partitions de ton système Linux.

Ca aurait pas été un meilleur titre ça, non ?

J’ai été récemment confronté à des partitions drbd pleines sur des serveurs virtuels et je voulais prendre en note les opérations d’extension à chaud afin de t’en faire part parce que ça peut faire peur.

Extension du disque

Avant toute chose il faut que tu étendes la taille du disque de ta vm. Je sais pas ce que tu utilises comme hyperviseur (Xen, Virtualbox, VMWare… etc.) alors, pour cette partie débrouille-toi ! Mais note bien que si c’est un volume drbd tu devras le faire sur les deux nœuds.

Comme j’utilise Virtualbox, je ne peux pas modifier les tailles de disque à chaud alors je triche mais on va faire comme si ça avait été possible… Trop naze Virtualbox !

La problématique c’est qu’à chaud, ton système n’a pas idée que la taille des disques à changé.

root@db-01:~# lsblk
NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda         8:0    0   20G  0 disk 
├─sda1      8:1    0  1,9G  0 part [SWAP]
└─sda2      8:2    0 18,1G  0 part /
sdb         8:16   0    5G  0 disk 
└─sdb1      8:17   0    5G  0 part 
  └─drbd0 147:0    0    5G  0 disk /opt/drbd
sr0        11:0    1 1024M  0 rom
root@db-01:~# fdisk -l | grep sdb
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
/dev/sdb1        2048 10485759 10483712   5G 83 Linux

Force alors le noyau à scanner de nouveau tous les bus, cibles et, LUN "- - -", de tous les contrôleurs SCSI exposés dans /sys/class/scsi_host/.

root@db-01:~# for i in /sys/class/scsi_host/host*/scan ; do echo '- - -' > $i ; done
root@db-01:~# fdisk -l | grep sdb
Disk /dev/sdb: 15 GiB, 16106127360 bytes, 31457280 sectors
/dev/sdb1        2048 10485759 10483712   5G 83 Linux

Extension de la partition

Ton disque sdb est bien de 15Go mais ta partition sdb1 ne fait toujours que 5Go. Tu peux l’étendre avec growpart, parted ou, fdisk. Je te montre avec fdisk : on casse et recréé la partoche avec le même secteur de départ et sans modifier la signature puis, on écrit les changements.

root@db-01:~# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.

Command (m for help): d

Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-31457279, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-31457279, default 31457279): 

Created a new partition 1 of type 'Linux' and of size 15 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: N

Command (m for help): w

The partition table has been altered.
Syncing disks.

J’ai tapé explicitement les réponses à chaque fois mais tu auras compris que fdisk te prends par la main et te propose un choix par défaut alors il suffit juste de faire Entrée. Contrôle ta partition et tant qu’à faire ton drbd. Tout va bien !

root@db-01:~# fdisk -l | grep sdb
Disk /dev/sdb: 15 GiB, 16106127360 bytes, 31457280 sectors
/dev/sdb1        2048 31457279 31455232  15G 83 Linux
root@db-01:~# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: 488C1124B879DCE7CD031DA 
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:20228 nr:19760 dw:39496 dr:31377 al:19 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

Redimensionner DRBD

Passe ton nœud primaire en secondaire et redimensionne la ressource. Chez moi, elle s’appelle r0.

root@db-01:~# drbdadm secondary r0
root@db-01:~# drbdadm status
r0 role:Secondary
  disk:UpToDate
  peer role:Primary
    replication:Established peer-disk:UpToDate

root@db-01:~# drbdadm resize r0
root@db-01:~#

Une resynchronisation de la ressource drbd s’est lancée à la validation de resize. Une fois terminée, fais tout de même le resize sur le second serveur et contrôle que tout va bien avec drbd setup.

root@db-02:~# drbdadm resize r0
root@db-02:~# drbdsetup status r0 --verbose --statistics
r0 role:Primary suspended:no
    write-ordering:flush
  volume:0 minor:0 disk:UpToDate
      size:15727100 read:10516817 written:39496 al-writes:27 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:no
  peer connection:Connected role:Secondary congested:no
    volume:0 replication:Established peer-disk:UpToDate resync-suspended:no
        received:19760 sent:10505668 out-of-sync:0 pending:0 unacked:0

root@db-02:~# 

Tu l’as peut-être vu, db2 reste le nœud primaire, moi ça me dérange. J’ai eu beau lui demander poliment, il a rien voulu savoir.

root@db-01:~# drbdadm primary r0
0: State change failed: (-1) Multiple primaries not allowed by config
Command 'drbdsetup-84 primary 0' terminated with exit code 11

Chteuldi, je vais pas me laisser faire par un drbd à la… oh pardon je m’énerve. Bref, je vais juste redémarrer heartbeat sur db2 pour faire basculer ma vip et drbd.

root@db-02:~# systemctl restart heartbeat
root@db-02:~# drbdsetup status r0 --verbose --statistics
r0 role:Secondary suspended:no
    write-ordering:flush
  volume:0 minor:0 disk:UpToDate
      size:15727100 read:10516817 written:58956 al-writes:27 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:no
  peer connection:Connected role:Primary congested:no
    volume:0 replication:Established peer-disk:UpToDate resync-suspended:no
        received:39004 sent:10505884 out-of-sync:0 pending:0 unacked:0

Ca va mieux là ! Toi aussi ? Tu crois que c’est fini ? Bah non, regarde ton drbd fait toujours que 5Go banane !

root@db-01:~# df -h
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
udev               459M       0  459M   0% /dev
tmpfs               97M    592K   96M   1% /run
/dev/sda2           18G    2,5G   16G  14% /
tmpfs              481M     48M  434M  10% /dev/shm
tmpfs              5,0M       0  5,0M   0% /run/lock
tmpfs               97M       0   97M   0% /run/user/0
/dev/drbd0         4,9G    196M  4,4G   5% /opt/drbd

Extension du système de fichiers

Bon toi t’es un vrai barbu, tu l’savais, je t’ai dit « banane » pour rien. Mais moi, je pensais avoir terminé alors que non. Ok désolé, reste pour la fin de l’article.

Étends la partition avec l’outil adapté à ton type de système de fichier, moi c’est de l’ext4 alors je vais utiliser resize2fs.

root@db-01:~# resize2fs /dev/drbd0
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/drbd0 is mounted on /opt/drbd; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/drbd0 is now 3931775 (4k) blocks long.

root@db-01:~# df -h
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
udev               459M       0  459M   0% /dev
tmpfs               97M    592K   96M   1% /run
/dev/sda2           18G    2,5G   16G  14% /
tmpfs              481M     48M  434M  10% /dev/shm
tmpfs              5,0M       0  5,0M   0% /run/lock
tmpfs               97M       0   97M   0% /run/user/0
/dev/drbd0          15G    196M   14G   2% /opt/drbd

Tu vois c’est pas si compliqué même si la suppression de partition avec fdisk fait un peu flipper. Dans tout ça mon MySQL fonctionne toujours comme il faut.

mysql> use wordpress;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_wordpress   |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+
12 rows in set (0,00 sec)

mysql> 

Conclusion

Vu qu’on avait fait du drbd dans le laboratoire haute disponibilité, je trouvais ça cool de te montrer que même avec ce genre de techno un peu sensible c’est parfaitement maintenable (à chaud même, si tu utilises pas Virtualbox). D’autant plus que cette méthode fonctionne très bien même sans drbd – tu adapteras au type de stockage (LVM tout ça…) et de système de fichier (coucou XFS…).

Laisser un commentaire