Leistung und Monitoring

Persistentes Redis für Queues, Sessions und Horizon

Geprüft am 13 Min. Lesezeit redis colas sesiones laravel

Redis Cache ist ein Cache: Nach jedem Neustart ist er leer, und wenn er voll ist, verwirft er Schlüssel. Er eignet sich für Daten, die die Anwendung neu berechnen kann, nicht für eine Warteschlange offener Jobs oder die Session eines Benutzers. Dafür gibt es das persistente Redis: eine eigene Instanz Ihres Kontos, die ihre Daten auf der Festplatte speichert und sie nicht verwirft, wenn sie voll ist.

Es handelt sich um Valkey 8, kompatibel mit Redis: Es funktionieren dieselben Befehle und dieselben Clients, etwa PhpRedis. Verfügbar ist es in den Tarifen Avanza, Max und Elastic.

Redis Cache oder persistentes Redis

Redis Cache Persistentes Redis
In allen Tarifen In Avanza, Max und Elastic
Für Cache Für Queues, Sessions und Horizon
16 bis 200 MB, je nach Tarif 64 bis 512 MB, nach Ihrer Wahl
Nach einem Neustart leer Behält nach einem Neustart seine Daten
Verwirft Schlüssel, wenn voll Lehnt Schreibvorgänge ab, wenn voll
Nicht in den Backups In den täglichen Backups

Redis Cache wird über /tmp/redis.sock verbunden, das persistente Redis über /home/USUARIO/.hostsuar/redis/redis.sock, mit Ihrem cPanel-Benutzer anstelle von USUARIO. Der Speicher von Redis Cache hängt vom Tarif ab; den des persistenten Redis wählen Sie selbst, bis 128 MB in Avanza, 256 MB in Max und 512 MB in Elastic.

Sie können beide gleichzeitig nutzen: den Cache in Redis Cache und Queues und Sessions im persistenten Redis. Wie das geht, erklären wir weiter unten.

In beiden Fällen ist der Port 0: Die Verbindung läuft über einen Socket, ohne Netzwerkzugriff. Die Anwendung muss im selben Hosting laufen.

Aktivieren

  1. Öffnen Sie im Kundenbereich Hosting, wählen Sie Ihren Dienst und gehen Sie zum Paketmanager.
  2. Klicken Sie auf der Karte Persistentes Redis auf Aktivieren.
  3. Prüfen Sie Speicher, Persistenz und das Verhalten bei vollem Speicher. Die Standardwerte passen für Queues, Sessions und Horizon.
  4. Bestätigen Sie und warten Sie, bis das Panel es als laufend anzeigt.

Das persistente Redis belegt einen der persistenten Prozesse des Tarifs und erscheint auch unter Tools > Prozesse. Jedes Konto hat eines; sind alle Prozesse Ihres Tarifs belegt, löschen Sie einen, bevor Sie es aktivieren.

Es läuft mit dem Benutzer Ihres Kontos und innerhalb seiner Ressourcen. Nur dieser Benutzer kann den Socket öffnen, daher ist kein Passwort nötig.

Einstellungen

Speicher. Standardmäßig 64 MB, maximal 128 MB in Avanza, 256 MB in Max und 512 MB in Elastic. Queues und Sessions brauchen wenig: 64 MB reichen für die meisten Anwendungen. Mit Horizon wächst der Speicher mit den Metriken und den letzten Jobs, die es aufbewahrt; das stellen Sie unter trim in config/horizon.php ein.

Persistenz.

  • Jede Sekunde (Standard): schreibt jede Änderung in eine Protokolldatei (AOF) und überträgt sie jede Sekunde auf die Festplatte. Bei einem Ausfall geht höchstens die letzte Sekunde verloren. Das brauchen Queues und Sessions.
  • Keine Persistenz: Alles liegt im Arbeitsspeicher, nach einem Neustart ist es leer. Nur verwenden, wenn Sie Daten speichern, die Sie neu erzeugen können.

