Inhaltsverzeichnis
Letzte Aktualisierung am 29.05.2024, 13:05:00 Uhr
Ich hoste für mich und ein paar Freunde ein paar Internetseiten. Internetseiten basieren heutzutage auf einem Content Management System (CMS), wie WordPress, Typo3, Drupal, Joomla, etc. Recht schnell können Internetseiten komplex werden und damit hohe Ladezeiten für den Nutzer bedeuten kann. Was im Umkehrschluss für mehr Auslastung von Prozessor, Arbeitsspeicher auf dem Server selbst bedeuten kann.
Entlastung und damit schnelle Ladezeiten können Caches wie Memcache, Redis, etc. schaffen. Wobei Redis im jedem Munde ist und dahingehend auch Vorteile gegen über den alten Hasen (> 20 Jahre) wie Memcache mit sich bringt.
Vorwort
Ein Redis Server ist schnell installiert und nach einer grundlegenden Konfigurationen ist die Instanz einsatzbereit. In der Instanz stehen 0-15 Datenbanken zur Verfügung. Innerhalb einer Datenbank kann mit Hilfe von Präfixe (z.B. wp_) nochmals differenziert werden. Das macht aus meiner Sicht nur Sinn, wenn eine Webseite bzw. dessen Plug-In/Add-On/App eine definierte Konfiguration von Redis zu lassen. Wird eine Redis Datenbank von zwei unterschiedlichen Internetseiten genutzt und der Nutzer A führt ein FLUSDB aus, wird sich Nutzer B dafür bedanken. Denkbar hierfür ist für jeden Präfix eine ACL einzurichten um eine Trennung vorzunehmen.
Ein anderer Aspekt ist die Nutzung des Arbeitsspeichers der Redis Instanz. Der Maximalwert wird in der Konfigurationsdatei definiert und gilt damit über alle Datenbanken hinweg. D.h. es kann nicht explizit definiert werden, dass das Stück vom Kuchen für alle Nutzer gleich groß ist.
Unabhängig davon, ob ACLs eingesetzt werden oder nicht, wird empfohlen verschiedene Befehle (z.B. FLUSHALL, SHUTDOWN, FLUSDB, DEBUG, CONFIG, etc. des Redis Servers umzubenennen oder deaktivieren. Ein Best Practice gibt es hierzu aktuell nicht.
Für das Hosting von Internetseiten und Applikationen nutze ich einen Server mit dem Control-Panel KeyHelp. Nun habe ich selbst für diesen Blog als auch für meine Nextcloud (Nc) eine Anbindung an Redis umgesetzt. Ein Freund hat eine Internetseite auf Basis von Typo3 und möchte ebenfalls ein Redis Cache nutzen.
Daher bin ich zu diesem Zeitpunkt der Ansicht, dass auf Grund der Rahmenbedingungen und Anforderungen, dedizierte Redis-Server für uns die beste Option sind. Nachstehend die dafür notwendigen Schritte unter Ubuntu Server 22.04 LTS.
Installation
Redis-Server installieren, falls noch nicht vorhanden.
apt install -y redis
Standard Instanz anhalten und Autostart deaktivieren.
systemctl stop redis systemctl disable redis
Kontrolle, welche Version installiert wurde.
redis-server -v Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=a3fdef44459b3ad6
Konfiguration
Sicherungskopie der originalen Konfigurationsdatei des Diensts erstellen.
cp /usr/lib/systemd/system/redis-server@.service /usr/lib/systemd/system/redis-server@.service.original
Sicherstellen, dass eine Kopie auch erstellt wurde.
ll /usr/lib/systemd/system | grep "redis" -rw-r--r-- 1 root root 1202 Mar 4 2022 redis-server.service -rw-r--r-- 1 root root 2430 Mar 4 2022 redis-server@.service -rw-r--r-- 1 root root 2430 Mar 25 12:05 redis-server@.service.original
Parameter der Konfigurationsdatei hinzufügen.
sed -i '/^Documentation=/a Conflicts=redis-server.service' /usr/lib/systemd/system/redis-server@.service sed -i '/^Conflicts=/a AssertPathExists=/etc/redis/redis-%i.conf' /usr/lib/systemd/system/redis-server@.service sed -i '/^PIDFile/a TimeoutStartSec=900' /usr/lib/systemd/system/redis-server@.service
Parameter in der Konfigurationsdatei ersetzen.
sed -i -e 's/^TimeoutStopSec=0$/TimeoutStopSec=900/g' /usr/lib/systemd/system/redis-server@.service sed -i -e 's/^ExecStart=\/usr\/bin\/redis-server \/etc\/redis\/redis-%i.conf$/ExecStart=\/usr\/bin\/redis-server \/etc\/redis\/redis-%i.conf --supervised systemd --daemonize no/g' /usr/lib/systemd/system/redis-server@.service #sed -i -e 's/^PIDFile=\/run\/redis-%i\/redis-server.pid$/PIDFile=\/run\/redis\/redis-%i.pid/g' /usr/lib/systemd/system/redis-server@.service sed -i -e 's/^Type=forking$/Type=notify/g' /usr/lib/systemd/system/redis-server@.service
Die Änderung an der Konfiguration aktivieren.
systemctl daemon-reload
Eine zusätzliche Konfiguration für Logrotate ist nicht erforderlich. Durch das Namensschema für die Logfile ist sichergestellt, dass die bestehende Konfiguration (/etc/logrotate.d/redis-server) für alle Instanzen greift.
Einrichten einer Instanz
Grundlage ist ein eigen dafür geschriebenes Bash Skript. Damit möchte ich den Einrichtungsschritte automatisieren und vor allem standardisieren. Dieses führt folgende Schritte durch:
- Eingabe des Namens für die Instanz.
- Prüfung, ob eine Instanz mit dem Namen bereits existiert.
- Sucht einen freien Port zwischen 6380 und 4000.
- Erzeugt ein zufälliges Passwort mit einer Länge von 32 Zeichen.
- Erzeugt eine Redis Konfiguration für diese Instanz.
- Ausgabe des Status des Redis Instanz.
- Ausgabe der Informationen für die Instanz.
In folgenden Verzeichnissen werden die Dateien der Instanzen zu finden sein:
Pfade | Beschreibung |
/var/log/redis/ | Logdatei der jeweiligen Instanz |
/var/lib/redis | Pfad der Datenbankdatei |
/etc/redis/ | Konfigurationsdatei der jeweiligen Instanz |
/run/redis-*/ | Verzeichnis der PID Datei |
Aktuelle Version des Bash Skripts herunterladen.
wget https://raw.githubusercontent.com/dwydler/Bash-Skripte/master/Redis/Redis-Server_Multi-Instances/create-new-redis-server-instance.sh
Der Datei die notwendigen Rechte geben, um diese Ausführen zu können.
chmod 700 create-new-redis-server-instance.sh
Das Bash Skript ausführen.
./create-new-redis-server-instance.sh
Ausgabe eines Einrichtungsprozesses.
Die Konfigurationsdatei (/etc/redis/redis-test10.conf) für diese Instanz sieht wie folgt aus:
# Default values for every instance include /etc/redis/redis.conf # Custom values for this instance # This will overwrite the settings of redis.conf port 6380 requirepass YjZjN2Y3NmY5MDQ5MDcxOTdhMjI0Mzg4 #pidfile /run/redis/redis-test10.pid logfile /var/log/redis/redis-test10.log dbfilename test10.rdb dir /var/lib/redis
Zeile | Beschreibung |
2 | Es wird die vorhandene Konfiguration sozusagen als Standard eingebunden. Dort können Parameter definiert, welche für alle Redis Instanzen gelten sollen. Gerne werden hier Befehle wie FLUSHALL oder SHUTDOWN deaktiviert. |
ab 3 | Ab dieser Zeile können Parameter aus der Standardkonfiguration überschrieben werden (z.B. RAM, Passwort, etc.) |
6 | Port auf dem die Redis Instanz lauschen soll. Dieser Port wird von Bash Skript ermittelt. |
7 | Es handelt sich dabei um das Passwort für die Redis-Instanz. Dieses Zufallspasswort wird im Bash Skript erzeugt. |
Löschen einer Instanz
Natürlich kann es auch vorkommen, dass eine bestehende Redis-Instanz nicht mehr benötigt wird. Für den Rückbau habe ich ebenfalls ein Bash Skript entworfen. Es führt die verschiedenen Schritte von der Einrichtung sozusagen „rückwärts“ aus.
Aktuelle Version des Bash Skripts herunterladen.
wget https://raw.githubusercontent.com/dwydler/Bash-Skripte/master/Redis/Redis-Server_Multi-Instances/delete-redis-server-instance.sh
Der Datei das Recht geben, um diese Ausführen zu können.
chmod 700 delete-redis-server-instance.sh
Das Bash Skript ausführen.
./delete-redis-server-instance.sh
Ausgabe eines Löschprozesses.
Damit sind alle Dateien und Daten der Instanz gelöscht.
Schlusswort
Mit Hilfe der Bash Skripte können eine Vielzahl von Redis-Server aufgesetzt bzw. gelöscht werden. Unabhängig davon ist es möglich verschiedene Konfigurationsdateien zu definieren, um die größtmögliche Standardisierung zu erhalten. Jedoch bei Bedarf einzelne Parameter für die betroffene Instanz anzupassen bzw. überschreiben zu können.
Schlussendlich kann damit jegliche Anforderung schnell und einfach, ohne großen Konfigurationsaufwand, durch den SysAdmin umgesetzt werden.
Viel Spaß beim Ausprobieren. 🙂