Redis est configuré pour enregistrer des instantanés RDB

pendant écrit à Redis ( SET foo bar ) j'obtiens l'erreur suivante:

Redis incorrect est configuré pour enregistrer des snapshots RDB, mais est actuellement pas capable de persister sur le disque. Les commandes qui peuvent modifier le jeu de données sont désactivée. Veuillez consulter les journaux Redis pour plus de détails sur l'erreur.

fondamentalement, je comprends que le problème est que redis n'est pas en mesure d'enregistrer des données sur le disque, mais n'ont aucune idée comment faire se débarrasser du problème.

aussi la question suivante a le même problème, elle est abandonnée il y a longtemps sans réponses et très probablement sans tentatives de résoudre le problème.

229
demandé sur Community 2013-10-25 08:23:28

18 réponses

dans le cas où vous rencontrez l'erreur et certaines données importantes ne peuvent pas être écartées sur l'instance en cours d'exécution redis (problèmes avec les permissions pour le fichier rdb ou son répertoire incorrectement, ou en cours d'exécution de l'espace disque), vous pouvez toujours rediriger le fichier rdb pour être écrit ailleurs.

en utilisant redis-cli , vous pouvez faire quelque chose comme ceci:

CONFIG SET dir /tmp/some/directory/other/than/var
CONFIG SET dbfilename temp.rdb

après cela, vous pourriez vouloir exécuter un BGSAVE commande pour s'assurer que les données seront écrites dans le fichier rdb . Assurez-vous que lorsque vous exécutez INFO , bgsave_in_progress est déjà 0 (soit l'opération est réussie ou il ya une erreur rencontrée). Après cela, vous pouvez maintenant commencer à sauvegarder le fichier rdb généré dans un endroit sûr.

128
répondu Axel Advento 2017-08-03 08:44:41

vous pouvez l'arrêter en essayant de sauver le snapshot:

config set stop-writes-on-bgsave-error no

il s'agit d'une solution rapide, mais si vous vous souciez des données pour lesquelles vous l'utilisez, vous devriez vérifier pour s'assurer pourquoi bgsavez échoué en premier lieu.

209
répondu 思考zhe 2016-01-08 09:40:42

il peut y avoir des erreurs durant le processus bgsave à cause de la faible mémoire. Essayez ceci (à partir de Redis background save FAQ)

echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
41
répondu Chris 2013-12-13 22:37:22

réponse trop brève. ouvrez le terminal et tapez les commandes suivantes

redis-cli

et maintenant tapez

config set stop-writes-on-bgsave-error no
20
répondu Shafiq 2016-05-17 03:25:47

dans le cas où vous travaillez sur une machine linux, vérifiez également les permissions de fichiers et de dossiers de la base de données.

le db et le chemin qui y mène peuvent être obtenus via:

dans redis-cli :

CONFIG GET dir

CONFIG GET dbfilename

et dans la ligne de commande ls -l . Les permissions pour le répertoire doivent être 755 , et ceux pour le dossier devraient être 644 . En outre, normalement redis-server exécute comme l'utilisateur redis , donc son aussi agréable de donner à l'utilisateur redis la propriété du dossier en exécutant sudo chown -R redis:redis /path/to/rdb/folder . Ceci a été développé dans la réponse ici .

17
répondu smilee89 2017-10-20 12:02:39

remercie tout le monde pour vérifier le problème, apparemment l'erreur a été produite pendant bgsave .

pour moi, taper config set stop-writes-on-bgsave-error no dans une coquille et redémarrer Redis résolu le problème.

15
répondu Salvador Dali 2013-10-25 04:45:22

démarrer le serveur Redis dans un répertoire où Redis a des permissions d'écriture

les réponses ci-dessus vont certainement résoudre votre problème, mais voici ce qui se passe réellement:

l'emplacement par défaut pour stocker le fichier rdb.dump est ./ (indiquant le répertoire courant). Vous pouvez vérifier cela dans votre fichier redis.conf . Par conséquent, le répertoire d'où vous démarrez le serveur redis est celui où un fichier dump.rdb sera créé et mettre.

il semble que vous ayez commencé à exécuter le serveur redis dans un répertoire où redis n'a pas les bonnes permissions pour créer le fichier dump.rdb .

pour empirer les choses, redis ne vous permettra probablement pas non plus d'arrêter le serveur jusqu'à ce qu'il soit en mesure de créer le fichier rdb pour assurer la sauvegarde appropriée des données.

pour résoudre ce problème, vous devez aller dans l'environnement client redis actif en utilisant redis-cli et mettre à jour la clé dir et définir sa valeur à votre dossier de projet ou à tout autre dossier où non-root a les permissions de sauvegarder. Puis lancez BGSAVE pour invoquer la création du fichier dump.rdb .

CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE

(maintenant, si vous besoin pour sauver la décharge.le fichier rdb dans le répertoire dans lequel vous avez démarré le serveur, alors vous devrez modifier les permissions pour le répertoire afin que redis puisse y écrire. Vous pouvez rechercher stackoverflow pour savoir comment faire).

