Datalbi  
Créé le 26/12/2016 par Laurent Bourcier

Sauvegarde et Restauration de MongoDB 3.4 par snapshot LVM

La technique de snapshot est la plus appropriée pour sauvegarder des gros volumes de données.

Pour sauvegarder par snapshot LVM, il faut :

Remarque : depuis MongoDB 3.2, les journaux peuvent ne pas être sur le même volume que les datafiles.

L'état de la sauvegarde correspond au dernier checkpoint qui se produit tous les 2 Go de données ou toutes les minutes.

Préparation : déplacer les datafiles et journaux sur un volume LVM dédié

Cette étape est à réaliser dans le cas où /var/lib/mongodb n'est pas encore sur un logical volume dédié. Typiquement, c'est le cas lorsque /var/lib/ongodb est monté sous /, ce qui n'est pas conseillé.

1) Créer une partition disque de type LVM pour héberger le futur volume group dédié aux données mongodb

On part d'un disque vierge. La partition doit être de type LVM (code 8e).

fdisk /dev/sdb

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x7f9a1370.

Commande (m pour l'aide) : p
Disque /dev/sdb : 10 GiB, 10737418240 octets, 20971520 secteurs
Unités : sectors of 1 * 512 = 512 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7f9a1370

Commande (m pour l'aide) : n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Numéro de partition (1-4, 1 par défaut) : 1
Premier secteur (2048-20971519, 2048 par défaut) :
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, 20971519 par défaut) :

Created a new partition 1 of type 'Linux' and of size 10 GiB.

Commande (m pour l'aide) : t
Selected partition 1
Partition type (type L to list all types): 8e
Changed type of partition 'Linux' to 'Linux LVM'.

Commande (m pour l'aide) : p
Disque /dev/sdb : 10 GiB, 10737418240 octets, 20971520 secteurs
Unités : sectors of 1 * 512 = 512 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7f9a1370

Périphérique Amorçage Start      Fin Secteurs Size Id Type
/dev/sdb1              2048 20971519 20969472  10G 8e LVM Linux

Commande (m pour l'aide) : w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

2) Créer un physical volume

pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created

3) Créer un volume group

vgcreate mongodb_data /dev/sdb1
  Volume group "mongodb_data" successfully created

vgdisplay -s
  "mongodb_data" 10,00 GiB [0         used / 10,00 GiB free]

4) Créer un logical volume qui ne prend pas toute la place du vg

Il faut laisser de la place dans le vg pour le volume de snapshot.

lvcreate -L8G -n lv_mongodb_data mongodb_data
  Logical volume "lv_mongodb_data" created.

lvdisplay mongodb_data
  --- Logical volume ---
  LV Path                /dev/mongodb_data/lv_mongodb_data
  LV Name                lv_mongodb_data
  VG Name                mongodb_data
  LV UUID                VKkFaH-IP3P-mwDR-TjAd-qIS5-5e2E-u5C6f4
  LV Write Access        read/write
  LV Creation host, time mongodb01, 2016-12-26 18:37:08 +0100
  LV Status              available
  # open                 0
  LV Size                8,00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

vgdisplay -s
  "mongodb_data" 10,00 GiB [8,00 GiB  used / 2,00 GiB free]

5) Créer un File System

mkfs -t xfs /dev/mongodb_data/lv_mongodb_data

meta-data=/dev/mongodb_data/lv_mongodb_data isize=512    agcount=4, agsize=524288 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0
data     =                       bsize=4096   blocks=2097152, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =aucun                  extsz=4096   blocks=0, rtextents=0

6) Configurer le montage de File System de maniere permanente

On peut utiliser le nom du Logical Volume ou bien son UUID donné par la commande blkid :

# blkid
/dev/sda1: UUID="aa326a29-95b4-4430-a132-118fdb5a41dd" TYPE="ext4" PARTUUID="f73d47e4-01"
/dev/sda5: UUID="183c21ef-286d-45cc-9b15-15ef6b96f258" TYPE="swap" PARTUUID="f73d47e4-05"
/dev/sdb1: UUID="u1z8Iq-mMCB-Du0X-XAr6-IdGY-uVSb-7lMAq2" TYPE="LVM2_member" PARTUUID="7f9a1370-01"
/dev/mapper/mongodb_data-lv_mongodb_data: UUID="72339a7b-d636-4052-95a1-c32e04cdf03d" TYPE="xfs"
echo "/dev/mongodb_data/lv_mongodb_data  /var/lib/mongodb  xfs  defaults  0  2" >> /etc/fstab

