Mehrere Redis-Instanzen bereitstellen

Letzte Aktualisierung am 07.08.2023, 20:08:23 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://codeberg.org/wd/Bash-Skripte/raw/branch/main/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://codeberg.org/wd/Bash-Skripte/raw/branch/main/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. 🙂

Abonnieren
Benachrichtige mich bei
0 Comments
Inline Feedbacks
View all comments