Was auf der Festplatte gespeichert wird, liegt in ~/.hostsuar/redis/datos und zählt zum Speicherplatz Ihres Tarifs, auch wenn Redis gestoppt ist. Die Karte im Paketmanager zeigt neben dem Arbeitsspeicher, wie viel es belegt. Queues und Sessions bleiben meist bei wenigen Megabyte: Die Protokolldatei wird automatisch verdichtet, wenn sie wächst.

Wenn voll.

  • Keine Daten verlieren (Standard): Ist das Limit erreicht, werden neue Schreibvorgänge mit einem Fehler abgelehnt und nichts wird gelöscht. Das ist die Option für Queues, Sessions und Horizon: Die Anwendung meldet den Fehler, statt unbemerkt einen Job zu verlieren.
  • Am wenigsten Genutztes verwerfen: löscht die am wenigsten genutzten Schlüssel, um Platz zu schaffen. Nur für Cache; bei Queues oder Sessions würden Sie Jobs verlieren und Benutzer abmelden.

Eine Änderung der Einstellungen startet Redis neu. Mit Jede Sekunde stellt es seine Daten danach wieder her; wechseln Sie zu Keine Persistenz, startet es leer.

Aktionen

  • Einstellungen: ändert Speicher, Persistenz und Verhalten bei vollem Speicher.
  • Neu starten: stoppt und startet es. Mit Persistenz bleiben die Daten erhalten.
  • Leeren: löscht alles, was es enthält, in allen Datenbanken: offene Jobs der Queues, aktive Sessions (die Benutzer müssen sich erneut anmelden) und Horizon-Metriken. Das lässt sich nicht rückgängig machen.
  • Deaktivieren: stoppt und entfernt es und gibt damit seinen Platz als persistenter Prozess frei. Die Anwendung verliert die Verbindung: Ändern Sie vorher ihre .env. Die gespeicherten Daten bleiben in Ihrem Konto, falls Sie es wieder aktivieren, es sei denn, Sie markieren Auch die gespeicherten Daten löschen.

Per SSH können Sie prüfen, ob es antwortet, mit Ihrem Benutzer anstelle von USUARIO:

valkey-cli -s /home/USUARIO/.hostsuar/redis/redis.sock ping
valkey-cli -s /home/USUARIO/.hostsuar/redis/redis.sock info memory

Der erste Befehl antwortet mit PONG, der zweite zeigt den belegten Speicher (used_memory_human) und das Limit (maxmemory_human).

Aus Laravel verbinden

Aktivieren Sie die Erweiterung redis (PhpRedis) in der PHP-Version der Anwendung und, falls Ihre Worker eine andere Version nutzen, auch in dieser. Danach in der .env:

REDIS_CLIENT=phpredis
REDIS_HOST=/home/USUARIO/.hostsuar/redis/redis.sock
REDIS_PORT=0
REDIS_PASSWORD=null

QUEUE_CONNECTION=redis
SESSION_DRIVER=redis

Ersetzen Sie USUARIO durch Ihren cPanel-Benutzer. Mit Deploy+ bearbeiten Sie die .env im Menü des Repositorys; wenn Sie die Konfiguration cachen, führen Sie php artisan config:cache erneut aus oder deployen Sie noch einmal. Prüfen Sie die Verbindung:

php artisan tinker --execute="dump(Illuminate\Support\Facades\Redis::connection()->ping());"

Die Ausgabe muss true sein.

Bevor Sie die Verbindung wechseln, beachten Sie, was bereits vorhanden ist:

  • Queues: Jobs, die in der Datenbank warten, wandern nicht zu Redis. Lassen Sie die Datenbank-Queue leerlaufen, bevor Sie QUEUE_CONNECTION ändern, oder lassen Sie eine Weile einen Worker auf der Verbindung database laufen.
  • Sessions: In der Datenbank gespeicherte Sessions werden nicht übernommen. Wenn Sie SESSION_DRIVER ändern, müssen sich die Benutzer neu anmelden.

Um die Queues abzuarbeiten, muss ein Worker laufen: Legen Sie ihn unter Tools > Prozesse als Queue-Worker an oder verwenden Sie Horizon. Mehr dazu unter persistente Prozesse.

Zusammen mit Redis Cache