options = defaults : valeurs par défaut
dump = 0           : utilisé pour les sauvegardes, toujours 0
pass = 2           : 0 pour le swap, 1 pour le FS / et 2 pour les autres partitions

7) Arreter mongodb pour déplacer les fichiers

service mongod stop

8) Déplacer les fichiers vers le nouveau File System

mount /dev/mongodb_data/lv_mongodb_data /mnt

df -T /mnt
Sys. de fichiers                         Type blocs de 1K Utilisé Disponible Uti% Monté sur
/dev/mapper/mongodb_data-lv_mongodb_data xfs      8378368   32960    8345408   1% /mnt

mv /var/lib/mongodb/* /mnt

umount /mnt

mount -a

df -T
Sys. de fichiers                         Type     blocs de 1K Utilisé Disponible Uti% Monté sur
udev                                     devtmpfs     1004796       0    1004796   0% /dev
tmpfs                                    tmpfs         204836    3288     201548   2% /run
/dev/sda1                                ext4       101015968 2145872   93715744   3% /
tmpfs                                    tmpfs        1024176       0    1024176   0% /dev/shm
tmpfs                                    tmpfs           5120       0       5120   0% /run/lock
tmpfs                                    tmpfs        1024176       0    1024176   0% /sys/fs/cgroup
tmpfs                                    tmpfs            100       0        100   0% /run/lxcfs/controllers
tmpfs                                    tmpfs         204836       0     204836   0% /run/user/1000
/dev/mapper/mongodb_data-lv_mongodb_data xfs          8378368  340504    8037864   5% /var/lib/mongodb

chown mongodb:mongodb /var/lib/mongodb

9) Démarrer mongodb

service mongod start

service mongod status
. mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: active (running) since lun. 2016-12-26 19:06:08 CET; 7s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 1664 (mongod)
    Tasks: 17
   Memory: 33.1M
      CPU: 215ms
   CGroup: /system.slice/mongod.service
           +-1664 /usr/bin/mongod --quiet --config /etc/mongod.conf

déc. 26 19:06:08 mongodb01 systemd[1]: Started High-performance, schema-free document-oriented database.

Réalisation de la sauvegarde par Snapshot LVM

Vérifier au préalable qu'il reste de la place dans le vg mongodb_data

vgdisplay -s mongodb_data
  "mongodb_data" 10,00 GiB [8,00 GiB  used / 2,00 GiB free]

La sauvegarde s'effectue comme suit :.

lvcreate -L2000M -s -n snap_mongodb /dev/mongodb_data/lv_mongodb_data
  Logical volume "snap_mongodb" created.

mkdir /mnt/snap_mongodb
mount /dev/mongodb_data/snap_mongodb /mnt/snap_mongodb -onouuid,ro

BACKUP_DIR=/backup/mongodb/`date '+%Y%m%d'`
mkdir -p $BACKUP_DIR

cp -rp /mnt/snap_mongodb/* $BACKUP_DIR

umount /mnt/snap_mongodb
rmdir /mnt/snap_mongodb
lvremove -f /dev/mongodb_data/snap_mongodb
  Logical volume "snap_mongodb" successfully removed

Restauration d'une sauvegarde

service mongod stop

BACKUP_DIR=/backup/mongodb/20161226

rm -rf /var/lib/mongodb/*

cp -rp $BACKUP_DIR/* /var/lib/mongodb

service mongod start

service mongod status
. mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: active (running) since lun. 2016-12-26 19:50:05 CET; 4s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 1943 (mongod)
    Tasks: 17
   Memory: 33.1M
      CPU: 651ms
   CGroup: /system.slice/mongod.service
           +-1943 /usr/bin/mongod --quiet --config /etc/mongod.conf

déc. 26 19:50:05 mongodb01 systemd[1]: Started High-performance, schema-free document-oriented database.