Maison  >  Article  >  base de données  >  Exemple d'analyse de la persistance RDB dans Redis

Exemple d'analyse de la persistance RDB dans Redis

PHPz
PHPzavant
2023-05-28 18:11:17939parcourir

1. Introduction à RDB

RDB est une méthode utilisée par Redis pour la persistance. Il écrit un instantané de l'ensemble de données actuel en mémoire sur le disque, qui est un instantané (toutes les données de paire clé-valeur dans la base de données). Lors de la récupération, le fichier d'instantané est lu directement dans la mémoire.

2. Méthode de déclenchement

  RDB dispose de deux méthodes de déclenchement, à savoir le déclenchement automatique et le déclenchement manuel.

①, déclenchement automatique

 Sous SNAPSHOTTING dans le fichier de configuration redis.conf, nous l'avons introduit dans cet article.

  Exemple danalyse de la persistance RDB dans Redis

  ①, save : Ici est utilisé pour configurer les conditions de persistance RDB qui déclenchent Redis, c'est-à-dire quand enregistrer les données en mémoire sur le disque dur. Par exemple "enregistrer m n". Indique que lorsqu'il y a n modifications de l'ensemble de données en m secondes, bgsave est automatiquement déclenché (cette commande sera présentée ci-dessous, ainsi que la commande pour déclencher manuellement la persistance RDB)

 La configuration par défaut est la suivante :

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

  Bien sûr , si vous utilisez uniquement la fonction de mise en cache de Redis, non. Si la persistance est requise, vous pouvez commenter toutes les lignes de sauvegarde pour désactiver la sauvegarde. Vous pouvez utiliser save "" pour désactiver

 ②, stop-writes-on-bgsave-error : La valeur par défaut est oui. Lorsque RDB est activé et que la dernière sauvegarde des données en arrière-plan échoue, si Redis cesse de recevoir des données. Cela permettrait à l'utilisateur de se rendre compte que les données n'ont pas été correctement conservées sur le disque, sinon personne ne remarquerait qu'un sinistre s'est produit. Si Redis redémarre, il peut recommencer à recevoir des données

  ③, rdbcompression;La valeur par défaut est oui. Pour les instantanés stockés sur disque, vous pouvez définir s'il convient de les compresser pour le stockage. Si tel est le cas, Redis utilisera l'algorithme LZF pour la compression. Si vous ne souhaitez pas consommer de CPU pour la compression, vous pouvez désactiver cette fonctionnalité, mais les instantanés stockés sur le disque seront plus volumineux.

 ④, rdbchecksum : La valeur par défaut est oui. Après avoir stocké l'instantané, nous pouvons également laisser Redis utiliser l'algorithme CRC64 pour la vérification des données, mais cela augmentera la consommation de performances d'environ 10 %. Si vous souhaitez obtenir une amélioration maximale des performances, vous pouvez désactiver cette fonction.

  ⑤, dbfilename : Définissez le nom de fichier de l'instantané, la valeur par défaut est dump.rdb

  ⑥, dir : Définissez le chemin de stockage du fichier d'instantané. Cet élément de configuration doit être un répertoire, pas un fichier. nom. La valeur par défaut est de l'enregistrer dans le même répertoire que le fichier de configuration actuel.

 C'est-à-dire que grâce à la méthode de sauvegarde configurée dans le fichier de configuration, lorsque l'opération réelle répond au formulaire de configuration, la persistance RDB sera effectuée et l'instantané de mémoire actuel sera enregistré dans le répertoire configuré par dir Le nom du fichier. est déterminé par le dbfilename configuré.

②. Déclenchement manuel

Il existe deux commandes pour déclencher manuellement Redis pour la persistance RDB :

1. save

Cette commande bloquera le serveur Redis actuel. Lors de l'exécution de la commande save, Redis ne pourra pas traiter d'autres commandes jusqu'à ce que. le processus RDB jusqu’à ce qu’il soit terminé.

 Évidemment, cette commande provoquera un blocage à long terme pour les instances avec une mémoire relativement volumineuse, ce qui est une faille fatale. Afin de résoudre ce problème, Redis propose une deuxième méthode.

 2.bgsave

 Lors de l'exécution de cette commande, Redis effectuera des opérations d'instantané de manière asynchrone en arrière-plan, et l'instantané peut également répondre aux demandes des clients. Lorsque le processus Redis effectue une opération fork pour créer un processus enfant, le processus enfant sera responsable de l'exécution du processus de persistance RDB et se terminera automatiquement une fois terminé. Le blocage ne se produit que pendant la phase de fourche et est généralement de très courte durée.

 Fondamentalement, toutes les opérations RDB dans Redis utilisent la commande bgsave.

 ps : L'exécution de la commande flushall générera également le fichier dump.rdb, mais il est vide et dénué de sens

3. Restaurer les données

Déplacez le fichier de sauvegarde (dump.rdb) vers le répertoire d'installation redis et juste démarrez le service et redis chargera automatiquement les données du fichier en mémoire. Le serveur Redis se bloquera pendant le chargement du fichier RDB jusqu'à ce que le travail de chargement soit terminé.

 Pour obtenir le répertoire d'installation de redis, vous pouvez utiliser la commande config get dir

 Exemple danalyse de la persistance RDB dans Redis

