|
|
# QUIQQER Redis Caching
|
|
|
|
|
|
Um QUIQQER noch schneller zu machen, empfehlen wir zusätzlich einen Redis Server als Caching Server zu nutzen. Jedoch gibt es einige Sachen die beachtet werden sollten.
|
|
|
Um QUIQQER noch schneller zu machen, empfehlen wir zusätzlich einen Redis Server als Caching Server zu nutzen.
|
|
|
|
|
|
Damit die Kommunikation zwischen Redis Server und QUIQQER einwandfrei funktioniert empfehlen wir erst einmal zu prüfen wie groß dein QUIQQER System wirklich ist. QUIQQER cached viele Anfragen, damit der Zugriff schnell vonstattengeht.
|
|
|
[TOC]
|
|
|
|
|
|
Je nach Größe und Umfang deiner QUIQQER Installation kann dies von 5 MB bis ganze Gigabyte gehen. Für normale Webseiten reicht im Normalfall ein Redis Cache von 100 MB. Wird jedoch ein E-Commerce Shop betrieben sollte dies vorher geprüft werden.
|
|
|
## Installation
|
|
|
|
|
|
|
|
|
### Installieren
|
|
|
Zunächst muss Redis auf deinem Server installiert werden.
|
|
|
Dazu kannst du der offiziellen Anleitung von Redis folgen: https://redis.io/docs/getting-started/installation/.
|
|
|
Alternativ kannst du (unter Ubuntu) folgenden Befehl verwenden:
|
|
|
```shell script
|
|
|
sudo apt install redis
|
|
|
```
|
|
|
> Ebenfalls muss die Php Redis Erweiterung (php-redis) installiert werden
|
|
|
|
|
|
Ebenfalls muss die Redis Erweiterung für PHP (`php-redis`) installiert werden:
|
|
|
```shell script
|
|
|
sudo apt install php-redis
|
|
|
```
|
|
|
|
|
|
## Für E-Commerce / ERP System
|
|
|
|
|
|
Bitte erstelle vorher den kompletten Produkt-Cache um zu prüfen wie groß dein Cache werden kann.
|
|
|
|
|
|
### 1. Stelle dein System auf Filesystem Caching um
|
|
|
|
|
|
- Öffne das Backend (Administration)
|
|
|
- Gehe zu `Einstellungen -> QUIQQER -> Cache`
|
|
|
- Caching-Typ auf Dateisystem umstellen
|
|
|
|
|
|
### 2. Generiere den Produktcache
|
|
|
Abschließend führst du folgende Schritte in der QUIQQER Adminitration durch:
|
|
|
1. Gehe zu `Einstellungen -> QUIQQER -> Cache`
|
|
|
2. Caching-Typ auf `Redis` umstellen
|
|
|
3. Unter `Redis Einstellungen -> Redis server` die Domain/IP des Redis Servers eintragen (`localhost` wenn Redis auf demselben Server wie QUIQQER installiert ist)
|
|
|
4. Klicke auf `Redis Einstellungen -> Redis Server prüfen` um zu validieren, dass der Redis Server korrekt funktioniert.
|
|
|
|
|
|
Um einen kompletten Produktcache zu erstellen, kannst du folgendes Konsolen Tool verwenden:
|
|
|
Solltest du ein QUIQQER E-Commerce- oder ERP-System betreiben, beachte bitte die Besonderheiten im nächsten Abschnitt.
|
|
|
|
|
|
- `products:generate-product-cache`
|
|
|
## Redis für E-Commerce- und ERP-Systeme konfigurieren
|
|
|
|
|
|
Führe dazu folgenden Befehl im Verzeichnis deiner QUIQQER Installation in der Konsole aus:
|
|
|
Bei E-Commerce oder ERP Systemen sollte der Speicherplatz und die Memory Policy von Redis angepasst werden.
|
|
|
|
|
|
- `./console products:generate-product-cache`
|
|
|
### Speicherplatz anpassen
|
|
|
Je nach Größe und Umfang deiner QUIQQER Installation, benötigt der Cache bis zu mehreren Gigabyte Speicherplatz.
|
|
|
Es sollte also vorher geprüft werden, wie viel Speicherplatz Redis benötigt und ob genug Speicherplatz zur Verfügung steht.
|
|
|
|
|
|
Je nachdem wie viel Produkte du in deinem Shop besitzt, kann dies etwas dauern.
|
|
|
Dazu muss der komplette Produkt-Cache erstellt und dessen Größe ermittelt werden:
|
|
|
|
|
|
#### 1. System auf Filesystem Caching umstellen
|
|
|
|
|
|
### 3. Bestimmen der Cache-Größe
|
|
|
- Öffne das Backend (Administration)
|
|
|
- Gehe zu `Einstellungen -> QUIQQER -> Cache`
|
|
|
- Caching-Typ auf `Dateisystem` umstellen
|
|
|
|
|
|
Wenn der Cache erfolgreich erzeugt wurde, führe bitte folgenden Befehl aus:
|
|
|
#### 2. Generiere den Produktcache
|
|
|
|
|
|
- `du -hs var/cache`
|
|
|
Um den kompletten Produktcache zu erstellen, gibt es ein Konsolen-Tool.
|
|
|
Führe folgenden Befehl im Hauptverzeichnis deiner QUIQQER Installation aus, um das Konsolen-Tool zu starten:
|
|
|
|
|
|
Der `du` Befehl bestimmt die Grösse des Cache Ordners von QUIQQER.
|
|
|
```shell
|
|
|
./console products:generate-product-cache
|
|
|
```
|
|
|
|
|
|
Je nachdem wie viel Produkte in deinem Shop existieren, kann dies etwas dauern.
|
|
|
|
|
|
### 4. Redis Grösse
|
|
|
|
|
|
Nachdem du weißt, wie groß dein QUIQQER Cache ist, kannst du deinen Redis Server dementsprechend anpassen. Am besten vergibst du dem Redis Server etwas mehr, wir empfehlen 10 % mehr als der Cache Ordner.
|
|
|
#### 3. Bestimmen der Cache-Größe
|
|
|
|
|
|
Hier zu suche in der `redis.conf` Datei nach der `maxmemory` Einstellung. Die `redis.conf` findest du unter `/etc/redis/redis.conf`.
|
|
|
Wenn der Cache erfolgreich erzeugt wurde, führe bitte folgenden Befehl im Hauptverzeichnis deiner QUIQQER Installation aus:
|
|
|
|
|
|
```shell
|
|
|
du -hs var/cache
|
|
|
```
|
|
|
|
|
|
############################## MEMORY MANAGEMENT ################################
|
|
|
Die Ausgabe des Befehls nennt die Größe des Cache Ordners von QUIQQER.
|
|
|
|
|
|
# Set a memory usage limit to the specified amount of bytes.
|
|
|
# When the memory limit is reached Redis will try to remove keys
|
|
|
# according to the eviction policy selected (see maxmemory-policy).
|
|
|
#
|
|
|
# If Redis can't remove keys according to the policy, or if the policy is
|
|
|
# set to 'noeviction', Redis will start to reply with errors to commands
|
|
|
# that would use more memory, like SET, LPUSH, and so on, and will continue
|
|
|
# to reply to read-only commands like GET.
|
|
|
#
|
|
|
# This option is usually useful when using Redis as an LRU or LFU cache, or to
|
|
|
# set a hard memory limit for an instance (using the 'noeviction' policy).
|
|
|
#
|
|
|
# WARNING: If you have slaves attached to an instance with maxmemory on,
|
|
|
# the size of the output buffers needed to feed the slaves are subtracted
|
|
|
# from the used memory count, so that network problems / resyncs will
|
|
|
# not trigger a loop where keys are evicted, and in turn the output
|
|
|
# buffer of slaves is full with DELs of keys evicted triggering the deletion
|
|
|
# of more keys, and so forth until the database is completely emptied.
|
|
|
#
|
|
|
# In short... if you have slaves attached it is suggested that you set a lower
|
|
|
# limit for maxmemory so that there is some free RAM on the system for slave
|
|
|
# output buffers (but this is not needed if the policy is 'noeviction').
|
|
|
#
|
|
|
maxmemory 1000mb
|
|
|
|
|
|
|
|
|
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
|
|
|
# is reached. You can select among five behaviors:
|
|
|
#
|
|
|
# volatile-lru -> remove the key with an expire set using an LRU algorithm
|
|
|
# allkeys-lru -> remove any key according to the LRU algorithm
|
|
|
# volatile-random -> remove a random key with an expire set
|
|
|
# allkeys-random -> remove a random key, any key
|
|
|
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
|
|
|
# noeviction -> don't expire at all, just return an error on write operations
|
|
|
#
|
|
|
# Note: with any of the above policies, Redis will return an error on write
|
|
|
# operations, when there are no suitable keys for eviction.
|
|
|
#
|
|
|
# At the date of writing these commands are: set setnx setex append
|
|
|
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
|
|
|
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
|
|
|
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
|
|
|
# getset mset msetnx exec sort
|
|
|
#
|
|
|
# The default is:
|
|
|
#
|
|
|
maxmemory-policy allkeys-lru
|
|
|
|
|
|
```
|
|
|
|
|
|
Zusätzlich empfehlen wir die `maxmemory-policy` des Redis Servers anzupassen. Standardmäßig steht die policy auf `noeviction`. Diese Einstellung besagt, falls der Redis Cache kein Speicher mehr zur Verfügung hat, das auch kein weiterer Cache mehr angelegt wird.
|
|
|
#### 4. Redis Größe konfigurieren
|
|
|
|
|
|
Diese Einstellung besagt jedoch auch, dass Fehler geworfen werden sollen, wenn dies zutrifft. Um diesen Fall nicht eintreffen zu lassen, solltest du `maxmemory-policy` auf `allkeys-lru` setzen
|
|
|
Nachdem du weißt, wie groß dein QUIQQER Cache ist, kannst du deinen Redis Server entsprechend anpassen.
|
|
|
Am besten weist du deinem Redis Server etwa 10 % mehr Speicherplatz zu, als der Cache Ordner groß ist.
|
|
|
Ist dein Cache Ordner also `1000 MB` groß, solltest du Redis `1100 MB` Speicherplatz zuweisen.
|
|
|
|
|
|
Folgende Möglichkeiten für `maxmemory-policy` gibt es:
|
|
|
Den Speicherplatz legst du in der `/etc/redis/redis.conf` Datei mit der `maxmemory` Einstellung fest.
|
|
|
|
|
|
- `volatile-lru`: Entfernen eines Schlüssels mit einem Ablaufdatum unter Verwendung eines LRU-Algorithmus.
|
|
|
- `allkeys-lru`: Entfernen eines Schlüssels entsprechend dem LRU-Algorithmus.
|
|
|
- `volatile-random`: Entfernen eines zufälligen Schlüssels mit einer Ablaufsteuerung
|
|
|
- `allkeys->random`: Entfernen eines zufälligen Schlüssels, eines beliebigen Schlüssels
|
|
|
- `volatile-ttl`: Entfernen eines Schlüssels mit der nächstgelegenen Verfallszeit (kleine TTL).
|
|
|
- `noeviction`: läuft überhaupt nicht ab, sondern gibt einfach einen Fehler bei Schreibvorgängen zurück.
|
|
|
Danach musst du deinen Redis Server neustarten/-laden.
|
|
|
|
|
|
*english*
|
|
|
### Memory Policy anpassen
|
|
|
|
|
|
Wir empfehlen die `maxmemory-policy` des Redis Servers anzupassen.
|
|
|
Standardmäßig steht die policy auf `noeviction`.
|
|
|
Die Einstellung besagt, dass der Redis Cache keine neuen Cache-Einträge anlegt, wenn der gesamte Speicherplatz aufgebraucht wurde.
|
|
|
Da in diesem Fall Fehler geworfen werden und bspw. neue Produkte nicht gecacht werden können, solltest du die `maxmemory-policy` auf `allkeys-lru` setzen.
|
|
|
|
|
|
- `volatile-lru`: remove the key with an expiry set using an LRU algorithm
|
|
|
- `allkeys-lru`: remove any key accordingly to the LRU algorithm
|
|
|
- `volatile-random`: remove a random key with an expiry set
|
|
|
- `allkeys->random`: remove a random key, any key
|
|
|
- `volatile-ttl`: remove the key with the nearest expiry time (minor TTL)
|
|
|
- `noeviction`: don't expire at all, just return an error on write operations
|
|
|
Die Änderung nimmst du in der `/etc/redis/redis.conf` Datei vor.
|
|
|
Danach musst du deinen Redis Server neustarten/-laden.
|
|
|
|
|
|
## Bekannte Fehlermeldungen
|
|
|
|
|
|
Unter Umstände kann Redis einige Fehlermeldungen werfen. Bekannte Fehlermeldung und die Lösung dazu findest du im folgenden Abschnitt. Beachte das jeder Redis Server an seine Umgebung angepasst werden sollte, daher können keine allgemeinen Aussagen oft gemacht werden. Die Serverausstattung spielt hier eine grosse Rolle, wie viel RAM und Festplattenplatz vorhanden ist.
|
|
|
Unter Umstände kann Redis einige Fehlermeldungen werfen.
|
|
|
Bekannte Fehlermeldung und die Lösung dazu findest du in diesem Abschnitt.
|
|
|
Beachte, dass jeder Redis Server an seine Umgebung angepasst werden sollte, daher können keine allgemeingültigen Lösungsvorschläge gemacht werden.
|
|
|
Die Hardware des Servers spielt hier eine grosse Rolle (beispielsweise wie viel RAM und Speicherplatz vorhanden ist).
|
|
|
|
|
|
### `MISCONF` Redis
|
|
|
### `MISCONF` Exception
|
|
|
|
|
|
```
|
|
|
PHP Fatal error: Uncaught RedisException: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
|
... | ... | @@ -144,7 +100,9 @@ PHP Fatal error: Uncaught RedisException: MISCONF Redis is configured to save R |
|
|
|
|
|
**Lösung**
|
|
|
|
|
|
Da QUIQQER die Sessions in den Redis Server schreibt, sind viele Schreiboperationen vorhanden. Das standard Backup Verhalten von Redis ist für diesen Zweck etwas stark eingestellt. Hierzu empfehlen wir die `Save the DB on disk` etwas anzupassen und zu erhöhen:
|
|
|
Da QUIQQER die Sessions in den Redis Server schreibt, sind viele Schreiboperationen notwendig.
|
|
|
Das standardmäßige Backup Verhalten kann hiermit Probleme bekommen.
|
|
|
Wir empfehlen die `save` Direktive wie folgt anzupassen:
|
|
|
|
|
|
```
|
|
|
################################ SNAPSHOTTING ################################
|
... | ... | |