Wenn der Cache in Redis Cache und der Rest im persistenten Redis liegen soll, lassen Sie die Verbindung cache in config/database.php eigene Variablen lesen. Ändern Sie in der Verbindung cache Host und Port:

'host' => env('REDIS_CACHE_HOST', env('REDIS_HOST', '127.0.0.1')),
'port' => env('REDIS_CACHE_PORT', env('REDIS_PORT', '6379')),

Und in der .env:

REDIS_HOST=/home/USUARIO/.hostsuar/redis/redis.sock
REDIS_PORT=0
REDIS_CACHE_HOST=/tmp/redis.sock
REDIS_CACHE_PORT=0
CACHE_STORE=redis

Der Store redis in config/cache.php nutzt die Verbindung cache für die Daten und default für die Sperren. Die Sperren von Cache::lock() und withoutOverlapping() liegen also im persistenten Redis, das sie nicht verwirft.

Haben Sie nur das persistente Redis, lassen Sie den Cache in der Datenbank oder geben Sie, wenn Sie ihn in Redis legen, allem Gespeicherten ein Ablaufdatum: Mit Keine Daten verlieren füllt ein Cache, der ohne Ablauf wächst, irgendwann den Speicher und blockiert auch die Queues.

Horizon

Horizon braucht Queues in Redis und einen Prozess, der es am Laufen hält:

  1. Aktivieren Sie das persistente Redis und verbinden Sie Laravel wie im vorigen Abschnitt, mit QUEUE_CONNECTION=redis.
  2. Installieren Sie Horizon in Ihrem Projekt mit composer require laravel/horizon und php artisan horizon:install. Es braucht die Erweiterungen pcntl und posix: Meldet Composer, dass sie fehlen, aktivieren Sie sie in der PHP-Version, die Sie verwenden.
  3. Prüfen Sie config/horizon.php. Der Supervisor für production erlaubt standardmäßig bis zu 10 Worker, und jeder belegt Speicher innerhalb der Ressourcen Ihres Kontos: Stellen Sie maxProcesses auf das ein, was Ihre Anwendung braucht, zum Beispiel 2 oder 3 in Avanza.
  4. Legen Sie in der Methode gate() von app/Providers/HorizonServiceProvider.php fest, wer das Panel /horizon sehen darf. Außerhalb der lokalen Umgebung kommt nur hinein, wen Sie dort zulassen.
  5. Fügen Sie unter Tools > Prozesse einen Prozess vom Typ Horizon mit dem Ordner der Anwendung und ihrer PHP-Version hinzu. Legen Sie nicht zusätzlich einen Queue-Worker für dieselben Queues an.
  6. Wenn Sie mit Deploy+ veröffentlichen, fügen Sie dem Skript nichts hinzu: Nach dem Aktivieren jeder Version, und auch bei der Rückkehr zu einer früheren, startet es den Horizon-Prozess dieser Anwendung neu. Das Skript läuft vor dem Aktivieren der Version, ein horizon:terminate von dort würde Horizon also auf der alten Version neu starten lassen. Veröffentlichen Sie auf andere Weise, führen Sie php artisan horizon:terminate aus, sobald der neue Code an seinem Platz ist.
  7. Wenn Sie die Metrik-Diagramme möchten, planen Sie horizon:snapshot alle fünf Minuten in routes/console.php:
use Illuminate\Support\Facades\Schedule;

Schedule::command('horizon:snapshot')->everyFiveMinutes();

Horizon mit Redis Cache ist nicht sicher: Wird dieser Cache geleert oder läuft er voll, gehen offene Jobs verloren.

Backups

Die Daten liegen in Ihrem Konto unter ~/.hostsuar/redis/ und sind wie Ihre übrigen Dateien in den täglichen Backups enthalten.

Wenn Sie diesen Ordner wiederherstellen, kehrt Redis zum Stand jenes Tages zurück: Jobs, die damals offen waren, kämen wieder in die Queue, auch wenn sie danach bereits verarbeitet wurden. Müssen Sie ihn wiederherstellen, stoppen Sie vorher das persistente Redis unter Tools > Prozesse und starten Sie es nach Abschluss der Wiederherstellung wieder.

Das könnte Ihnen auch helfen

Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.