web-dev-qa-db-fra.com

Comment sauvegarder une grande base de données MongoDB

Quelle est la méthode recommandée pour sauvegarder des ensembles de données volumineux dans MongoDB? Disons que nous avons une taille de données de l'ordre de 10 To - comment voulez-vous sauvegarder cela?

Nous envisageons un nœud de jeu de répliques caché, éventuellement retardé. Le retard nous protégerait des chutes accidentelles de toute la base de données. Est-ce une solution viable et quelles autres options recommanderiez-vous d'étudier?

Merci!

15
Malakim

Avec la nécessité de sauvegarder 10 To, cela devient un peu compliqué.

Les répliques ne remplacent pas les sauvegardes appropriées

Bien que les membres du jeu de répliques retardés puissent fournir un moyen relativement facile de vous aider dans les opérations accidentelles, il n'y a pas de remplacement pour les sauvegardes appropriées, tout comme RAID ne remplace pas les sauvegardes basées sur le système de fichiers.

Recommandations

Cela dépend fortement de l'apparence de votre configuration.

Instantanés SAN

Avec 10 To, je suppose que vous avez une sorte de SAN attaché. La façon la plus simple de sauvegarder MongoDB dans ces environnements est de vous assurer que la journalisation est activée à la fois sur le système de fichiers et MongoDB et prenez simplement un instantané du volume SAN de l'un des secondaires, éventuellement caché pour vous assurer que vos opérations ne soient pas interrompues. Cela ne prend généralement que quelques secondes, mais assurez-vous que votre fenêtre d'oplog de réplication est suffisant. Sinon, vous devrez peut-être resynchroniser le secondaire.

N'utilisez pas mongodump

Je dois être en désaccord avec RolandoMySQLDBA sur l'utilisation de mongodump. Tout d'abord, il impose des verrous sur le serveur. Bien qu'ils soient levés relativement rapidement, le nombre de verrous peut s'additionner et interférer avec vos opérations, à moins qu'ils ne soient exécutés sur un nœud caché ou lorsqu'aucune préférence de lecture ne frappe les secondaires. De plus, ce n'est pas exactement rapide. Je m'attends à ce qu'il fonctionne pendant des heures, au moins, probablement en prenant plus de temps que votre fenêtre de sauvegarde. Note latérale: Toujours exécuter mongodump avec le --oplog option. Gardez également à l'esprit que mongodump ne sauvegarde pas les index, mais les opérations pour créer des index. Ces indices doivent être recréés lors d'une restauration, ce qui peut augmenter considérablement le temps dont vous avez besoin. D'après mon expérience, si vous devez restaurer une base de données, vous voulez l'avoir le plus rapidement possible. Un autre point pourquoi mongodump n'est pas adapté pour sauvegarder 10 To.

Remarques sur les instantanés LVM

Vous pouvez faire un instantané LVM sur une instance de mongod en cours d'exécution à condition que la journalisation soit activée dans mongod (et d'après mon expérience, cela ne fait pas de mal de l'activer sur le FS level, also). Cependant, les instantanés LVM ont des implications. Tout d'abord, vous devez évidemment avoir suffisamment d'espace disque pour pouvoir effectuer les modifications pendant les opérations de sauvegarde. Permettez-moi de clarifier cela.

