Ir al contenido

Añadir un disco a una instancia

Christophe TREMBLAY-GUILLOUX
Christophe TREMBLAY-GUILLOUXIngeniero de sistemas Linux
Disco<rol>Tipo de volumenMontado enUso
Datosdatahigh-speed-gen2/mnt/dataMariaDB y /home, en un disco rápido
Copiasbackupclassic/mnt/backupcopia diaria de cada sitio, cuota por cuenta

Los dos discos usan XFS:

  • cuotas integradas en el sistema de archivos: por usuario y por grupo en /mnt/data (uquota, gquota), por carpeta en /mnt/backup (cuotas de proyecto, prjquota), sin archivo de cuotas que mantener;
  • ampliación en caliente: tras ampliar el volumen en OVH, xfs_growfs extiende el sistema de archivos sin desmontarlo;
  • rendimiento con archivos grandes y escrituras en paralelo, tanto las de una base de datos como las de una copia de seguridad.

Como contrapartida, un sistema de archivos XFS no se puede reducir: conviene empezar con un tamaño modesto y ampliar después.

Después de la instancia, en resource-openstack-compute-xxx.tf:

resource "openstack_blockstorage_volume_v3" "xxx_<rol>" {
provider = openstack.ovh
region = openstack_compute_instance_v2.xxx.region
name = "xxx_<rol>"
size = <tamaño en GB>
volume_type = "<tipo de volumen>"
enable_online_resize = true
lifecycle { prevent_destroy = true }
}
resource "openstack_compute_volume_attach_v2" "xxx_<rol>_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_<rol>.id
}

El plan debe anunciar 2 creaciones.

Terraform da el identificador del volumen, desde la carpeta del proyecto:

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

También aparece en el área de cliente de OVH, Public Cloud > Block Storage.

En la instancia, el disco aparece en /dev/disk/by-id/ con el nombre scsi-0QEMU_QEMU_HARDDISK_<identificador>.

bash
ID=<identificador del volumen>
DISK=$(ls /dev/disk/by-id/*"$ID") # el disco solo, sin sus particiones
echo "$DISK"
wipefs -n "$DISK" # debe estar vacío
parted -s "$DISK" mklabel gpt mkpart <rol> xfs 0% 100%
udevadm settle
mkfs.xfs -L <rol> "${DISK}-part1"

En data/nodes/xxx.yaml:

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

En la siguiente ejecución, Puppet monta /mnt/data, declara los binds de /var/lib/mysql y /home sin montarlos y deja los scripts de migración. MariaDB sigue funcionando en el disco interno.

Mientras la migración no esté hecha, MariaDB ya no se reinicia: tras un reinicio del servidor, la base queda parada.

Los sitios quedan cortados durante la copia.

bash
mariadb-move-to-data-disk

El script suspende Puppet, copia la base, monta el bind, reinicia MariaDB y vuelve a activar Puppet. Si falla, Puppet queda desactivado: comprobar el estado y después puppet agent --enable.

Los servicios que usan /home (nginx, PHP, FTP, correo, cron) quedan cortados durante la copia.

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

Funciona igual que para MariaDB. Si /home sigue en uso, el script no mueve nada, reinicia los servicios y vuelve a activar Puppet.

En una instancia Virtualmin, ajustar después las cuotas de /home en Virtualmin y luego:

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

Después, borrar /var/lib/mysql.old-<fecha> y /home.old-<fecha>.

Sin este disco, no se activa ninguna copia de seguridad de sitio.

Solo cuando el disco esté formateado, en data/nodes/xxx.yaml:

yaml
min::backup_disk: true

En la siguiente ejecución, Puppet:

  • monta el disco en /mnt/backup con las cuotas de proyecto (prjquota);
  • crea /mnt/backup/wcf/<cuenta> para cada sitio y lo monta en /home/wcf/<cuenta>/backup;
  • limita el espacio de cada cuenta;
  • programa la copia de cada sitio hacia las 3 h: un archivo /home/wcf/<cuenta>/backup/<AAAA-MM-DD>/<cuenta>-<AAAA-MM-DD>.tar.zst con data/, app/, public_html/ y la base en db.sql.

La opción prjquota solo se tiene en cuenta al montar. Si el disco se montó sin ella, desmontarlo y volver a ejecutar Puppet.

AjustePor defectoDónde
Días conservados1 (la del día anterior se borra cuando la copia del día ha terminado bien)backup_keep del sitio
Espacio por cuenta10Gmin::wcf::backup_quota, o backup_quota de la oferta en min::wcf::dolibarrs::offers (Biz: 80G)
Copia de un sitioactivadabackup: false en el sitio para desactivarla
bash
findmnt /mnt/backup
xfs_quota -x -c 'report -p -h' /mnt/backup
ls /home/wcf/*/backup/

Una copia que falla durante 36 h dispara la alerta MinBackupStale: disco ausente, cuota de la cuenta alcanzada o error del script.