vous devriez maintenant pouvoir fermer le serveur redis. Notez que nous avons codé le chemin. Le codage dur est rarement une bonne pratique et je recommande fortement de démarrer le serveur redis à partir de votre répertoire de projet et de changer le dir key back to ./`.

CONFIG SET dir "./"
BGSAVE

de cette façon, lorsque vous avez besoin de redis pour un autre projet, le fichier dump sera créé dans le répertoire de votre projet actuel et non dans celui du chemin répertoire des projets.

8
répondu Govind Rai 2017-09-23 20:06:08

cette erreur résulte de la défaillance de BGSAVE. Pendant BGSAVE, Redis bifurque un processus enfant pour enregistrer les données sur le disque. Bien que la raison exacte de L'échec de BGSAVE peut être vérifiée à partir des journaux (généralement à /var/log/redis/redis-server.log sur les machines linux), mais un grand nombre de fois BGAVE échoue parce que la fourche ne peut pas allouer la mémoire. Plusieurs fois la fourchette ne parvient pas à allouer la mémoire (bien que la machine dispose de suffisamment de RAM) en raison d'une optimisation conflictuelle par L'OS.

comme can Redis FAQ :

Redis background saving schema s'appuie sur la sémantique copy-on-write de fork dans les systèmes d'exploitation modernes: Redis forks (crée un processus enfant) qui est une copie exacte du parent. Le processus de l'enfant décharge la base de données sur le disque et finit par sortir. En théorie, l'enfant doit utiliser autant de mémoire que le parent étant une copie, mais en fait, grâce à la copie sur écriture sémantique mis en œuvre par la plupart d'exploitation modernes systèmes le processus parent-enfant partagera les pages mémoire communes. Une page sera dupliqué que lorsqu'il change de l'enfant ou du parent. Comme en théorie toutes les pages peuvent changer pendant que le processus enfant est en cours d'enregistrement, Linux ne peut pas dire à l'avance combien de mémoire l'enfant va prendre, donc si le paramètre overcommit_memory est défini à zéro fork, il échouera à moins qu'il n'y ait autant de RAM libre que nécessaire pour vraiment dupliquer toutes les pages de mémoire parent, avec le résultat que si vous avez un Redis ensemble de données de 3 Go et seulement 2 Go de mémoire libre, il échouera.

placer overcommit_memory à 1 dit Linux pour se détendre et effectuer la fourche d'une façon plus optimiste d'allocation, et c'est en effet ce que vous voulez pour Redis.

Redis n'a pas besoin d'autant de mémoire que L'OS pense qu'il en a besoin pour écrire sur le disque, donc peut préemptivement échouer la fourche.

pour résoudre ceci, vous pouvez:

modifier /etc/sysctl.conf et ajouter:

vm.overcommit_memory=1

puis redémarrez sysctl avec:

Sous FreeBSD:

sudo /etc/rc.d/sysctl reload

Sur Linux:

sudo sysctl -p /etc/sysctl.conf
6
répondu Bhindi 2018-04-15 06:42:40

une solution plus permanente pourrait être de chercher dans /etc/redis/redis.conf autour des lignes 200-250 il y a des réglages pour les fonctions rdb, qui ne faisaient pas partie de redis back dans le 2.les x jours.

notamment

dir ./

peut être remplacé par

dir /home/someuser/redislogfiledirectory

ou vous pouvez commenter toutes les lignes de sauvegarde, et ne pas vous soucier de la persistance. (Voir les commentaires dans /etc/redis/redis.conf)

Aussi, n'oubliez pas

service redis-server stop
service redis-server start
4
répondu Soup Cup 2016-09-19 04:26:50

toutes ces réponses n'expliquent pas la raison pour laquelle le rdb enregistrer échoué.


comme mon cas, j'ai vérifié le journal redis et trouvé:

14975: M 18 Jun 13: 23: 07.354 # Background saving terminated by signal 9

exécuter la commande suivante dans le terminal:

sudo egrep -i -r 'killed process' /var/log/

afficher:

/ var/log / kern.journal.1: Jun 18 13: 23:07 10-10-88-16 kernel: [28152358.208108] Killed process 28416 (redis-server) total-vm: 7660204ko, anon-rss: 2285492ko, file-rss :0KO

c'est ça! ce processus (redis save rdb) est tué par OOM killer

fait référence:

https://github.com/antirez/redis/issues/1886

Trouver le processus qui a été tué par Linux OOM killer

4
répondu carton.swing 2017-06-19 03:54:47

FWIW, j'ai couru dans ceci et la solution était simplement d'ajouter un swapfile à la boîte. J'ai utilisé cette méthode: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04

3
répondu Ryan Angilly 2015-02-12 16:08:33

avait rencontré cette erreur et était capable de comprendre à partir de log que l'erreur est due à l'espace disque n'étant pas suffisant. Toutes les données qui ont été insérées dans mon cas n'étaient plus nécessaires. J'ai donc essayé de FLUSHALL. Puisque le processus redis-rdb-bgsave était en cours, il ne permettait pas de vider les données. J'ai suivi les étapes ci-dessous et j'ai pu continuer.

  1. Se connecter au client redis
  2. Execute jeu de configuration stop-écrit-sur-bgsave-pas d'erreur
  3. Execute FLUSHALL (les données stockées n'étaient pas nécessaires)
  4. Exécuter config set stop-écrit-sur-bgsave d'erreur " oui

le processus redis-rdb-bgsave ne fonctionnait plus après les étapes ci-dessus.

2
répondu RCK 2018-09-04 07:09:10

Comme l'a souligné @Chris le problème de manque de mémoire. Nous avons commencé à l'expérimenter lorsque nous avons alloué trop de RAM à MySQL ( innodb_buffer_pool_size ).

pour s'assurer qu'il y a assez de RAM pour Redis et autres services nous avons réduit innodb_buffer_pool_size sur MySQL.

1
répondu Mugoma J. Okomba 2017-09-15 21:54:18

j'ai touché ce problème en travaillant sur un serveur avec de l'espace disque AFS parce que mon token d'authentification était expiré, ce qui a donné des réponses Permission Denied lorsque le redis-server a essayé de sauvegarder. J'ai résolu cela en rafraîchissant mon jeton:

kinit USERNAME_HERE -l 30d && aklog

1
répondu duhaime 2017-10-28 12:44:02

Dans mon cas, la raison est très faible espace libre dans le disque (seulement 35 Mo). J'ai fait ce qui suit -

  1. Arrêté tous Redis liées processe
  2. supprimer certains fichiers dans le disque pour faire de l'espace libre adéquat
  3. Supprimer redis fichier de vidage (si les données existantes ne sont pas nécessaires)

    sudo rm /var/lib/redis/*

  4. Supprimer toutes les clés de toutes les bases de données existantes

    sudo redis-cli flushall

  5. redémarrer toutes les tâches de celery et vérifier les journaux correspondants pour tout problème
0
répondu rajarshig 2018-03-12 06:43:08

moi aussi j'ai été confrontée au même problème. Les deux réponses (la plus contestée et la plus acceptée) donnent juste une solution temporaire pour la même.

de plus, le config set stop-writes-on-bgsave-error no est une façon horrible de passer outre cette erreur, car cette option empêche redis de notifier que les Écritures ont été arrêtées et de passer à autre chose sans écrire les données dans un instantané. C'est tout simplement ignorer cette erreur. saisir

As pour définir dir dans config dans redis-cli, une fois que vous redémarrez le service redis, cela sera effacé aussi et la même erreur apparaîtra à nouveau. La valeur par défaut de dir dans redis.conf est ./ , et si vous démarrez redis en tant qu'utilisateur root, alors ./ est / à laquelle les permissions d'écriture ne sont pas accordées, et donc l'erreur.

la meilleure façon est de définir le paramètre dir dans redis.conf file et définissez les permissions appropriées à ce répertoire. La plupart des distributions debian l'auront dans /etc/redis/redis.conf

0
répondu Mayank Sharma 2018-06-11 09:03:58

si vous exécutez Redis localement sur une machine windows, essayez de" Exécuter en tant qu'administrateur " et voyez si cela fonctionne. Pour moi, le problème était que Redis se trouvait dans le dossier "Program Files", ce qui restreint les permissions par défaut. Comme il se doit.

Toutefois, ne s'exécute pas automatiquement Redis en tant qu'administrateur Vous ne voulez pas accorder plus de droits qu'il est censé avoir. Voulez-vous résoudre ce par le livre.

Donc, nous avons été en mesure d'identifier rapidement le problème en exécutant en tant qu'administrateur, mais ce n'est pas le remède. Un scénario probable est que vous avez mis Redis dans un dossier qui n'a pas de droits d'écriture et que par conséquent le fichier DB est stocké au même endroit.

vous pouvez résoudre cela en ouvrant le redis.windows.conf et rechercher la configuration suivante:

# The working directory. # # The DB will be written inside this directory, with the filename specified # above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. dir ./

changer dir ./ en a chemin vous avez des permissions régulières de lecture/écriture pour

vous pouvez aussi simplement déplacer le dossier Redis dans son intégralité vers un dossier dont vous savez qu'il a les bonnes permissions.

0
répondu Pascalculator 2018-06-19 09:42:21

Solution de @Govind de la Rai " pour enregistrer l'image.fichier rdb dans le répertoire où vous avez démarré le serveur en':

faites un clic droit sur votre dossier Redis, cliquez sur Propriétés, puis cliquez sur l'onglet Sécurité. Cliquez sur Modifier pour ouvrir la boîte de dialogue Autorisations pour.

cliquez sur tous les dossiers de demande

dans la case Permissions for, sélectionnez la case Allow 'Full control'.

-1
répondu Vyshnav Ramesh 2017-12-19 05:21:07