18
0
Fork 0

Revue des premières sections de la page et amélioration notable des sections sauvegarde/restauration

This commit is contained in:
whirigoyen 2022-12-05 18:30:26 +01:00
parent a71ee4be0c
commit 8943ba6b9e
1 changed files with 112 additions and 72 deletions

View File

@ -26,7 +26,9 @@ Il est possible d'installer MongoDB 5.0 (5.0.8 minimum) et 6.0 à partir des dé
# apt update && apt install mongodb-org
~~~
### Debian Buster
### Anciennes version de Debian
#### Debian Buster
À partir de Debian 10 (Buster), MongoDB n'est plus distribué dans les dépôts de Debian.
Il est néanmoins possible d'installer MongoDB 4.2, 4.4, 5.0 et 6.0 à partir des dépôts officiels du logiciel.
@ -41,7 +43,7 @@ Il est néanmoins possible d'installer MongoDB 4.2, 4.4, 5.0 et 6.0 à partir de
Tous les détails sont disponibles sur <https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/>.
### Debian Stretch
#### Debian Stretch
Dans Debian Stretch, MongoDB 3.2 est distribué dans les dépôts Debian.
Il est aussi possible d'installer MongoDB 3.6+ à partir des des dépôts officiels du logiciel.
@ -49,13 +51,13 @@ Il est aussi possible d'installer MongoDB 3.6+ à partir des des dépôts offici
> **Important**: Bien que les noms de paquets soient différents, les deux versions ne peuvent pas cohabiter ensemble sur un même système !
#### Version Debian (3.2)
##### Version Debian (3.2)
~~~
# apt install mongodb
~~~
#### Version mongodb.org (3.6, 4.0 ou 4.2)
##### Version mongodb.org (3.6, 4.0 ou 4.2)
Les dépôts mongodb.org proposent les versions 3.6, 4.0 et 4.2 pour Debian Strech.
@ -140,14 +142,14 @@ au port TCP de MongoDB.
#### Mode avec authentification
L'authentification avec MongoDB peut paraître surprenante à première vue. En effet chaque utilisateur est associée à une base pour l'authentification. Mais les privilèges de l'utilisateur peuvent aller au-delà de la base de données qui sert à l'authentification.
L'authentification avec MongoDB peut paraître surprenante à première vue. En effet chaque utilisateur est associé à une base pour l'authentification. Mais les privilèges de l'utilisateur peuvent aller au-delà de la base de données qui sert à l'authentification.
Aussi, un utilisateur, pour s'authentifier, a besoin de son login, de son mot de passe **et** du nom de sa base d'authentification.
> **Note** : Il peut donc y avoir plusieurs utilisateurs *foo* avec des privilèges différent. Ce qui les distinguera sera la base d'authentification
> **Note** : Il peut donc y avoir plusieurs utilisateurs `foo` avec des privilèges différent. Ce qui les distinguera sera la base d'authentification
Par convention, on définiera donc un utilisateur d'administration (*mongoAdmin*) dans la base `admin`
Par convention, on définira un utilisateur d'administration `mongoAdmin` dans la base `admin`
Pour activer l'authenfication dans les réglages du service MongoDB, il faut alors passer la directive `authorization` à enabled, dans
Pour activer authentification dans les réglages du service MongoDB, il faut alors passer la directive `authorization` à enabled, dans
~~~
security:
@ -155,52 +157,49 @@ security:
~~~
Il n'est pas forcément nécessaire de créer un compte avec un rôle administrateur avant d'activer l'authentification.
En effet, en l'absence de comptes utilisateurs, mongodb va accepter les connexions *locales* sans authentification pour permettre notamment de créer un compte.
En effet, en l'absence de comptes utilisateurs, MongoDB va accepter les connexions *locales* sans authentification pour permettre notamment de créer un compte.
~~~
$ mongo
> use admin
$ mongosh # mongo sur les anciennes versions
test> use admin
> db.createUser(
admin> db.createUser(
{
user: "mongoAdmin",
pwd: "PASSWORD",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
Successfully added user.
Successfully added user: {
"user" : "mongoAdmin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
> db.system.users.find()
{ "_id" : "admin.mongoAdmin", "userId" : UUID("3d475ec9-b82c-4312-8ce6-399bcbe3ca7a"), "user" : "mongoAdmin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "lO6VBPnKD0dC5TwRcCJwZg==", "storedKey" : "AUUwnA6v/8LbSEUpDU5EXQmp9sY=", "serverKey" : "DjHukfkoW0QE5Zy/5plD9FLrsu8=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "fqRp+/wrOGTyk1hiTn4RoPQr4jWVlqw79GsD4g==", "storedKey" : "/aaz0CJHlFfFDD5bSBPOBCnipn07ezx+X0pHFABeOV0=", "serverKey" : "W6BOf07RoYytpgJc4KOoTTTID7qJ1iah9Wqwub9xjgE=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
admin> db.system.users.find()
[
{
_id: 'admin.mongoAdmin',
userId: new UUID("4efb0723-ca57-4cb7-b2ba-221aeb8cae86"),
user: 'mongoAdmin',
db: 'admin',
credentials: [...],
roles: [ { role: 'userAdminAnyDatabase', db: 'admin' } ]
}
]
~~~
C'est seulement une fois ce premier utilisateur "mongoAdmin" créé que l'authentication est activée !!
C'est seulement une fois ce premier utilisateur `mongoAdmin` créé que l'authentification est activée !
Si aucun utilisateur n'est crée, l'authentification reste inactive.
On peut ensuite se connecter à la base "admin" ainsi :
On peut ensuite se connecter à la base `admin` ainsi :
~~~
$ mongo admin -u mongoAdmin -p PASSWORD
~~~
> *Note*: Si on spécifie simplement l'argument `-p`, sans valeur, mongo demandera de saisir le mot de passe. Ainsi, il ne sera pas dans votre historique shell !
> *Note*: Si on spécifie simplement l'argument `-p`, sans valeur, MongoDB demandera de saisir le mot de passe. Ainsi, il ne sera pas dans votre historique shell.
Pour les accès aux base, les utilisateurs sont stockés dans la collection _system.users_ propre à chaque base.
Pour les accès aux bases, les utilisateurs sont stockés dans la collection _system.users_ propre à chaque base.
## Utilisation
### Administration en cli
## Administration des utilisateurs
Comme pour MySQL, on peut manipuler mongo en CLI en mode interactif avec la commande `mongo`
@ -208,18 +207,19 @@ Comme pour MySQL, on peut manipuler mongo en CLI en mode interactif avec la comm
$ mongo admin -u mongoAdmin -p PASSWORD
```
Ici, pour se connecter à la base locale admin. Comme la base d'authentification n'est pas spécifiée, ça sera la base à laquelle on se connecte (ici admin) qui servira pour l'authentificat
Ici, pour se connecter à la base locale admin. Comme la base d'authentification n'est pas spécifiée, ça sera la base à laquelle on se connecte (ici admin) qui servira pour l'authentification.
> *Note*: Pour vous connecter à une base différente de celle d'authentification, on pourra spécifier le nom de cette base avec l'argument `--authenticationDatabase XXX`
#### Créer un utilisateur
### Créer un utilisateur pour une base de données
~~~
> use admin;
> use myApp;
> db.createUser(
myApp> db.createUser(
{
"user" : "myApp",
"user" : "myAppOwner",
"pwd" : "PASSWORD",
roles: [
{ "role" : "dbOwner", "db" : "myApp" }
@ -229,11 +229,11 @@ Ici, pour se connecter à la base locale admin. Comme la base d'authentification
~~~
#### Changer le mot de passe dun utilisateur
### Changer le mot de passe dun utilisateur
~~~
# apg -n1 -m23
# mongo …
# mongosh
> use admin
> db.changeUserPassword("my_user", passwordPrompt())
~~~
@ -246,7 +246,7 @@ Sans _prompt_ :
~~~
#### Supprimer un utilisateur
### Supprimer un utilisateur
Supprimons l'utilisateur foo de la base admin :
@ -257,7 +257,7 @@ Supprimons l'utilisateur foo de la base admin :
true
~~~
#### Lister tous les utilisateurs
### Lister tous les utilisateurs
~~~
> use admin
@ -266,7 +266,10 @@ true
{ "_id" : "admin.mongoAdmin", "userId" : UUID("3d475ec9-b82c-4312-8ce6-399bcbe3ca7a"), "user" : "mongoAdmin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "lO6VBPnKD0dC5TwRcCJwZg==", "storedKey" : "AUUwnA6v/8LbSEUpDU5EXQmp9sY=", "serverKey" : "DjHukfkoW0QE5Zy/5plD9FLrsu8=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "fqRp+/wrOGTyk1hiTn4RoPQr4jWVlqw79GsD4g==", "storedKey" : "/aaz0CJHlFfFDD5bSBPOBCnipn07ezx+X0pHFABeOV0=", "serverKey" : "W6BOf07RoYytpgJc4KOoTTTID7qJ1iah9Wqwub9xjgE=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
~~~
#### Lister les bases de données
## Administration des bases de données
### Lister les bases de données
~~~
> show dbs
@ -276,7 +279,7 @@ foo 0.000GB
local 0.000GB
~~~
#### Supprimer une base
### Supprimer une base de données
Pour supprimer la base foo :
@ -290,7 +293,7 @@ Pour supprimer la base foo :
~~~
#### Lister les collections d'une base
### Lister les collections d'une base de données
~~~
> use foo
@ -301,11 +304,11 @@ bar
baz
~~~
#### Créer une base de données
### Créer une base de données
Il ny a pas de commande équivalente à `CREATE DATABASE` dans MongoBD. Une base de données est effectivement créée lorsque des données sont insérées dans la base.
Pour créer une base de données, il faut sy attacher avec la commande `use` puis y ajouter des données.
Pour créer une base de données, il faut sy attacher avec la commande `use <DB>` puis ajouter des données dans une collection :
```
use math
@ -313,20 +316,14 @@ db.constants.insert({name: "e", value: "2.7182818"})
```
Les commandes précédentes permettent dajouter un élément à une collection `constants` dans la base `math`.
`name` et `value` sont des chaînes de caractères quelconques et non des mots-clés.
#### Autre exemples
## Autres commandes diverses
Voici quelques opérations de base
~~~
> show dbs
admin
local
test
> use foo
switched to db foo
> show collections
> db.bar.find()
> db.bar.save( { a : 1 } )
> db.bar.save( { a : 2 } )
@ -395,42 +392,84 @@ foreach ($res as $obj) {
}
~~~
## Sauvegarde
Il existe plusieurs stratégies possibles pour faire de la sauvegarde comme détaillée dans la documentation de mongod : <https://docs.mongodb.com/manual/core/backups/>
### Via snapshots du système de fichier
## Sauvegarde via snapshots du système de fichier
Voir <https://docs.mongodb.com/manual/tutorial/backup-with-filesystem-snapshots/>
### Via mongodump
`mongodump` permet de créer des sauvegardes dans des fichiers au format bson utilisables par la commande `mongorestore`
## Sauvegarde et restoration via `mongodump` et `mongorestore`
> **Important**: `mongodump` sauvegarde uniquement les documents d'une base. Cela signifie qu'après leur re-injections, il y aura une phase de reconstructions des index de la base de donnée (qui sera plus ou moins longue en fonction de la quantitée de données et des performances de la machine)
Il existe plusieurs stratégies possibles de sauvegarde, comme détaillées dans la documentation de MongoDB : <https://docs.mongodb.com/manual/core/backups/>
> **Note**: Si l'authentification est activée, il convient de créer un compte dédié à la sauvegarde. Il existe pour cela un rôle dédié pour les opérations de sauvegarde `backup`
Si l'authentification est activée, on crée un compte dédié à la sauvegarde et à la restauration, qu'on appelle `mongoBackup`, et auquel on donne les rôles built-in `backup` et `restore` :
~~~
# mongosh admin -u mongoAdmin -p
admin> db.createUser(
{
user: "mongoBackup",
pwd: "PASSWORD",
roles: [ "backup", "restore" ]
}
)
~~~
### `mongodump`
`mongodump` permet de créer des sauvegardes dans des fichiers au format BSON utilisables par la commande `mongorestore`.
> **Important**: `mongodump` sauvegarde uniquement les documents d'une base. Cela signifie qu'après leur ré-injections, il y aura une phase de reconstructions des index de la base de données (qui sera plus ou moins longue en fonction de la quantité de données et des performances de la machine).
Pour sauvegarder :
~~~
# mkdir -p /home/backup/mongodump/
# mongodump --username mongoDump --password PASSWORD --authenticationDatabase admin --output /home/backup/mongodump/
# mongodump -u mongoBackup -p PASSWORD --authenticationDatabase admin --out /home/backup/mongodump/
~~~
Ainsi, mongo écrire la sauvegarde dans `/home/backup/mongodump/`, avec un dossier par base.
MongoDB écrit la sauvegarde dans `/home/backup/mongodump/`, avec un dossier par base.
Il est possible de générer un dump compressé avec l'option `--gzip`. Lors de l'injection de la sauvegarde avec `mongorestore` il faudra alors préciser à nouveau cet argument.
Il est possible de générer un dump compressé avec l'option `--gzip`. Lors de l'injection de la sauvegarde avec `mongorestore` il faudra alors préciser à nouveau cet argument.
## Restauration
> **Note** : Si l'authentification est activée, il existe aussi un rôle dédié pour la restoration de données : `restore`
### Restauration
Pour restaurer une base :
~~~
cd /home/backup/mongodump/
# mongorestore --db dbname dbname
mongorestore --db admin admin
# cd /home/backup/mongodump/
# ls
# mongorestore -u mongoBackup -p PASSWORD --authenticationDatabase admin --db <dbname> <dump_dir>
~~~
> **Note** : Si le dump est compressé, il faut ajouter l'option `--gzip` à la commande.
Pour restaurer complètement MongoDB (si le `datadir` est cassé par exemple), il faut désactiver temporairement l'authentification, car on ne peut plus lire la base `admin` pour s'authentifier :
~~~
# vim /etc/mongod.conf
# systemctl restart mongod
# systemctl status mongod
~~~
Restaurer toutes les bases :
~~~
# for db in $(ls /home/backup/mongodump/); do
# mongorestore --db "$db" /home/backup/mongodump/"$db"
# done
~~~
Réactiver l'authentification :
~~~
# vim /etc/mongod.conf
# systemctl restart mongod
# systemctl status mongod
~~~
> **Note** : Si le dump est compressé, il faut ajouter l'option `--gzip` à la commande
## Réplication avec replica set
@ -532,6 +571,7 @@ mongosh -u someuser mongodb://10.0.0.1:27017,10.0.0.2:27017,10.0.0.3:27017/?repl
Avec cette URL, le _shell_ `mongosh` survivra au cas où le serveur primaire devient indisponible et quune nouvelle élection à lieu.
### État du _replica set_
```
@ -759,7 +799,7 @@ Si l'authentification est activée, il faut alors créer un compte. On peut util
> use admin
> db.createUser(
{
user: "mmongoMonitoring",
user: "mongoMonitoring",
pwd: "PASSWORD",
roles: [ "clusterMonitor" ]
}