Construire pour la production: Applications Web - Sauvegardes

introduction

Après avoir élaboré un plan de récupération pour les différents composants de votre application, vous devez configurer le système de sauvegarde requis pour la prendre en charge. Ce tutoriel se concentrera sur l'utilisation de Bacula en tant que solution de sauvegarde. L’utilisation d’un système de sauvegarde à part entière, tel que Bacula, présente l’avantage de vous permettre de contrôler entièrement ce que vous sauvegardez et restaurez au niveau des fichiers, et vous permet de planifier des sauvegardes et des restaurations en fonction de ce qui vous convient le mieux.

Backup Diagram

Des solutions telles queDigitalOcean Droplet Backups (sauvegardes instantanées de l'ensemble de votre Droplet) sont faciles à mettre en place et peuvent être suffisantes pour vos besoins, si vous n'avez besoin que de sauvegardes hebdomadaires. Si vous optez pour les sauvegardes DigitalOcean, assurez-vous de configurer des sauvegardes à chaud de votre base de données en suivant la sectionCreate Hot Backups of Your Database.

Dans cette partie du didacticiel, nous allons configurer un Bacula pour maintenir des sauvegardes quotidiennes desrequired backups des serveurs qui composent la configuration de votre application (db1, app1, app2 et lb1), définis précédemment dans notre plan de récupération— essentiellement, il s'agit d'un tutoriel qui vous montre comment utiliser Bacula pour créer des sauvegardes d'une pile LAMP. Nous allons également utiliser Percona XtraBackup pour créer des sauvegardes à chaud de votre base de données MySQL. Enfin, nous utiliserons rsync pour créer une copie de vos sauvegardes, sur un serveur d'un centre de données distant. Cela ajoutera deux serveurs à votre configuration:backups etremotebackups (situés dans un centre de données séparé).

Commençons.

Installer Bacula sur le serveur de sauvegarde

Configurez Bacula sur votre serveurbackups en suivant ce tutoriel:How To Install Bacula Server on Ubuntu 14.04.

Suivez ensuite la sectionOrganize Bacula Director Configuration (Server) de ce tutoriel:How To Back Up an Ubuntu 14.04 Server with Bacula. Vous aurez besoin du nom du directeur lors de la configuration des clients Bacula (sur les serveurs que vous souhaitez sauvegarder). Arrêtez-vous lorsque vous atteignez la sectionInstall and Configure Bacula Client.

Notez que nous utiliserons le pool RemoteFile pour toutes les tâches de sauvegarde que nous allons configurer. Cela dit, vous voudrez peut-être modifier certains paramètres avant de continuer.

Installer le client Bacula sur chaque serveur

Installez le client Bacula sur chaque serveur que vous souhaitez sauvegarder (db1, app1, app2 et lb1) en suivant la sectionInstall and Configure Bacula Client de ce tutoriel:How To Back Up an Ubuntu 14.04 Server with Bacula. Arrêtez-vous lorsque vous atteignez la sectionAdd FileSets (Server).

Notez que vous aurez besoin desFileDaemon Name (généralement le nom d'hôte ajouté par «-fd») et desDirector Password (le mot de passe que le serveur Bacula utilisera pour se connecter à chaque client) dubacula-fd.conf fichier sur chaque serveur.

Ajouter des clients Bacula au serveur de sauvegarde

Surbackups, le serveur Bacula, ajoutez unClient resource au fichier/etc/bacula/conf.d/clients.conf pour chaque serveur sur lequel vous avez installé le client Bacula.

Ouvrez le fichierclients.conf:

sudo vi /etc/bacula/conf.d/clients.conf

Voici un exemple de définition de la ressource Client pour le serveur de base de données,db1. Notez que la valeur deName doit correspondre au nom de la ressourceFileDaemon et lesPassword doivent correspondre au mot de passe de la ressourceDirector, sur le serveur client - ces valeurs se trouve dans/etc/bacula/bacula-fd.conf sur chaque serveur client Bacula:

clients.conf — Example Client resource definition

Client {
  Name = db1-fd
  Address = db1.nyc3.example.com
  FDPort = 9102
  Catalog = MyCatalog
  Password = "PDL47XPnjI0QzRpZVJKCDJ_xqlMOp4k46"          # password for Remote FileDaemon
  File Retention = 30 days            # 30 days
  Job Retention = 6 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

Créez une ressource client similaire pour chacun des serveurs clients Bacula restants. Dans notre exemple, il devrait y avoir quatre ressources Client lorsque nous avons terminé:db1-fd,app1-fd,app2-fd etlb1-fd. Ceci configure le Directeur Bacula, sur le serveurbackups, pour pouvoir se connecter au client Bacula sur chaque serveur.

Sauvegarder et quitter.

Plus de détails sur cette section peuvent être trouvés dans lesInstall and Configure Bacula Client dans lesHow To Back Up an Ubuntu Server with Bacula tutorial.

Créer des sauvegardes à chaud de votre base de données

Pour nous assurer de produire des résultats cohérents (c.-à-d. utilisables) de notre base de données active, une attention particulière doit être apportée. Percona XtraBackup est un moyen simple et efficace de créer des sauvegardes à chaud avec MySQL.

Installer Percona XtraBackup

Sur votre serveur de base de données,db1, installez et configurez Percona XtraBackup en suivant ce tutoriel:How To Create Hot Backups of MySQL Databases with Percona XtraBackup on Ubuntu 14.04. Arrêtez-vous lorsque vous atteignez la sectionPerform Full Hot Backup.

Créer un script XtraBackup

Percona XtraBackup est prêt à créer des sauvegardes à chaud de votre base de données MySQL, qui seront finalement sauvegardées par Bacula (ou des sauvegardes DigitalOcean), mais les sauvegardes à chaud doivent être planifiées d'une manière ou d'une autre. Nous allons mettre en place la solution la plus simple: un script bash et un travail cron.

Créez un script bash appelérun_extra_backup.sh dans/usr/local/bin:

sudo vi /usr/local/bin/run_xtrabackup.sh

Ajoutez le script suivant. Assurez-vous de remplacer l'utilisateur et le mot de passe par tout ce que vous avez configuré lors de l'installation de XtraBackup:

/usr/local/bin/run_xtrabackup.sh

#!/bin/bash

# pre xtrabackup
chown -R mysql: /var/lib/mysql
find /var/lib/mysql -type d -exec chmod 770 "{}" \;

# delete existing full backup
rm -r /data/backups/full

# xtrabackup create backup
innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/full

# xtrabackup prepare backup
innobackupex --apply-log /data/backups/full

Sauvegarder et quitter. L'exécution de ce script (avec les privilèges de superutilisateur) supprimera la sauvegarde XtraBackup existante à/data/backups/full et créera une nouvelle sauvegarde complète. Vous trouverez plus de détails sur la création de sauvegardes avec XtraBackup dans la sectionPerform Full Hot Backup du didacticiel XtraBackup.

Rendre le script exécutable:

sudo chmod +x /usr/local/bin/run_xtrabackup.sh

Afin de sauvegarder correctement notre base de données, nous devons exécuter (et compléter) le script XtraBackup avant que Bacula ne tente de sauvegarder le serveur de base de données. Une bonne solution est de configurer votre tâche de sauvegarde Bacula pour exécuter le script en tant que «script de pré-sauvegarde», mais nous choisirons d'utiliser uncron job pour que les choses restent simples.

Créez un fichier de configuration cron (les fichiers dans/etc/cron.d sont ajoutés au crontab de root):

sudo vi /etc/cron.d/xtrabackup

Ajoutez le travail cron suivant:

/etc/cron.d/xtrabackup

30 22    * * *   root    /usr/local/bin/run_xtrabackup.sh

Cela permet au script de s’exécuter en tant que root tous les jours à 22h30 (22e heure, 30e minute). Nous avons choisi cette heure car Bacula doit actuellement exécuter ses tâches de sauvegarde à 23 h 05 tous les jours. Nous discuterons de l'ajustement plus tard. Cela laisse 35 minutes à la fin du script XtraBackup.

Maintenant que les sauvegardes à chaud de la base de données sont configurées, examinons les FileSets de sauvegarde Bacula.

Configurer les FileSets Bacula

Bacula créera des sauvegardes des fichiers spécifiés dans les ensembles de fichiers associés aux travaux de sauvegarde à exécuter. Cette section couvrira la création de FileSets qui incluent lesrequired backups que nous avons identifiés dans nos plans de récupération. Plus de détails sur l'ajout de FileSets à Bacula peuvent être trouvés dans la sectionAdd FileSets (Server) du didacticiel Bacula.

Sur votre serveurbackups, ouvrez le fichierfilesets.conf:

sudo vi /etc/bacula/conf.d/filesets.conf

Ensemble de fichiers du serveur de base de données

Les sauvegardes requises pour notre serveur de base de données, conformément à notre plan de récupération, incluent:

  • MySQL database: une copie de sauvegarde est créée par notre script XtraBackup en/data/backups/full, tous les jours à 22h30

  • MySQL configuration: situé dans/etc/mysql

Nous inclurons également le script XtraBackup:/usr/local/bin/run_xtrabackup.sh, et le fichier cron associé.

En gardant à l'esprit les sauvegardes requises, nous allons ajouter ce fichier "Base de données MySQL" à notre configuration Bacula:

filesets.conf — MySQL Database

FileSet {
  Name = "MySQL Database"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /data/backups
    File = /etc/mysql/my.cnf
    File = /usr/local/bin/run_xtrabackup.sh
    File = /etc/cron.d/xtrabackup
  }
  Exclude {
    File = /data/backups/exclude
  }
}

Passons maintenant au FileSet du serveur d’application.

Ensemble de fichiers du serveur d'applications

Les sauvegardes requises pour vos serveurs d'applications, en fonction de votre plan de récupération, incluent:

  • Application Files: situé dans/var/www/html dans notre exemple

En gardant à l'esprit les sauvegardes requises, nous allons ajouter ce FileSet «Apache DocumentRoot» à notre configuration Bacula:

filesets.conf — Apache DocumentRoot

FileSet {
  Name = "Apache DocumentRoot"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /var/www/html
  }
  Exclude {
    File = /var/www/html/exclude
  }
}

Vous pouvez également inclure le fichier de configuration des ports Apache, mais celui-ci est facilement remplaçable.

Passons maintenant au FileSet du serveur d’équilibreur de charge.

Ensemble de fichiers du serveur d'équilibrage de charge

Les sauvegardes requises pour nos serveurs d'équilibrage de charge, conformément à notre plan de récupération du serveur d'équilibreur de charge, incluent:

  • SSL Certificate (PEM) and related files: situé dans/root/certs dans notre exemple

  • HAProxy configuration file: situé dans/etc/haproxy

En gardant à l'esprit les sauvegardes requises, nous allons ajouter ce FileSet «Apache DocumentRoot» à notre configuration Bacula:

filesets.conf — SSL Certs and HAProxy Config

FileSet {
  Name = "SSL Certs and HAProxy Config"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /root/certs
    File = /etc/haproxy
  }
  Exclude {
    File = /root/exclude
  }
}