Supposons que vous ayez un taux de changement horaire de 500 Go. Et que vous souhaitez que votre sauvegarde soit effacée avant qu'elle ne soit téléchargée sur un espace de stockage. Même lorsque vous utilisez bzip2 parallèle , la compression de 10 To nécessiterait quelques heures pour se terminer, tout simplement parce que le fait que votre débit de stockage de masse deviendrait probablement votre facteur limitant. Supposons qu'il faudrait 2 heures pour compresser les données à 2 To. Donc, maintenant, nous aurions besoin de 2 To + 2 * 500 Go d'espace disque total, 1 To nécessaire pour l'instantané LVM. Cela créerait le besoin de surapprovisionner votre système de fichiers de - au moins 30%. Dans le cas où vous souhaitez avoir une marge de sécurité appropriée, cela pourrait facilement augmenter à 60-70% (20% pour un facteur d'utilisation de 0,8 pour le système de fichiers d'origine, le même pour la taille de l'instantané plus l'espace nécessaire pour la sauvegarde bzippée elle-même ). Dans la plupart des environnements de production, cela serait inacceptable, car ce sur-approvisionnement serait statique (vous ne voudriez pas qu'un script de sauvegarde gêne dynamiquement votre LVM, n'est-ce pas?).

Sauvegarde MMS

Alors que MMS possède des fonctionnalités impressionnantes (sauvegarde continue, récupération facile à un point dans le temps), elle présente de sérieux inconvénients: son prix pour les déploiements importants peut facilement se chiffrer par milliers. taux de changement horaire de 500 Go sur ces 10 To, ce serait une somme moyenne à six chiffres pour les sauvegardes cloud. Mensuel.

Ma suggestion serait de prendre un abonnement entreprise pour vos serveurs pour avoir droit à une instance sur site MMS instance, sauvegarde incluse).

Sommaire

Voici les options que je prendrais par ordre décroissant de préférence.

  1. Instantanés SAN: faciles à mettre en œuvre, relativement bon marché
  2. Abonnement entreprise: Meilleures fonctionnalités. Installez-le, configurez-le, oubliez-le, il est là quand vous en avez besoin
  3. Instantanés LVM: faciles à implémenter, mais les coûts de sur-approvisionnement nécessaires peuvent résumer au fil du temps.
21
Markus W Mahlberg

Il y a deux options

SAUVEGARDE PHYSIQUE

Si cela ne vous dérange pas, la chose la plus simple à faire est

service mongod stop

Faire un instantané LVM ou une force brute cp du dossier de données Mongo sur un autre disque

service mongod start

Bien sûr, vous ne voulez pas de temps d'arrêt si les 10 To de données se trouvent sur une machine autonome.

RÉPLIQUE RETARDÉE

Si vous avez un jeu de réplicas avec trois nœuds, utilisez l'un des nœuds pour les sauvegardes

{
        "_id" : "myreplica",
        "version" : 1,
        "members" : [
                {
                        "_id" : 1,
                        "Host" : "10.20.30.40:27017",
                        "priority" : 2
                },
                {
                        "_id" : 2,
                        "Host" : "10.20.30.41:27017"
                },
                {
                        "_id" : 3,
                        "Host" : "10.20.30.42:27017",
                        "priority" : 0,
                        "slaveDelay" : 3600
                }
        ]
}

Utilisez le nœud avec "_id' : 3 toutes vos sauvegardes physiques. Par conséquent, aucun temps d'arrêt. Pour obtenir un instantané à minuit, vous pouvez lancer la sauvegarde à 1h00 du matin car le nœud caché a 1 heure de retard.

Bien sûr, l'inconvénient est d'avoir deux serveurs supplémentaires avec 10 To chacun et la santé mentale du sysadmin en danger.

MONGODUMP

Vous pouvez utiliser mongodump sur la machine autonome mais vous devez vous attendre à une dégradation des performances car mongodump est un programme client utilisant une connexion comme toute autre connexion.

Si vous souhaitez une sauvegarde ponctuelle, vous devez utiliser

mongodump --oplog 

La sauvegarde BSON logique sera plus petite (en particulier gzippée ou bzippée) que la sauvegarde physique.

En utilisant mongodump --oplog serait mieux fait contre le nœud caché. De cette façon, aucune performance n'est atteinte sur le Master.

AVERTISSEMENT

Je suis relativement nouveau à MongoDB (MongoDBA accidentel/accidentel). J'espère que ma réponse vous aidera.

5
RolandoMySQLDBA