[[Vorlage(Getestet, plucky)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Programme kompilieren: Pakete aus dem Quellcode erstellen] [:Packprogramme: Archive entpacken] [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis()]] [[Bild(valkey_logo.webp, align=left)]] [https://valkey.io/ Valkey] {en} ist eine „Key-Value Store“ Datenbank (oder kurz nur KV Store), ins Deutsche übersetzt [wikipedia:Schlüssel-Werte-Datenbank:]. Hier werden die Daten immer in Form von Schlüssel-Werte-Paaren gespeichert. Man kann sich die Datenbank vereinfacht so vorstellen, dass darin nur eine Tabelle mit zwei Spalten existiert, nämlich einer Spalte für den Schlüssel und einer für den Wert. Valkey kennt verschiedene Datentypen und kann entweder allein stehend oder als Cluster betrieben werden. Bei Valkey sind, wie bei anderen KV Stores auch, Schlüssel „alles“ und Werte „nichts“. D.h. alle Abfragen beziehen sich immer auf einen Schlüssel und liefern einen Wert zurück. Abfrage zu Werten wie „Zeige mir den Schlüssel zum Wert foobar“ gibt es nicht. Valkey ist im Vergleich zu anderen Datenbanksystemen, wie z.B. SQL-Datenbanken sehr schnell. Eine lokale Installation auf einem halbwegs aktuellen Laptop schafft in der Standardkonfiguration ca. 100.000 Abfragen pro Sekunde. Daher wird Valkey auch gerne als Caching Server und Messaging Queue genutzt. Valkey wird unter der Obhut der Linux Foundation entwickelt. Das Projekt entstand [https://www.linuxfoundation.org/press/linux-foundation-launches-open-source-valkey-community als Fork von Redis] {en}, nachdem das Redis Projekt von einer Open Source Lizenz auf eine restriktivere „source available“ Lizenz [https://redis.io/blog/redis-adopts-dual-source-available-licensing/ gewechselt ist] {en}. Der Fork wurde auf Basis von Redis 7.2.4 vollzogen. Seitdem wird Valkey eigenständig weiter entwickelt. = Installation = == aus den Paketquellen == Valkey ist ab Ubuntu [:24.04:] in den Paketquellen enthalten[1]: {{{#!vorlage Paketinstallation valkey, universe }}} Bei der Installation wird, sofern man das eigene System nicht umkonfiguriert hat, das Paket '''ruby-redis''' als empfohlene Abhängigkeit mit installiert. Wer nicht von [:Ruby:] aus auf Valkey zugreifen möchte, sollte bei der Paketinstallation die Option `--no-install-recommends` mit angeben. Bei der Installation wird auch die [:systemd/Service Units:systemd Service Unit] '''valkey-server.service''' angelegt und aktiviert. Über diese wird der Valkey Server beim Booten gestartet. == manuelle Installation == [[Vorlage(Fremd, Software)]] Wer die aktuelle, stabile Version von Valkey nutzen oder mit einer anderen Konfiguration selbst kompilieren möchte, der geht wie folgt vor: Als erstes lädt man sich die aktuelle Version von der [https://github.com/valkey-io/valkey/releases Downloadseite des Projekts] {en} herunter. Die Datei entpackt man dann[3], z.B. in das eigene Homeverzeichnis {{{#!vorlage Hinweis Es wird im folgenden davon ausgegangen, dass Valkey nach `/home/BENUTZER/valkey-8.1.1` entpackt worden ist. }}} Man wechselt ins Verzeichnis '''valkey-8.1.1''' und startet das Kompilieren[2]: {{{#!vorlage Befehl make }}} Nach dem Durchlauf des Compilers ist Valkey einsatzbereit, allerdings nicht systemweit installiert. Zum Testen oder lokalen Einsatz ist dies aber auch nicht notwendig. Zum manuellen Starten von Valkey wechselt man in das Verzeichnis '''scr''' und startet dort den Valkey-Server manuell: {{{#!vorlage Befehl ./valkey-server }}} Hier man auch die interaktive Kommandozeile manuell starten: {{{#!vorlage Befehl ./valkey-cli }}} Möchte man Valkey systemweit installieren, ist noch der folgende Befehl auszuführen[4][5]: {{{#!vorlage Befehl sudo make install }}} Der Server sowie die Hilfsprogramme wie `valkey-cli` etc. werden dann nach '''/usr/local/bin''' installiert. Zu beachten ist, dass bei der manuellen Installation weder eine systemd [:systemd/Service Units:Service Unit] noch eine Konfigurationsdatei angelegt wird. Eine Vorlage für eine passende Service Unit Datei ist im Unterverzeichnis '''utils''' zu finden. Die Vorlage für die Konfigurationsdatei '''valkey.conf''' ist auf der oberen Ebenen im entpackten Verzeichnis zu finden. Weitere, ausführliche Hinweise zum Kompilieren findet man in der Datei '''README.md''', die man auf der oberen Ebenen im entpackten Verzeichnis findet. = Benutzung = Im folgenden wird eine kurze Übersicht über die grundlegende Nutzung und die verschiedenen Möglichkeiten von Valkey gegeben. Eine vollständige Übersicht zu allen Themen und Möglichkeiten ist in der [https://valkey.io/docs/ ausführlichen Dokumentation] {en} zu finden. Für das kurze Praxisbeispiel im Abschnitt [#Valkey-Kommandozeile Valkey Kommandozeile] wird davon ausgegangen, dass ein Valkey Server auf dem Rechner lokal läuft. == Datentypen == Valkey kennt zehn verschiedene Datentypen, die in der folgenden Tabelle kurz erklärt werden. Ausführliche Information findet man in der Valkey [https://valkey.io/topics/data-types/ Dokumentation zu Datentypen] {en}. {{{#!vorlage Tabelle Datentyp Beschreibung +++ String Eine beliebige Zeichenfolge (z.B. Text) +++ List Entspricht einem [wikipedia:Feld_(Datentyp):Array], die Elemente (= Strings) werden über einen positiven, ganzzahligen, null-basierten Index angesprochen (d.h. das erste Element der Liste hat den Index 0, das zweite 1 usw.). +++ Hash Entspricht einem [wikipedia:Assoziatives_Datenfeld:assoziativem Array], die Elemente bestehen hier wiederum aus Schlüssel-Werten Paaren. +++ Set Entspricht „List", außer dass -- im Gegensatz zu List -- Elemente nur genau einmal vorkommen dürfen. +++ Sorted Set Entspricht einem Set, nur dass zusätzlich der Index des Elements explizit mit angegeben wird. +++ Stream Streams in Redis sind eine Art Datenstrom in Form eines Logs, an den nur Daten angehangen werden können. D.h. bestehende Daten können nicht geändert oder gelöscht werden. +++ Geospatial Index Varianten des Sortes Sets, bei dem Geodaten in der Form `LATITUDE, LONGITUDE, ORT` angegeben werden. `LATITUDE` und `LONGITUDE` müssen in Dezimalgrad angegeben werden. Damit ist es z.B. möglich Abstände zwischen zwei Orten zu berechnen oder eine Umkreissuche durchzuführen. +++ Bitmap Eine spezielle Version des Datentyps „String“, bei dem nur Nullen und Einsen (Bits) gespeichert werden +++ Bitfield Dienen zum Speichern von Integer Werten, die Werte als binäre Strings gespeichert. Zugriffe erfolgen durch [wikipedia:Atomare_Operation:atomare Operationen], wodurch sich Bitfields sehr gut für Zähler nutzen lassen. +++ HyperLogLog probabilistische Datenstruktur, mit der sich die [wikipedia:Mächtigkeit_(Mathematik):Kardinalität] einer Datenmenge sehr speichereffizient bestimmen lässt }}} == Valkey Kommandozeile == Mit dem Befehl[4] {{{#!vorlage Befehl valkey-cli }}} startet man eine interaktive Kommandozeile zur Interaktion mit der Datenbank. Gibt man keine weiteren Parameter beim Aufruf an, wird als IP-Adresse des Servers `127.0.0.1` (localhost) und Port 6379 (der Default-Port von Valkey) angenommen, sowie die Datenbank mit dem Index 0 genutzt. Im folgenden ein Beispiel zur Interaktion mit der Datenbank: {{{#!code 127.0.0.1:6379> set greeting "Hallo Wetl!" OK 127.0.0.1:6379> get greeting "Hallo Wetl!" 127.0.0.1:6379> LPUSH listExample "focal" "jammy" "noble" (integer) 3 127.0.0.1:6379> LLEN listExample (integer) 3 127.0.0.1:6379> LPUSH listExample "bionic" (integer) 4 127.0.0.1:6379> LRANGE listExample 0 -1 1) "bionic" 2) "noble" 3) "jammy" 4) "focal" 127.0.0.1:6379> HSET releases "jammy" "22.04" "noble" "24.04" (integer) 2 127.0.0.1:6379> HGETALL releases 1) "jammy" 2) "22.04" 3) "noble" 4) "24.04" 127.0.0.1:6379> HGET releases jammy "22.04" 127.0.0.1:6379> SELECT 1 OK 127.0.0.1:6379[1]> SET greeting "Hallo Ubuntu" OK 127.0.0.1:6379[1]> GET greeting "Hallo Ubuntu" 127.0.0.1:6379[1]> SELECT 0 OK 127.0.0.1:6379> GET greeting "Hallo Wetl!" 127.0.0.1:6379> EXIT }}} Dabei passiert folgendes: * Alles erstes wird der Schlüssel `greeting` mit dem String `Hallo Welt` als Wert angelegt (`SET`) und abgefragt (`GET`). * Dann wird eine Liste mit dem Schlüssel `listExample` angelegt (`LPUSH`), die drei Werte enthält. Es wird die Länge der Liste abgefragt (`LLEN`), ein weiterer Wert an den Anfang der Liste eingefügt (`LPUSH`) und die Liste komplett ausgegeben (`LRANGE`). * Danach wird der Hash `releases` mit zwei Schlüssel-Werte Paaren angelegt (`HSET`), alle Schlüssel-Werte Paare des Hashs angezeigt (`HGETALL`) und der Wert von `jammy` aus dem Hash `releases` gezielt abgefragt. * Zum Schluss wird die Datenbank auf Datenbank 1 gewechselt (`SELECT 1`), darin ein Schlüssel mit einem String-Wert angelegt und abgefragt. Danach wird wieder zurück zur Datenbank 0 gewechselt (`SELECT 0`). * Mit `EXIT` verlässt man die interaktive Kommandozeile. Die komplette Dokumentation zu `valkey-cli` wie Optionen, nicht-interaktive Nutzung etc. findet man in der [https://valkey.io/topics/cli/ Dokumentation] {en}. == Publish / Subscribe == Valkey ist auch ein Publish-Subscribe Server. Hier können Nachrichten an Kanäle gesendet werden („Publish“), auf dem die Empfänger dann lauschen können („subscribe“). Der Sender weiß nichts über die Empfänger, dass heißt es gibt keine Empfangsbestätigung oder ähnliches. Für den Empfänger ist sichergestellt, dass Nachrichten in der Reihenfolge empfangen werden, in der sie versendet wurden. Details und Beispiele zur Nutzung gibt es [https://valkey.io/topics/pubsub/ in der Dokumentation] {en}. == Lua Skripting == Valkey unterstützt serverseitig das Ausführen von [:Lua:]-Skripten. Damit können z.B. Daten aus der Datenbank auf dem Server ver- / bearbeitet werden, bevor sie als Ergebnis zurück geliefert werden. Weitere Informationen sind in der [https://valkey.io/topics/eval-intro/ Dokumentation] {en} zu finden. == Benchmark == Sowohl bei der Installation aus den Paketquellen als auch der manuellen Installation wird das Programm `valkey-benchmark` mit installiert, mit dessen Hilfe man die Performance der Installation auf der eigenen Hardware testen kann. Das Programm wird einfach über {{{#!vorlage Befehl valkey-benchmark }}} gestartet. Der Benchmark kennt etliche Optionen, die man sich über die Option `-h` beim Aufruf des Programms anzeigen lassen kann. == Konfiguration == Die komplette Konfiguration ist standardmäßig in der Datei '''/etc/valkey/valkey.conf''' abgelegt. Die Konfiguration wird beim Starten des Server automatisch gelesen, wenn man nicht eine andere Konfigurationsdatei angibt. Die Datei ist sehr ausführlich kommentiert, außerdem sind in der Dokumentation die Seiten * [https://valkey.io/topics/valkey.conf/ valkey.conf] {en} -- allgemeine Einführung in die Konfigurationsdatei * [https://valkey.io/topics/persistence/ Persistance] {en} -- Erklärung zu den Optionen der Datenpersistenz * [https://valkey.io/topics/replication/ Replikation] {en} -- Erklärung, wie man Valkey für die „Leader-Follower“ Replikation konfiguriert als Einstiegspunkt empfehlenswert. == Clusterbetrieb == In der Standardeinstellung läuft der Valkey-Server als einzelne Instanz. Valkey ist aber auch clusterfähig. Einen ausführlichen Einstieg findet man im [https://valkey.io/topics/cluster-tutorial/ Cluster-Tutorial] {en} der Dokumentation. = Deinstallation = Leider hat Valkey keine Deinstallationsroutine zum Entfernen der manuellen Installation. Dies kann man aber recht einfach von Hand erledigen. Man wechselt ins Verzeichnis '''/usr/local/bin''' und führt dort den Befehl [4][5]: {{{#!vorlage Befehl sudo rm valkey-* }}} aus. Anschließend schaut man in den Verzeichnissen '''/var/log''' und '''/var/lib''', ob dort eventuell Logdateien und Datenbankdateien (Dateiendung '''.rdb''') von Valkey vorhanden sind und löscht diese ebenfalls manuell. Dazu sind auch Root-Rechte notwendig. Hat man selber eine systemd Service Unit zum automatischen Starten des Server angelegt, muss man die Unit deaktivieren und entfernen. Hat man eine Konfigurationsdatei angelegt, entfernt man diese ebenfalls. Hat man Valkey nur mit `make` kompiliert, aber nicht mit `sudo make install` installiert, reicht es, das Verzeichnis, in dem Valkey entpackt wurde, inklusive alle Unterverzeichnisse zu löschen. = Links = * [https://valkey.io/ Homepage] {en} * [https://valkey.io/docs/ Startseite] {en} der Dokumentation * [github:valkey-io/valkey:Github Repository] von Valkey * [https://valkey.io/clients/ Übersicht] {en} über Bibliotheken für verschiedene Programmiersprachen, um auf Valkey zuzugreifen #tag: Server, Datenbank, Key-Value Store