Sauvegarder et quitter.

Maintenant, nos FileSets sont configurés. Passons maintenant à la création des jobs de sauvegarde Bacula qui utiliseront ces FileSets.

Créer des jobs de sauvegarde Bacula

Nous allons créer des travaux de sauvegarde Bacula qui seront exécutés et créer des sauvegardes de nos serveurs.

Créez un fichierjobs.conf dans/etc/bacula/conf.d:

sudo vi /etc/bacula/conf.d/jobs.conf

Travail de sauvegarde du serveur de base de données

Pour notre travail de sauvegarde du serveur de base de données, nous allons créer un nouveau travail nommé «Backup db1». La chose importante ici est que nous spécifions les bonsClient (db1-fd) etFileSet (base de données MySQL):

jobs.conf — Backup db1

Job {
  Name = "Backup db1"
  JobDefs = "DefaultJob"
  Client = db1-fd
  Pool = RemoteFile
  FileSet="MySQL Database"
}

Nous allons maintenant configurer les travaux de sauvegarde du serveur d'applications.

Travaux de sauvegarde du serveur d'applications

Pour nos serveurs d'applications, nous allons créer deux travaux de sauvegarde nommés «Backup app1» et «Backup app2». L'important ici est que nous spécifions les bonsClients (app1-fd et app2-fd) etFileSet (Apache DocumentRoot).

