Aller au contenu

Ajouter un disque à une instance

Christophe TREMBLAY-GUILLOUX
Christophe TREMBLAY-GUILLOUXIngénieur système Linux
Disque<rôle>Type de volumeMonté surUsage
Donnéesdatahigh-speed-gen2/mnt/dataMariaDB et /home, sur un disque rapide
Sauvegardebackupclassic/mnt/backupcopie quotidienne de chaque site, quota par compte

Les deux disques sont en XFS :

  • quotas intégrés au système de fichiers : par utilisateur et par groupe sur /mnt/data (uquota, gquota), par dossier sur /mnt/backup (quotas de projet, prjquota), sans fichier de quota à maintenir ;
  • agrandissement à chaud : après l'agrandissement du volume chez OVH, xfs_growfs étend le système de fichiers sans le démonter ;
  • performances sur les gros fichiers et les écritures parallèles, celles d'une base de données comme celles d'une sauvegarde.

En contrepartie, un système de fichiers XFS ne peut pas être réduit : prévoir une taille de départ modeste, puis agrandir.

Après l'instance, dans resource-openstack-compute-xxx.tf :

resource "openstack_blockstorage_volume_v3" "xxx_<rôle>" {
provider = openstack.ovh
region = openstack_compute_instance_v2.xxx.region
name = "xxx_<rôle>"
size = <taille en Go>
volume_type = "<type de volume>"
enable_online_resize = true
lifecycle { prevent_destroy = true }
}
resource "openstack_compute_volume_attach_v2" "xxx_<rôle>_attach" {
provider = openstack.ovh
region = openstack_compute_instance_v2.xxx.region
instance_id = openstack_compute_instance_v2.xxx.id
volume_id = openstack_blockstorage_volume_v3.xxx_<rôle>.id
}

Le plan doit annoncer 2 créations.

L'identifiant du volume est donné par Terraform, depuis le dossier du projet :

bash
terraform state show openstack_blockstorage_volume_v3.xxx_<rôle> | grep -E '^ +id '

Il est aussi visible dans l'espace client OVH, Public Cloud > Block Storage.

Sur l'instance, le disque apparaît sous /dev/disk/by-id/ avec le nom scsi-0QEMU_QEMU_HARDDISK_<identifiant>.

bash
ID=<identifiant du volume>
DISK=$(ls /dev/disk/by-id/*"$ID") # le disque seul, sans ses partitions
echo "$DISK"
wipefs -n "$DISK" # doit être vide
parted -s "$DISK" mklabel gpt mkpart <rôle> xfs 0% 100%
udevadm settle
mkfs.xfs -L <rôle> "${DISK}-part1"

Dans data/nodes/xxx.yaml :

yaml
min::data_disk: true
min::mariadb::on_data_disk: true
min::home::on_data_disk: true

Au passage suivant, Puppet monte /mnt/data, déclare les binds de /var/lib/mysql et /home sans les monter et dépose les scripts de migration. MariaDB continue de tourner sur le disque interne.

Tant que la migration n'est pas faite, MariaDB ne redémarre plus : en cas de reboot, la base reste arrêtée.

Les sites sont coupés pendant la copie.

bash
mariadb-move-to-data-disk

Le script suspend Puppet, copie la base, monte le bind, relance MariaDB puis réactive Puppet. En cas d'échec, Puppet reste désactivé : vérifier l'état, puis puppet agent --enable.

Les services utilisant /home (nginx, PHP, FTP, mail, cron) sont coupés pendant la copie.

bash
min-move-home-to-data-disk

Même fonctionnement que pour MariaDB. Si /home est encore utilisé, le script ne déplace rien, relance les services et réactive Puppet.

Sur une instance Virtualmin, régler ensuite les quotas sur /home dans Virtualmin, puis :

bash
virtualmin modify-domain --all-domains --apply-quotas
bash
findmnt /var/lib/mysql
findmnt /home
mysql -e 'SHOW DATABASES'

Ensuite, supprimer /var/lib/mysql.old-<date> et /home.old-<date>.

Sans ce disque, aucune sauvegarde de site n'est activée.

Seulement une fois le disque formaté, dans data/nodes/xxx.yaml :

yaml
min::backup_disk: true

Au passage suivant, Puppet :

  • monte le disque sur /mnt/backup avec les quotas de projet (prjquota) ;
  • crée /mnt/backup/wcf/<compte> pour chaque site et le monte sur /home/wcf/<compte>/backup ;
  • limite la place de chaque compte ;
  • programme la sauvegarde de chaque site vers 3 h : une archive /home/wcf/<compte>/backup/<AAAA-MM-JJ>/<compte>-<AAAA-MM-JJ>.tar.zst avec data/, app/, public_html/ et la base dans db.sql.

L'option prjquota n'est prise en compte qu'au montage. Si le disque a été monté sans elle, le démonter puis relancer Puppet.

RéglagePar défautOù
Jours gardés1 (la veille est supprimée une fois la sauvegarde du jour réussie)backup_keep du site
Place par compte10Gmin::wcf::backup_quota, ou backup_quota de l'offre dans min::wcf::dolibarrs::offers (Biz : 80G)
Sauvegarde d'un siteactivéebackup: false sur le site pour la couper
bash
findmnt /mnt/backup
xfs_quota -x -c 'report -p -h' /mnt/backup
ls /home/wcf/*/backup/

Une sauvegarde qui échoue pendant 36 h déclenche l'alerte MinBackupStale : disque absent, quota du compte atteint ou erreur du script.