Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
technique:adminsys:backup:db:sauvegarde_unique [2020/11/08 22:39] – ↷ Page déplacée de technique:backup:db:sauvegarde_unique à technique:adminsys:backup:db:sauvegarde_unique qduchemi | technique:adminsys:backup:db:sauvegarde_unique [2021/01/25 23:00] (Version actuelle) – supprimée qduchemi | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Système de sauvegarde unique ====== | ||
- | |||
- | ===== Motivations ===== | ||
- | |||
- | La mise en place d'un système de sauvegarde pouvant gérer plusieurs bases de données (PostgreSQL et MySQL) s'est fait dans un objectif de simplification de l' | ||
- | |||
- | Nous disposions avant le changement de [[technique: | ||
- | |||
- | A terme, une telle solution semble peu adaptée, ainsi une image de sauvegarde unique semble être une meilleure solution pour plusieurs raisons : | ||
- | * **Meilleur dimensionnement** : Bien que la consommation de ressource (CPU, RAM) ne soit pas aujourd' | ||
- | * **Gestion centralisée** : Une image unique à chaque machine permettrait de simplifier l' | ||
- | |||
- | ===== Conception / Réalisation ===== | ||
- | |||
- | L' | ||
- | issus des images // | ||
- | |||
- | Les scripts de l' | ||
- | |||
- | `mongodb_run.sh` : Effectue une sauvegarde **d' | ||
- | |||
- | - MONGO\_SERVICE\_NAME : | ||
- | - MONGO\_HOST : nom de l' | ||
- | - MONGO\_PORT : port du service MONGO (défaut: 27017) | ||
- | - MONGO\_PASS : mot de passe de l' | ||
- | - MONGO\_DB : nom de la base de donnée MONGO sauvegardée | ||
- | - INIT\_BACKUP : | ||
- | - 1 = sauvegarde au démarrage du script | ||
- | - 0 = pas de sauvegarde au démarrage | ||
- | - CRON\_TIME : règle cron définissant la fréquence d' | ||
- | - BACKUP\_FOLDER : dossier de sauvegarde sur la machine hôte | ||
- | - `mysql\_run.sh` : Effectue une sauvegarde **d' | ||
- | - MYSQL\_SERVICE\_NAME : | ||
- | - MYSQL\_HOST : nom de l' | ||
- | - MYSQL\_PORT : port du service MySQL (défaut: 3306) | ||
- | - MYSQL\_USER : nom de l' | ||
- | - MYSQL\_PASS : mot de passe de l' | ||
- | - MYSQL\_DB : nom de la base de donnée MySQL sauvegardée | ||
- | - INIT\_BACKUP : | ||
- | - 1 = sauvegarde au démarrage du script | ||
- | - 0 = pas de sauvegarde au démarrage | ||
- | - CRON\_TIME : règle cron définissant la fréquence d' | ||
- | - EXTRA\_OPTS : options de sauvegarde supplémentaire (ex: `--all-databases, | ||
- | - BACKUP\_FOLDER : dossier de sauvegarde sur la machine hôte | ||
- | |||
- | `postgres_run.sh` : Effectue une sauvegarde **d' | ||
- | |||
- | - POSTGRES\_SERVICE\_NAME : | ||
- | - POSTGRES\_HOST : nom de l' | ||
- | - POSTGRES\_PORT : port du service PostgresSQL (défaut: 5432) | ||
- | - POSTGRES\_USER : nom de l' | ||
- | - POSTGRES\_PASS : mot de passe de l' | ||
- | - POSTGRES\_DB : nom de la base de donnée PostgresSQL sauvegardée | ||
- | - INIT\_BACKUP : | ||
- | - 1 = sauvegarde au démarrage du script | ||
- | - 0 = pas de sauvegarde au démarrage | ||
- | - CRON\_TIME : règle cron définissant la fréquence d' | ||
- | - EXTRA\_OPTS : options de sauvegarde supplémentaire | ||
- | - BACKUP\_FOLDER : dossier de sauvegarde sur la machine hôte | ||
- | |||
- | Trois questions se posent alors : | ||
- | - Comment transmettre plusieurs paramètres (décrivant plusieurs bases de données) à l' | ||
- | * Jusqu' | ||
- | * Les variable Bash de type tableau ne sont pas gérés par Docker. | ||
- | - Comment utiliser les scripts issus des images Docker existantes ? | ||
- | * Peut-ont les utiliser tel quel, et faire en sorte de les importer des images existantes (du moins de leur source) | ||
- | * Ou est-il nécessaire d' | ||
- | - Comment monter un nombre variable de volumes, représentant les différents dossiers de sauvegardes sur la machine hôte ? | ||
- | |||
- | A ces différentes questions les réponses suivantes ont été apportées : | ||
- | - La solution choisie est de transmettre les paramètres à l' | ||
- | * Le paramètre `MYSQL_HOST` utile au script // | ||
- | * Pour mieux comprendre voici l' | ||
- | Pour i allant de 1 au nombre de sauvegarde MySQL | ||
- | Définir chaque variable utile au script mysql\_run.sh en prenant le i-ème élément de la liste correspondante | ||
- | Lancer mysql\_run.sh avec ces variables | ||
- | Pour i allant de 1 au nombre de sauvegarde PostgresSQL | ||
- | Définir chaque variable utile au script postgres\_run.sh en prenant le i-ème élément de la liste correspondante | ||
- | Lancer postgres\_run.sh avec ces variables</ | ||
- | - Il est nécéssaire de modifier les scripts issus des images // | ||
- | * Chaque script sauvegardait directement dans le dossier ///backup/ //, d'où l' | ||
- | * Chaque script crée un autre script pour effectuer la sauvegarde, qui est appelé au démarrage (si INIT\_BACKUP=1) et par cron. Chaque script créé doit donc avoir un nom unique, d'où l' | ||
- | |||
- | L' | ||
- | * `mongodb_run.sh`, | ||
- | * `run.sh` qui réalise l' | ||
- | |||
- | |||
- | Pour être plus précis sur le fonctionnement du script `run.sh`, celui-ci transforme les listes passés en tant que variables d' | ||
- | |||
- | Pour chaque service défini dans la variable MYSQL\_HOST du fichier | ||
- | `docker-compose.yml`, | ||
- | lancés. Ces deux scripts s' | ||
- | et `< | ||
- | Le fichier `< | ||
- | fréquence d' | ||
- | MYSQL\_CRON\_TIME\_LIST du fichier `docker-compose.yml`. Le lancement du script | ||
- | effectue un dump de la base de données dans l' | ||
- | `/ | ||
- | |||
- | ===== Mise en place ===== | ||
- | Voici un exemple d' | ||
- | < | ||
- | pica-backup: | ||
- | image: pica-backup | ||
- | container_name: | ||
- | links: | ||
- | - <nom de l' | ||
- | - <nom de l' | ||
- | - ... | ||
- | - <nom de l' | ||
- | environment: | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | |||
- | volumes: | ||
- | - "/ | ||
- | </ | ||
- | NB: La structure des variables d' | ||
- | |||
- | Voic un exemple d' | ||
- | * Deux utilisent une base de donnée MySQL : **databaseA** et **databaseB**. | ||
- | * Les sauvegardes sont respectivement stockées dans les dossiers / | ||
- | * Les noms d' | ||
- | * Nous sauvegardons toute la base de données (`--all-databases`) en une seule transaction (`--single-transaction`) toutes les heures (`0 * * * *`). | ||
- | * Une sauvegarde et effectuée au démarrage pour les deux services (`MYSQL_INIT_BACKUP_LIST` à 1,1) | ||
- | * Deux autres utilisant une base de donnée PostgreSQL : **databaseC** et **databaseD** | ||
- | * Les sauvegardes sont respectivement stockées dans les dossiers / | ||
- | * Les noms d' | ||
- | * Nous sauvegardons les bases de données dbC et dbD avec les utilisateurs postgreSQL user\_dbC et user\_dbD toutes les heures (`0 * * * *`) | ||
- | * Une sauvegarde et effectuée au démarrage pour les deux services (`POSTGRES_INIT_BACKUP_LIST` à 1,1) | ||
- | |||
- | < | ||
- | pica-backup: | ||
- | image: registry.picasoft.net: | ||
- | container_name: | ||
- | links: | ||
- | - databaseA | ||
- | - databaseB | ||
- | - databaseC | ||
- | - databaseD | ||
- | environment: | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | - " | ||
- | volumes: | ||
- | - / | ||
- | - / | ||
- | </ | ||
- | ===== Restauration ===== | ||
- | |||
- | Afin de restaurer une sauvegarde SQL dans l'une des bases de donnée, des scripts on été générés à l’intérieur du conteneur de sauvegarde unique. | ||
- | |||
- | Dans le cas ou ce conteneur s' | ||
- | < | ||
- | # Lancer un shell interactif dans le conteneur | ||
- | root@machine-hote: | ||
- | # Éxecuter le script de restauration dans le conteneur | ||
- | root@imagedocker:/ | ||
- | |||
- | ===== Vérification de fonctionnement ===== | ||
- | Afin de s' | ||
- | * Regarder le nom des sauvegardes dans le dossier de sauvegarde de la machine hôte (/ | ||
- | -rw-r--r-- 1 root root 172M janv. 5 12:00 2018.01.05.120001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 5 06:00 2018.01.05.060001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 5 00:00 2018.01.05.000001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 4 18:00 2018.01.04.180001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 4 12:00 2018.01.04.120001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 4 06:00 2018.01.04.060001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 4 00:00 2018.01.04.000001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 3 18:00 2018.01.03.180001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 3 12:00 2018.01.03.120001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 3 06:00 2018.01.03.060001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 3 00:00 2018.01.03.000001.sql | ||
- | -rw-r--r-- 1 root root 172M janv. 2 18:00 2018.01.02.180001.sql | ||
- | -rw-r--r-- 1 root root 171M janv. 2 12:00 2018.01.02.120001.sql | ||
- | -rw-r--r-- 1 root root 171M janv. 2 06:00 2018.01.02.060001.sql | ||
- | -rw-r--r-- 1 root root 171M janv. 2 00:00 2018.01.02.000001.sql | ||
- | -rw-r--r-- 1 root root 171M janv. 1 18:00 2018.01.01.180001.sql | ||
- | -rw-r--r-- 1 root root 171M janv. 1 12:00 2018.01.01.120001.sql | ||
- | -rw-r--r-- 1 root root 171M janv. 1 06:00 2018.01.01.060001.sql | ||
- | </ | ||
- | * L' | ||
- | * Au redémarrage du conteneur, les services pour lesquels l' | ||
- | pica-backup | ||
- | pica-backup | ||
- | pica-backup | ||
- | pica-backup | ||
- | pica-backup | ||
- | pica-backup | ||
- | pica-backup | ||
- | pica-backup | ||
- | pica-backup | ||
- | pica-backup | ||
- | </ | ||