App1 job:

jobs.conf — Backup app1

Job {
  Name = "Backup app1"
  JobDefs = "DefaultJob"
  Client = app1-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

App2 job:

jobs.conf — Backup app2

Job {
  Name = "Backup app2"
  JobDefs = "DefaultJob"
  Client = app2-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

Nous allons maintenant configurer le travail de sauvegarde du serveur de l'équilibreur de charge.

Job de sauvegarde du serveur d'équilibrage de charge

Pour notre travail de sauvegarde du serveur d'équilibrage de charge, nous allons créer un nouveau travail appelé «Sauvegarde lb1». La chose importante ici est que nous spécifions les bonsClient (lb1-fd) etFileSet (certificats SSL et HAProxy Config):

jobs.conf — Backup lb1

Job {
  Name = "Backup lb1"
  JobDefs = "DefaultJob"
  Client = lb1-fd
  Pool = RemoteFile
  FileSet="SSL Certs and HAProxy Config"
}

Sauvegarder et quitter.

Nos tâches de sauvegarde sont maintenant configurées. La dernière étape consiste à redémarrer Bacula Director.

Redémarrer Bacula Director

Sur le serveurbackups, redémarrez Bacula Director pour appliquer toutes nos modifications:

sudo service bacula-director restart

À ce stade, vous souhaiterez tester vos connexions client et vos travaux de sauvegarde, qui sont tous deux couverts dans lesHow To Back Up a Server with Bacula tutorial. Ce tutoriel explique également comment restaurer des sauvegardes Bacula. Notez que la restauration de la base de données MySQL vous demandera de suivre l'étapePerform Backup Restoration du didacticiel Percona XtraBackup.

Vérifier le calendrier des sauvegardes

Le calendrier des sauvegardes Bacula peut être ajusté en modifiant la configuration de Bacula Director (/etc/bacula/bacula-dir.conf). Tous les jobs de sauvegarde que nous avons créés utilisent le JobDef «DefaultJob», qui utilise la planification «WeeklyCycle», définie comme suit:

  • Sauvegarde complète le premier dimanche du mois à 23h05

  • Sauvegardes différentielles tous les autres dimanches à 23h05

  • Sauvegardes incrémentielles les autres jours, du lundi au samedi, à 23h05

Vous pouvez le vérifier en utilisant la console Bacula pour vérifier le statut du directeur. Il devrait générer tous vos travaux planifiés:

Director Status — Scheduled JobsScheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup    10  20-May-15 23:05    BackupLocalFiles   MyVolume
Incremental    Backup    10  20-May-15 23:05    Backup lb1         Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup app2        Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup app1        Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup db1         Remote-0002

N'hésitez pas à ajouter ou à ajuster le calendrier de vos tâches de sauvegarde. Il serait judicieux de modifier la planification des serveurs d'applications pour qu'elle se produise en même temps que le script Percona XtraBackup est exécuté (22h30). Cela évitera que les sauvegardes de l'application et de la base de données soient incohérentes.

Configurer les sauvegardes à distance

Nous sommes maintenant prêts à configurer un serveur distant qui stockera des copies de nos sauvegardes Bacula. Ce serveur distant doit se trouver dans une région géographiquement distincte afin que vous disposiez d'une copie de vos sauvegardes critiques, même en cas de sinistre dans votre centre de données de production. Dans notre exemple, nous utiliserons la région San Francisco (SFO1) de DigitalOcean pour notre serveurremotebackups.

Nous allons expliquer une méthode simple pour envoyer nos sauvegardes depuis notre serveurbackups vers notre serveurremotebackups en utilisant les clés SSH publiques, rsync et cron.

Sur le serveurremotebackups,create a user qui sera utilisé pour la connexion rsync.

Ensuite, sur le serveurbackups, générez une paire de clés SSH sans mot de passe en tant que root. Installez la clé publique sur l'utilisateurremotebackupsque vous venez de créer. Ceci est couvert dans notre tutoriel surHow To Set Up SSH Keys.

Sur le serveurbackups, écrivez une commande rsync qui copie les données de sauvegarde Bacula (/bacula/backup) quelque part sur le serveurremotebackups. L'utilisation de Rsync est couverte dans nosHow To Use Rsync tutorial. La commande ressemblera probablement à ceci:

rsync -az /bacula/backup remoteuser@remotebackups_public_hostname_or_IP:/path/to/remote/backup

Ajoutez la commande à un script, tel que/usr/local/bin/rsync_backups.sh et rendez-le exécutable.

Enfin, vous voudrez configurer une tâche cron qui exécute le scriptrsync_backups.sh en tant que root, une fois les tâches de sauvegarde Bacula généralement terminées. Ceci est couvert dans nosHow To Schedule Routine Tasks With Cron tutorial.

Après avoir configuré tout cela, vérifiez qu'il existe une copie de vos sauvegardes sur le serveurremotebackups le jour suivant.

autres considérations

Nous n’avons pas parlé des exigences en matière de disque pour vos sauvegardes. Vous voudrez certainement revoir l'espace disque utilisé par vos sauvegardes et réviser votre planning d'installation et de sauvegardes en fonction de vos besoins et de vos ressources.

Outre la création de sauvegardes de vos serveurs d'applications, vous souhaiterez probablement configurer des sauvegardes pour tous les autres serveurs ajoutés à votre configuration. Par exemple, vous devez configurer Bacula pour créer des sauvegardes de vos serveurs de surveillance et de journalisation centralisés une fois que vous les avez opérationnel.

Conclusion

Vous devriez maintenant avoir des sauvegardes quotidiennes et une copie à distance de ces sauvegardes de vos serveurs d'applications de production. Assurez-vous de pouvoir restaurer les fichiers et ajoutez les étapes de restauration de vos données à vos plans de récupération.

Passez au didacticiel suivant pour démarrer la configuration de la surveillance de la configuration de votre serveur de production:Building for Production: Web Applications — Monitoring.