4 Arrêter la persistance RDB

 Dans certains cas, nous voulons simplement utiliser la fonction de mise en cache de Redis, et ce n'est pas comme. en utilisant la fonction de persistance de Redis, alors à ce moment, nous ferions mieux d'arrêter la persistance RDB. Vous pouvez désactiver la fonction de sauvegarde en commentant toutes les lignes de sauvegarde dans le fichier de configuration redis.conf comme mentionné ci-dessus, ou en utilisant directement une chaîne vide pour la désactiver : save ""

  Vous pouvez également passer la commande :

1

redis-cli config set save " "

5. Avantages et inconvénients de RDB

  ① Avantages

L'ensemble de données de Redis est enregistré dans un fichier RDB à un moment précis. Ce fichier est très compact. Ce fichier est idéal pour la sauvegarde et la reprise après sinistre.

 2. Lors de la génération d'un fichier RDB, le processus principal Redis fork() un sous-processus pour gérer tout le travail de sauvegarde. Le processus principal n'a pas besoin d'effectuer d'opérations d'E/S sur disque.

  3.RDB est plus rapide qu'AOF lors de la restauration de grands ensembles de données.

  ② Inconvénients

  1. Les données RDB ne peuvent pas atteindre la persistance en temps réel/la persistance de deuxième niveau. Parce que chaque fois que bgsave s'exécute, il doit effectuer une opération fork pour créer un processus enfant, ce qui est une opération lourde (les données dans la mémoire sont clonées, et environ 2 fois l'expansion doit être prise en compte), et le coût d'une exécution fréquente est trop élevé (affecte les performances)

2. Les fichiers RDB sont enregistrés dans un format binaire spécifique Au cours de l'évolution de la version Redis, il existe plusieurs formats de versions RDB. Il y a un problème avec l'ancienne version du service Redis. non compatible avec la nouvelle version du format RDB (la version est incompatible)

  3. Faites-le une fois à un certain intervalle Sauvegarde, donc si Redis tombe accidentellement, toutes les modifications après le dernier instantané seront perdues (les données seront perdues)

6. Le principe de la sauvegarde automatique RDB

  Redis a une structure de statut de serveur :

1

2

3

4

5

6

7

8

9

struct redisServicestruct redisService{

     struct saveparam *saveparams;

     long long dirty;

     time_t lastsave;

}

  ①、首先看记录保存save条件的数组 saveparam,里面每个元素都是一个 saveparams 结构:

1

2

3

4

5

6

struct saveparam{

     time_t seconds;

     int changes;

};

  前面我们在 redis.conf 配置文件中进行了关于save 的配置:

longlongsale;

1

2

3

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存

save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存

save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

struct saveparam *saveparams;
time_t lastsave;

}

Exemple danalyse de la persistance RDB dans Redis

 ① , regardez d'abord le tableau saveparam qui enregistre les conditions de sauvegarde. Chaque élément qu'il contient est une structure saveparams :

.

1

🎜2🎜🎜3🎜🎜4🎜🎜5🎜🎜6🎜🎜🎜🎜 struct saveparam{🎜🎜 time_t secondes;🎜🎜 int changes;🎜🎜} ; 🎜🎜🎜🎜🎜🎜 Plus tôt, nous avons configuré save dans le fichier de configuration redis.conf : 🎜 🎜🎜🎜🎜🎜1🎜🎜2🎜🎜3🎜🎜🎜🎜save 900 1 : Indique que si le la valeur d'au moins 1 clé change dans les 900 secondes, enregistrez-la🎜🎜save 300 10 : Indique que si la valeur d'au moins 10 clés change dans les 300 secondes, enregistrez-la🎜🎜save 60 10000 : Indique que si la valeur d'au moins 10 000 clés change dans les 60 secondes, enregistrez-la >🎜🎜🎜🎜🎜🎜 Ensuite, le tableau saveparam dans l'état du serveur ressemblera à ce qui suit : 🎜🎜 🎜🎜🎜 ②, compteur sale et attribut lastsave🎜🎜 Le compteur sale enregistre la distance depuis la dernière exécution réussie de la commande save ou de la commande bgsave Combien de fois le serveur Redis a été modifié (y compris l'écriture, la suppression, la mise à jour, etc. ). 🎜🎜 L'attribut lastsave est un horodatage qui enregistre la dernière fois que la commande save ou la commande bgsave a été exécutée avec succès. 🎜🎜 Grâce à ces deux commandes, lorsque le serveur effectue avec succès une opération de modification, le compteur sale sera incrémenté de 1 et l'attribut lastsave enregistre la dernière fois que save ou bgsave a été exécuté. Le serveur Redis dispose également d'une fonction d'opération périodique severCron, qui est par défaut toutes les 100 millisecondes, cette fonction parcourra et vérifiera toutes les conditions de sauvegarde dans le tableau saveparams. Tant qu'une condition est remplie, la commande bgsave sera exécutée. 🎜🎜 Une fois l'exécution terminée, le compteur sale est mis à jour à 0 et lastsave est également mis à jour à l'heure d'achèvement de la commande exécutée. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer