Beim Schreiben in Redis ( SET foo bar
) wird folgende Fehlermeldung angezeigt:
MISCONF Redis ist zum Speichern von RDB-Snapshots konfiguriert, kann jedoch derzeit nicht auf der Festplatte gespeichert werden. Befehle, die den Datensatz ändern können, sind deaktiviert. Bitte überprüfen Sie die Redis-Protokolle auf Details zum Fehler.
Grundsätzlich verstehe ich, dass das Problem darin besteht, dass redis keine Daten auf der Festplatte speichern kann, aber keine Ahnung hat, wie das Problem behoben werden kann.
Auch die folgende Frage hat das gleiche Problem, sie wurde vor langer Zeit ohne Antworten und höchstwahrscheinlich ohne Versuche, das Problem zu lösen, aufgegeben.
redis
, aber es hilft nicht!Antworten:
Wenn Sie auf den Fehler stoßen und einige wichtige Daten auf der ausgeführten Redis-Instanz nicht verworfen werden können (Probleme mit Berechtigungen für die
rdb
Datei oder ihr Verzeichnis falsch oder nicht genügend Speicherplatz), können Sie dierdb
zu schreibende Datei jederzeit an eine andere Stelle umleiten .Mit
redis-cli
können Sie so etwas tun:Danach möchten Sie möglicherweise einen
BGSAVE
Befehl ausführen , um sicherzustellen, dass die Daten in dierdb
Datei geschrieben werden. Stellen Sie sicher , dass , wenn Sie ausführenINFO persistence
,bgsave_in_progress
bereits ist0
undrdb_last_bgsave_status
istok
. Danach können Sie die generierterdb
Datei an einem sicheren Ort sichern.quelle
dir C:/Temp/
. Machen Sie eine bgsave, um zu überprüfen, ob es funktioniert ..Mit
redis-cli
können Sie den Versuch stoppen, den Schnappschuss zu speichern:Dies ist eine schnelle Problemumgehung. Wenn Sie sich jedoch für die Daten interessieren, für die Sie sie verwenden, sollten Sie überprüfen, warum bgsave überhaupt fehlgeschlagen ist.
quelle
Während des bgsave-Vorgangs können aufgrund des geringen Speichers Fehler auftreten. Versuchen Sie dies (aus Redis Hintergrund speichern FAQ)
quelle
Dieser Fehler tritt auf, weil BGSAVE fehlgeschlagen ist. Während BGSAVE gibt Redis einen untergeordneten Prozess aus, um die Daten auf der Festplatte zu speichern. Obwohl der genaue Grund für den Ausfall von BGSAVE anhand von Protokollen überprüft werden kann (normalerweise
/var/log/redis/redis-server.log
auf Linux-Computern), schlägt BGAVE häufig fehl, weil der Fork keinen Speicher zuweisen kann. Oft kann der Fork aufgrund einer widersprüchlichen Optimierung durch das Betriebssystem keinen Speicher zuweisen (obwohl auf dem Computer genügend RAM verfügbar ist).Wie aus den Redis FAQ zu lesen ist :
Redis benötigt nicht so viel Speicher, wie das Betriebssystem denkt, um auf die Festplatte zu schreiben, und kann daher die Abzweigung vorbeugend ausfallen lassen.
Um dies zu beheben, können Sie:
Ändern
/etc/sysctl.conf
und hinzufügen:Starten Sie dann sysctl neu mit:
Auf FreeBSD:
Unter Linux:
quelle
systemctl status redis
ergab, dass eine Warnung vorliegt, die darauf hindeutet, dieovercommit_memory=0
Einstellung genau zu ändern . Das zu ändern löste tatsächlich das Problem für mich.Starten Sie Ihren Redis-Server neu.
brew services restart redis
.sudo service redis restart
/sudo systemctl restart redis
services.msc
, Enter-> Suchen nach undRedis
dann auf klickenrestart
.Ich persönlich hatte dieses Problem, nachdem ich redis mit Brew (
brew upgrade
) aktualisiert hatte . Nach dem Neustart des Laptops funktionierte es sofort.quelle
sudo
:brew services stop redis; sudo brew services start redis
.Wenn Sie auf einem Linux-Computer arbeiten, überprüfen Sie auch die Datei- und Ordnerberechtigungen der Datenbank.
Die Datenbank und der Pfad dazu erhalten Sie über:
in
redis-cli
:und in der Kommandozeile
ls -l
. Die Berechtigungen für das Verzeichnis sollten 755 und die für die Datei 644 sein . Normalerweise wird der Redis-Server auch als Benutzer ausgeführtredis
. Daher ist es auch hilfreich, dem Benutzerredis
durch Ausführen das Eigentum an dem Ordner zu gebensudo chown -R redis:redis /path/to/rdb/folder
. Dies wurde in der Antwort hier ausgeführt .quelle
Vielen Dank an alle für die Überprüfung des Problems, anscheinend wurde der Fehler während erzeugt
bgsave
.Für mich löste das Eingeben
config set stop-writes-on-bgsave-error no
einer Shell und das Neustarten von Redis das Problem.quelle
Starten Sie Redis Server in einem Verzeichnis, in dem Redis über Schreibberechtigungen verfügt
Die obigen Antworten werden Ihr Problem definitiv lösen, aber hier ist, was tatsächlich vor sich geht:
Der Standardspeicherort für die
rdb.dump
Datei ist./
(das aktuelle Verzeichnis). Sie können dies in Ihrerredis.conf
Datei überprüfen . In dem Verzeichnis, in dem Sie den Redis-Server starten, wird daher einedump.rdb
Datei erstellt und aktualisiert.Anscheinend haben Sie damit begonnen, den Redis-Server in einem Verzeichnis auszuführen, in dem Redis nicht über die richtigen Berechtigungen zum Erstellen der
dump.rdb
Datei verfügt.Um die Sache noch schlimmer zu machen, können Sie mit redis den Server wahrscheinlich auch nicht herunterfahren, bis die rdb-Datei erstellt werden kann, um das ordnungsgemäße Speichern von Daten sicherzustellen.
Um dieses Problem zu lösen, müssen Sie mit
redis-cli
demdir
Schlüssel in die aktive Redis-Client-Umgebung wechseln, diesen aktualisieren und seinen Wert auf Ihren Projektordner oder einen Ordner festlegen, in dem Nicht-Root-Benutzer Berechtigungen zum Speichern haben. Führen Sie dann ausBGSAVE
, um die Erstellung derdump.rdb
Datei aufzurufen .(Nun, wenn Sie benötigen die dump.rdb Datei im Verzeichnis zu speichern , dass Sie den Server in, begannen dann werden Sie für das Verzeichnis Berechtigungen ändern müssen , so dass redis , um es schreiben. Sie können für die Suche Stackoverflow , wie das zu tun ).
Sie sollten nun in der Lage sein, den Redis-Server herunterzufahren. Beachten Sie, dass wir den Pfad fest codiert haben. Hardcoding ist selten eine gute Praxis und ich empfehle dringend, den Redis-Server von Ihrem Projektverzeichnis aus zu starten und die
dir key back to
. / `Zu ändern .Auf diese Weise wird die Speicherauszugsdatei im Verzeichnis Ihres aktuellen Projekts und nicht im Projektverzeichnis des fest codierten Pfads erstellt, wenn Sie Redis für ein anderes Projekt benötigen.
quelle
redis
also:sudo chown redis:redis /var/lib/redis
Wenn Sie MacOS ausführen und kürzlich ein Upgrade auf Catalina durchgeführt haben, müssen Sie möglicherweise die
brew services restart redis
in dieser Ausgabe vorgeschlagenen Schritte ausführen .quelle
Hatte diesen Fehler festgestellt und konnte aus dem Protokoll herausfinden, dass der Fehler darauf zurückzuführen ist, dass der Speicherplatz nicht ausreicht. Alle Daten, die in meinem Fall eingefügt wurden, wurden nicht mehr benötigt. Also habe ich versucht zu FLUSHALLEN. Da der redis-rdb-bgsave-Prozess ausgeführt wurde, war es nicht möglich, die Daten auch zu SPÜLEN. Ich folgte den folgenden Schritten und konnte fortfahren.
Der Prozess redis-rdb-bgsave wurde nach den obigen Schritten nicht mehr ausgeführt.
quelle
Ich war mit einem ähnlichen Problem konfrontiert. Der Hauptgrund dafür war der Speicherverbrauch (RAM) durch Redis. Mein EC2-Computer hatte 8 GB RAM (ca. 7.4 zum Verbrauch verfügbar)
Wenn mein Programm ausgeführt wurde, stieg die RAM-Auslastung auf 7,2 GB, so dass kaum ~ 100 MB RAM übrig blieben. Dies löst im Allgemeinen die aus
MISCONF Redis error ...
Mit dem
htop
Befehl können Sie den RAM-Verbrauch ermitteln . Suchen Sie nach dem Mem- Attribut, nachdem Sie den Befehl htop ausgeführt haben. Wenn es einen hohen Verbrauch aufweist (wie in meinem Fall waren es 7,2 GB / 7,4 GB), ist es besser, die Instanzen mit größerem Speicher zu aktualisieren. In diesem Szenario stellt die Verwendungconfig set stop-writes-on-bgsave-error no
eine Katastrophe für den Server dar und kann dazu führen, dass andere auf dem Server ausgeführte Dienste (falls vorhanden) gestört werden. Vermeiden Sie daher besser den Befehl config und UPGRADE YOUR REDIS MACHINE .Zu Ihrer Information: Möglicherweise müssen Sie htop installieren , damit dies funktioniert:
sudo apt-get install htop
Eine weitere Lösung hierfür kann ein anderer RAM-lastiger Dienst sein, der auf Ihrem System ausgeführt wird. Suchen Sie nach anderen Diensten, die auf Ihrem Server / Computer / Ihrer Instanz ausgeführt werden, und stoppen Sie ihn, falls dies nicht erforderlich ist. Um alle auf Ihrem Computer ausgeführten Dienste zu überprüfen, verwenden Sie
service --status-all
Und ein Vorschlag für Leute, die den Befehl config direkt einfügen, bitte recherchieren Sie ein wenig und warnen Sie den Benutzer zumindest, bevor Sie solche Befehle verwenden. Und wie @Rodrigo in seinem Kommentar erwähnte: "Es sieht nicht cool aus, die Fehler zu ignorieren."
---AKTUALISIEREN---
Sie können auch das Verhalten von Redis konfigurieren
maxmemory
undmaxmemory-policy
definieren, wenn eine bestimmte Speichergrenze erreicht ist. Wenn ich beispielsweise das Speicherlimit von 6 GB beibehalten und die zuletzt verwendeten Schlüssel aus der Datenbank löschen möchte, um sicherzustellen, dass die Verwendung von Redis Mem 6 GB nicht überschreitet, können wir diese beiden Parameter festlegen (in redis.conf oder CONFIG SET Befehl):Es gibt viele andere Werte, die Sie für diese beiden Parameter festlegen können. Lesen Sie dazu hier: https://redis.io/topics/lru-cache
quelle
Eine dauerhaftere Lösung könnte darin bestehen, in /etc/redis/redis.conf in den Zeilen 200-250 nachzuschauen. Es gibt Einstellungen für die rdb-Funktionen, die in den 2.x Tagen nicht Teil von redis waren.
vor allem
kann geändert werden zu
oder Sie könnten alle Sicherungszeilen auskommentieren und sich keine Sorgen um die Persistenz machen. (Siehe die Kommentare in /etc/redis/redis.conf)
Vergiss auch nicht
quelle
Alle diese Antworten erklären nicht den Grund, warum das Speichern der RDB fehlgeschlagen ist.
Als mein Fall überprüfte ich das Redis-Protokoll und fand:
Führen Sie den folgenden Befehl im Terminal aus:
es zeigt an:
das ist es! Dieser Prozess (redis save rdb) wird vom OOM-Killer beendet
verweist:
https://github.com/antirez/redis/issues/1886
Finden, welcher Prozess von Linux OOM Killer getötet wurde
quelle
FWIW, ich bin darauf gestoßen und die Lösung bestand darin, einfach eine Swap-Datei zur Box hinzuzufügen. Ich habe diese Methode verwendet: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
quelle
Auch ich stand vor dem gleichen Problem. Beide Antworten (die am besten bewertete und die akzeptierte) geben nur eine vorübergehende Lösung für dieselbe.
Darüber hinaus
config set stop-writes-on-bgsave-error no
ist dies eine schreckliche Möglichkeit, diesen Fehler zu überprüfen, da diese Option verhindert, dass Redis benachrichtigt werden, dass Schreibvorgänge gestoppt wurden, und fortfahren kann, ohne die Daten in einen Snapshot zu schreiben. Dies ignoriert diesen Fehler einfach. Verweisen Sie daraufWie für die Einstellung
dir
inconfig
in redis-cli, sobald Sie den redis - Dienst neu starten, wird dies zu klären erhalten und der gleiche Fehler wird wieder auftauchen. Der Standardwert vondir
inredis.conf
ist./
, und wenn Sie redis als Root-Benutzer starten,./
wird angegeben,/
für welche Schreibberechtigungen keine Berechtigungen erteilt werden, und daher der Fehler.Der beste Weg ist, den
dir
Parameter in der Datei redis.conf festzulegen und die richtigen Berechtigungen für dieses Verzeichnis festzulegen. Die meisten Debian-Distributionen sollen es haben/etc/redis/redis.conf
quelle
Heutzutage sind die Redis-Schreibzugriffsprobleme, die diese Fehlermeldung an den Client weitergeben, in den offiziellen
redis
Docker-Containern erneut aufgetreten.Redis aus dem offiziellen
redis
Image versucht, die .rdb-Datei in den Container-/data
Ordner zu schreiben , was ziemlich unglücklich ist, da es sich um einen Ordner im Stammverzeichnis handelt und es sich auch um einen nicht persistenten Speicherort handelt (dort geschriebene Daten verschwinden, wenn Ihr Container / Pod stürzt ab).Wenn Sie Ihren
redis
Container nach einer Stunde Inaktivität als Nicht-Root-Benutzer ausgeführt haben (z. B.docker run -u 1007
nicht als Standardbenutzerdocker run -u 0
), wird in Ihrem Serverprotokoll eine sehr detaillierte Fehlermeldung angezeigt (siehedocker logs redis
):Sie müssen also den Containerordner
/data
einem externen Speicherort zuordnen (wo der Nicht-Root-Benutzer, hier: 1007, Schreibzugriff hat, z. B./tmp
auf dem Host-Computer), z.Es ist also eine Fehlkonfiguration des offiziellen Docker-Images (das
/tmp
nicht geschrieben werden sollte/data
), die diese "Zeitbombe" erzeugt, die Sie höchstwahrscheinlich nur in der Produktion antreffen werden ... über Nacht an einem besonders ruhigen Feiertagswochenende: /quelle
für mich
und ich lade meinen Mac neu, es funktioniert
quelle
Ich bin auf dieses Problem gestoßen, als ich auf einem Server mit AFS-Speicherplatz gearbeitet habe, weil mein Authentifizierungstoken abgelaufen war, was zu
Permission Denied
Antworten führte, als der Redis-Server versuchte, zu speichern. Ich habe dies gelöst, indem ich mein Token aktualisiert habe:kinit USERNAME_HERE -l 30d && aklog
quelle
Wenn Sie Docker / Docker-Compose verwenden und verhindern möchten, dass Redis in eine Datei schreibt, können Sie eine Redis-Konfiguration erstellen und in einen Container einbinden
docker.compose.override.yml
Sie können die Standardkonfiguration hier herunterladen
Stellen Sie in der Datei redis.conf sicher, dass Sie diese 3 Zeilen auskommentieren
Weitere Lösungen zum Entfernen der persistenten Daten finden Sie hier
quelle
In meinem Fall ist es passiert, weil ich gerade
redis
auf dem schnellen Weg installiert habe . Redis läuft also nicht als root. Ich konnte dieses Problem lösen, indem ich den Anweisungen imInstalling Redis more properly
Abschnitt der Kurzanleitung folgte . Danach wurde das Problem behoben undredis
läuft nun als root. Hör zu.quelle
Nachdem ich endlich so viele SO-Fragen durch den Kopf geschlagen hatte - für mich funktionierte die Antwort von @Axel Advento, aber mit ein paar zusätzlichen Schritten -, stand ich immer noch vor den Erlaubnisproblemen.
Ich musste den Benutzer wechseln
redis
, ein neues Verzeichnis in seinem Ausgangsverzeichnis erstellen und es dann als Redis-Verzeichnis festlegen.quelle
In meinem Fall bezog es sich auf den freien Speicherplatz. (Sie können es mit dem
df -h
Befehl bash überprüfen. ) Wenn ich Speicherplatz freigebe, ist dieser Fehler verschwunden.quelle
Wenn Sie Redis lokal auf einem Windows-Computer ausführen, versuchen Sie, "als Administrator auszuführen" und prüfen Sie, ob es funktioniert. Bei mir bestand das Problem darin, dass sich Redis im Ordner "Programme" befand, wodurch die Berechtigungen standardmäßig eingeschränkt werden. So wie es sollte.
Jedoch nicht automatisch Redis als Administrator ausführen Sie wollen nicht mehr Rechte gewähren , dass es haben soll. Sie wollen dies durch das Buch lösen.
Wir konnten das Problem schnell identifizieren, indem wir es als Administrator ausführten. Dies ist jedoch keine Lösung. Ein wahrscheinliches Szenario ist, dass Sie Redis in einem Ordner abgelegt haben, der keine Schreibrechte besitzt. Infolgedessen wird die DB-Datei an demselben Speicherort gespeichert.
Sie können dieses Problem lösen, indem Sie das öffnen
redis.windows.conf
und nach der folgenden Konfiguration suchen:Wechseln Sie
dir ./
in einen Pfad, für den Sie regelmäßig Lese- / Schreibberechtigungen habenSie können den Redis-Ordner auch ganz in einen Ordner verschieben, von dem Sie wissen, dass er über die richtigen Berechtigungen verfügt.
quelle
Für mich war es nur ein Problem der Berechtigungen für den persistenten Redis-Datenordner. Ich gab es ein:
Und es funktioniert! Vielleicht ist es früh zu sagen, dass das Problem behoben ist. Da ich auch vermute, dass Redis nicht als Root ausgeführt wird, muss ich meine Docker-Datei überprüfen, um mehr herauszufinden.
quelle
Überprüfen Sie Ihr Redis-Protokoll, bevor Sie Maßnahmen ergreifen. Einige der Lösungen in diesem Thread löschen möglicherweise Ihre Redis-Daten. Seien Sie also vorsichtig, was Sie tun.
In meinem Fall ging der Maschine der Arbeitsspeicher aus . Dies kann auch passieren, wenn auf dem Host kein freier Speicherplatz mehr vorhanden ist .
quelle
Bitte beachten Sie, dass dieser Fehler auftritt, wenn Ihr Server angegriffen wird. Es wurde gerade festgestellt, dass redis nicht in '/etc/cron.d/web' schreiben kann. Nach dem Korrigieren der Berechtigungen wurde eine neue Datei hinzugefügt, die aus einem Mining-Algorithmus mit einigen Ausblendungsoptionen besteht.
quelle
quelle
Wie von @Chris hervorgehoben, ist das Problem wahrscheinlich zu wenig Speicher. Wir haben damit angefangen, als wir MySQL (
innodb_buffer_pool_size
) zu viel RAM zugewiesen haben .Um sicherzustellen, dass genügend RAM für Redis und andere Dienste vorhanden ist, haben wir
innodb_buffer_pool_size
MySQL reduziert .quelle
In meinem Fall war der Grund sehr wenig freier Speicherplatz auf der Festplatte (nur 35 MB). Ich habe folgendes getan -
Redis-Dump-Datei löschen (falls vorhandene Daten nicht benötigt werden)
sudo rm /var/lib/redis/*
Löschen Sie alle Schlüssel aller vorhandenen Datenbanken
sudo redis-cli flushall
quelle
Sie müssen den neuen Ordner chmod und chown
chown -R redis und chmod ...
quelle