657 Stimmen

MISCONF Redis ist konfiguriert, um RDB-Snapshots zu speichern

Während des Schreibens in Redis (SET foo bar) erhalte ich den folgenden Fehler:

MISCONF Redis ist so konfiguriert, dass RDB-Snapshots gespeichert werden, kann jedoch derzeit nicht auf die Festplatte persistiert werden. Befehle, die den Datensatz ändern könnten, sind deaktiviert. Bitte überprüfen Sie die Redis-Protokolle auf Details zum Fehler.

Im Grunde verstehe ich, dass das Problem darin besteht, dass Redis nicht in der Lage ist, Daten auf die Festplatte zu speichern, habe aber keine Ahnung, wie ich das Problem beheben kann.

Außerdem hat die folgende Frage das gleiche Problem, sie wurde vor langer Zeit aufgegeben, ohne Antworten und höchstwahrscheinlich ohne Versuche, das Problem zu lösen.

706voto

Erowlin Punkte 5887

Starten Sie Ihren Redis-Server neu.

  • macOS (brew): brew services restart redis.
  • Linux: sudo service redis restart / sudo systemctl restart redis
  • Windows: Windows + R -> Geben Sie services.msc ein, Enter -> Suchen Sie nach Redis und klicken Sie auf Neustart.

Ich hatte dieses Problem nach dem Upgrade von Redis mit Brew (brew upgrade).

Nachdem ich meinen Laptop neu gestartet hatte, funktionierte es sofort.

516voto

思考zhe Punkte 5405

Mit redis-cli können Sie den Versuch stoppen, den Snapshot zu speichern:

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

Dies ist ein schneller Workaround, aber wenn Ihnen die Daten wichtig sind, sollten Sie überprüfen, warum bgsave überhaupt fehlgeschlagen ist.

252voto

Axel Advento Punkte 2965

Im Falle eines Fehlers und wenn wichtige Daten auf der laufenden Redis-Instanz nicht verworfen werden können (Probleme mit Berechtigungen für die rdb-Datei oder deren Verzeichnis falsch sind, oder wenn der Speicherplatz ausgeht), können Sie die rdb-Datei immer umleiten, um an anderer Stelle geschrieben zu werden.

Mit redis-cli können Sie so etwas machen:

CONFIG SET dir /tmp/ein/anderes/verzeichnis/als/var
CONFIG SET dbfilename temp.rdb

Danach möchten Sie vielleicht den Befehl BGSAVE ausführen, um sicherzustellen, dass die Daten in die rdb-Datei geschrieben werden. Stellen Sie sicher, dass, wenn Sie INFO persistence ausführen, bgsave_in_progress bereits 0 ist und rdb_last_bgsave_status ok ist. Danach können Sie beginnen, die generierte rdb-Datei an einem sicheren Ort zu sichern.

74voto

Chris Punkte 1494

Es könnten Fehler während des bgsave-Prozesses aufgrund von zu wenig Speicher auftreten. Versuchen Sie dies (aus dem FAQ zum Hintergrundspeichern von Redis)

echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1

65voto

Bhindi Punkte 1237

Dieser Fehler tritt auf, weil BGSAVE fehlgeschlagen ist. Während BGSAVE erstellt Redis einen Child-Prozess, um die Daten auf der Festplatte zu speichern. Obwohl der genaue Grund für das Scheitern von BGSAVE in den Protokollen überprüft werden kann (normalerweise unter /var/log/redis/redis-server.log auf Linux-Maschinen), scheitert BGAVE oft, weil der Fork keinen Speicher zuweisen kann. Oftmals scheitert der Fork daran, Speicher zuzuweisen (obwohl die Maschine genügend verfügbaren RAM hat), aufgrund einer konkurrierenden Optimierung durch das Betriebssystem.

Wie auf Redis FAQ zu lesen ist:

Das Hintergrundspeicherschema von Redis basiert auf der Copy-on-Write-Semantik von Fork in modernen Betriebssystemen: Redis verzweigt (erstellt einen Child-Prozess), der eine genaue Kopie des übergeordneten Prozesses ist. Der Child-Prozess schreibt die DB auf die Festplatte und beendet sich schließlich. Theoretisch sollte der Child so viel Speicher wie der Elternprozess verwenden, da er eine Kopie ist, jedoch teilen sich der Eltern- und der Child-Prozess dank der Copy-on-Write-Semantik, die in den meisten modernen Betriebssystemen implementiert ist, die gemeinsamen Speicherseiten. Eine Seite wird nur dupliziert, wenn sich diese im Child oder im Elternprozess ändert. Da theoretisch alle Seiten geändert werden können, während der Child-Prozess speichert, kann Linux im Voraus nicht wissen, wie viel Speicher der Child-Prozess benötigen wird. Deshalb schlägt der Fork fehl, sofern nicht genügend freier RAM-Speicher vorhanden ist, um tatsächlich alle Speicherseiten des Elternprozesses zu duplizieren. Daraus resultiert, dass es bei einem Redis-Datensatz von 3 GB und nur 2 GB freiem Speicher fehlschlagen wird.

Das Setzen von overcommit_memory auf 1 sagt Linux, sich zu entspannen und den Fork in einer optimistischeren Allokationsmethode durchzuführen, was tatsächlich für Redis vorteilhaft ist.

Redis benötigt nicht so viel Speicher, wie das Betriebssystem glaubt, um auf die Festplatte zu schreiben, und kann daher den Fork vorzeitig abbrechen.

Um dies zu beheben, können Sie:

Ändern Sie /etc/sysctl.conf und fügen Sie hinzu:

vm.overcommit_memory=1

Dann starten Sie sysctl neu mit:

Auf FreeBSD:

sudo /etc/rc.d/sysctl reload

Auf Linux:

sudo sysctl -p /etc/sysctl.conf

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X