Ubuntu: Redisearch v2 Modul für Redis aus dem Source Code selbst bauen
Hier eine Anleitung um das Redisearch Modul v2.x für Redis selbst zu kompilieren. Als Binary bekommt man es im Moment nur als Abonnent der Enterprise Version. Per "apt-get" kann man nur das Redisearch Modul v1.x installieren. Version v1.x funktioniert gut, hat aber deutlich weniger Features. Ohne das Abo kann man sich die v2.x Version nur aus dem Quellcode selbst bauen. Die offizielle Doku zum RediSearch Modul findet ihr hier.
RediSearch ist die Suchmaschine bzw. genauer gesagt, der Suchindex für die Redis Datenbank. Er ist aktuell der schnellste Such-Index, den man frei installieren kann.
Die Firma Redis empfiehlt für RediSearch und Redis ein Docker Install (redis-stack). Ich möchte aber das der Server nativ auf der Maschine läuft, da unsere Produktion bereits virtualisiert ist (KVM). Eine Virtualisierung (Docker) in einer Virtualisierung (KVM) funktioniert natürlich, es geht aber viel Performance verloren und die Bedienung ist gerade in der Entwicklung nicht ganz so komfortabel. Die alternative Installationsmethode per "Docker" findet ihr auf der RediSearch Quickstart Seite
Tip: Das "--recursive" wird gebraucht, um Submodule zu laden.
Will man ein spezielles Release per Git laden kann man das mit der "--branch" Option steuern. Wenn wir z.B. das Redisearch Release 2.4.15 laden wollen:
Das hat den Vorteil, das auch die richtige Versionsnummer von Redisearch im Redis-Log und im "redis-cli" erscheint. Ohne die "--branch"-Angabe erscheint als Version eine 99.99.99 (Git=master-xxx).
Hier wird das User Passwort verlangt (da intern "sudo" aufgerufen wird)
Das Ergebnis sollte so öder ähnlich aussehen:
Es erscheint eine Abfolge von 1% bis 100% mit ein paar "deprecated:" Warnungen. Diese können ignoriert werden.
Die Ausgabe sollte so starten und so enden:
Für den nächsten Schritt muss Redis installiert sein. Wer den Redis-Server schon auf seinem System installiert hat, kann diesen Schritt überspringen und gleich zum Punkt "RediSearch Modul testen" gehen.
Hier eine kurze Befehlsfolge, wie man den Redis-Server mit Hilfe der offiziellen "redis.io" Pakete unter Ubuntu 22.04 installiert:
Danach ist der Redis-Server und der Redis-Cli installiert und wurde automatisch gestartet. Die Installation kann man mit dem Aufruf "redis-cli " testen.
Folgendes sollte mit einem blinkendem Cursor erscheinen:
Mit dem Befehl "info" kann man sich alle möglichen Informationen zu redis anzeigen lassen:
Mit "exit" kommt man wieder aus dem Redis-Cli.
Mit den "service" Befehlen "start", "restart", "stop" und "status" kann man den Redis-Server starten, restarten, stoppen und den aktuellen Status auslesen. Das Logfile findet man unter "/var/log/redis/redis-server.log".
Redis Starten:
Redis Stoppen:
Redis so einrichten, dass es nach einem Reboot des Servers wieder automatisch startet:
Bevor es nun weiter geht, muss man den Redis-Server stoppen:
Mit "status" kann man den aktuellen Status auslesen. Es sollte "Active: inactive (dead)" erscheinen.
Jetzt testet man das neu erstellte RediSearch Modul im Verzeichnis "~/redis/RediSearch":
Ausgabe:
Das Modul wurde geladen und der Redis-Server gestartet. In der Ausgabe sollte sich der Eintrag: "Module 'search' loaded from /var/lib/redis/modules/redisearch.so" befinden. Wenn nicht ist irgendwo ein Fehler aufgetreten. Wiederholt dann noch einmal die ersten Schritte der Anleitung.
Mit "Strg"+"c" stoppt man den Redis-Server.
Das neu erstellet RediSearch Modul befindet sich nach der Erstellung unter:
Wir legen nun unter "/var/lib/redis/" ein Modul-Verzeichnis an und kopieren die neu erstellte Library "redisearch.so" in das erstellte Verzeichnis:
Überprüfen kann man den Kopiervorgang mit:
Das Modul sollte jetzt unter "/var/lib/redis/modules/" erscheinen.
Jetzt passen wir die Redis-Server Konfigurationsdatei (/etc/redis/redis.conf) an. Dabei öffnen wir die Datei und ergänzen sie im Bereich MODULES :
Tipp: Wer den "vi" nicht beherscht, kann den "vi" durch den Befehl "nano" ersetzen. Also "sudo nano /etc/redis/redis.conf"
Die Datei "redis.conf" speichern.
Tipp: Ihr könnt die Redis-Library "redisearch.so" natürlich hinkopieren wo ihr wollt. Ihr müsst nur den entsprechend Pfad unter "loadmodule" anpassen.
Redis-Server neu starten:
Mit "status" kann man den Redis-Server testen und schauen ob alles läuft. Es sollte "Status: "Ready to accept connections" erscheinen.
Im Logfile "/var/log/redis/redis-server.log" sollte der Eintrag: "Module 'search' loaded from /var/lib/redis/modules/redisearch.so" erscheinen.
Hier der Ausschnitt dazu:
Der Redis-Server sollten nun laufen, dass RediSearch-Modul erstellt, kopiert und aktiviert sein. Nun testen wir das zur Laufzeit mit Hilfe der "redis-cli":
Wenn das erscheint, habt ihr alles richtig gemacht! Gratulation
Wer sich für Redis und RediSearch 2 interessiert sollte sich folgendes anschauen bzw. durchlesen:
Es gibt auch mehrere Clients für fast alle Programmiersprachen (PHP, Ruby, Javascript, Go, etc.):
Sollte ein Fehler beim Starten oder Stoppen des Redis-Servers auftreten könnt ihr das über die Befehle:
oder
genau überprüfen. Auch das Redis-Logfile gibt oft eine Antwort auf Fehler:
Über Feedback oder Verbesserungen freue ich mich jederzeit. Wenn Euch die Anleitung gefällt klickt bitte auf das "Herz", als kleines Dankeschön
Gruß
Frank
RediSearch ist die Suchmaschine bzw. genauer gesagt, der Suchindex für die Redis Datenbank. Er ist aktuell der schnellste Such-Index, den man frei installieren kann.
Inhaltsverzeichnis
Warum nicht Docker?
Die Firma Redis empfiehlt für RediSearch und Redis ein Docker Install (redis-stack). Ich möchte aber das der Server nativ auf der Maschine läuft, da unsere Produktion bereits virtualisiert ist (KVM). Eine Virtualisierung (Docker) in einer Virtualisierung (KVM) funktioniert natürlich, es geht aber viel Performance verloren und die Bedienung ist gerade in der Entwicklung nicht ganz so komfortabel. Die alternative Installationsmethode per "Docker" findet ihr auf der RediSearch Quickstart Seite
Vorbereitung, Voraussetzungen zum Kompilieren
- Getestet unter Ubuntu 22.04
- Alle Befehle werden unter der Linux-Bash und als User "frank" und nicht direkt als root durchgeführt! Der Hostname des System lautet: "nexus". Wenn "root" gebraucht wird, benutze ich "sudo" dafür.
- Es wird das Home-Verzeichnis ~/redis für den Quellcode und das Kompilieren benutzt
- Alle Tools und Programme, die unter Ubuntu 22.04 zur Entwicklung benötigt werden, müssen vorher installiert werden:
sudo apt update
sudo apt install build-essential g++ make git
Quellcode per Git laden
mkdir ~/redis
cd ~/redis
git clone --recursive https://github.com/RediSearch/RediSearch.git
cd RediSearch
Tip: Das "--recursive" wird gebraucht, um Submodule zu laden.
Will man ein spezielles Release per Git laden kann man das mit der "--branch" Option steuern. Wenn wir z.B. das Redisearch Release 2.4.15 laden wollen:
git clone --recursive https://github.com/RediSearch/RediSearch.git --branch v2.4.15
Das hat den Vorteil, das auch die richtige Versionsnummer von Redisearch im Redis-Log und im "redis-cli" erscheint. Ohne die "--branch"-Angabe erscheint als Version eine 99.99.99 (Git=master-xxx).
Abhängigkeiten überprüfen und installieren
Hier wird das User Passwort verlangt (da intern "sudo" aufgerufen wird)
make setup
Das Ergebnis sollte so öder ähnlich aussehen:
~/redis/RediSearch$ make setup
# Using CC=gcc
Setting up system...
[sudo] Passwort für frank:
sudo apt-get -qq update -y
# readies version: ed8290a
sudo apt-get -qq install --fix-missing -y ca-certificates
sudo apt-get -qq install --fix-missing -y curl wget unzip
sudo /home/frank/redis/RediSearch/deps/readies/bin/enable-utf8
sudo apt-get -qq install --fix-missing -y git gawk jq openssl rsync unzip
sudo apt-get -qq install --fix-missing -y patch
sudo apt-get -qq install --fix-missing -y libatomic1
/home/frank/redis/RediSearch/deps/readies/bin/getgcc --modern
sudo apt-get -qq install --fix-missing -y libtool m4 automake libssl-dev
sudo apt-get -qq install --fix-missing -y python3-dev
sudo /usr/bin/python3 /home/frank/redis/RediSearch/deps/readies/bin/getcmake --usr
/usr/bin/python3 /home/frank/redis/RediSearch/deps/readies/bin/getrmpytools --reinstall --modern
sudo apt-get -qq install --fix-missing -y lcov
/usr/bin/python3 -m pip install --disable-pip-version-check --user pudb awscli
/usr/bin/python3 -m pip install --disable-pip-version-check --user gevent
/usr/bin/python3 -m pip install --disable-pip-version-check --user -r /home/frank/redis/RediSearch/tests/pytests/requirements.txt
Build und Linking
make build
Es erscheint eine Abfolge von 1% bis 100% mit ein paar "deprecated:" Warnungen. Diese können ignoriert werden.
Die Ausgabe sollte so starten und so enden:
# Using CC=gcc
# RediSearch root: /home/frank/redis/RediSearch
# RediSearch binroot: /home/frank/redis/RediSearch/bin/linux-x64-release
# RediSearch static libstdc++: on
-- The C compiler identification is GNU 10.3.0
-- The CXX compiler identification is GNU 10.3.0
-- Detecting C compiler ABI info
....
[100%] Linking CXX executable rstest
[100%] Built target rstest
Redis-Server installieren (oder ist dieser bereits vorhanden)?
Für den nächsten Schritt muss Redis installiert sein. Wer den Redis-Server schon auf seinem System installiert hat, kann diesen Schritt überspringen und gleich zum Punkt "RediSearch Modul testen" gehen.
Hier eine kurze Befehlsfolge, wie man den Redis-Server mit Hilfe der offiziellen "redis.io" Pakete unter Ubuntu 22.04 installiert:
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
Danach ist der Redis-Server und der Redis-Cli installiert und wurde automatisch gestartet. Die Installation kann man mit dem Aufruf "redis-cli " testen.
redis-cli
Folgendes sollte mit einem blinkendem Cursor erscheinen:
127.0.0.1:6379>
Mit dem Befehl "info" kann man sich alle möglichen Informationen zu redis anzeigen lassen:
127.0.0.1:6379> info
# Server
redis_version:7.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:68bf11aad5b039df
redis_mode:standalone
os:Linux 5.15.0-48-generic x86_64
arch_bits:64
monotonic_clock:POSIX clock_gettime
multiplexing_api:epoll
atomicvar_api:c11-builtin
gcc_version:11.2.0
process_id:790003
process_supervised:systemd
run_id:cac9eb4a3f82d6450dadc58079473c087027be3f
tcp_port:6379
server_time_usec:1665166255039660
uptime_in_seconds:72
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:4221871
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf
io_threads_active:0
...
Mit "exit" kommt man wieder aus dem Redis-Cli.
Mit den "service" Befehlen "start", "restart", "stop" und "status" kann man den Redis-Server starten, restarten, stoppen und den aktuellen Status auslesen. Das Logfile findet man unter "/var/log/redis/redis-server.log".
Redis Starten:
service redis-server start
Redis Stoppen:
service redis-server stop
Redis so einrichten, dass es nach einem Reboot des Servers wieder automatisch startet:
systemctl enable redis-server
RediSearch Modul testen
Bevor es nun weiter geht, muss man den Redis-Server stoppen:
service redis-server stop
Mit "status" kann man den aktuellen Status auslesen. Es sollte "Active: inactive (dead)" erscheinen.
service redis-server status
redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: http://redis.io/documentation,
man:redis-server(1)
Jetzt testet man das neu erstellte RediSearch Modul im Verzeichnis "~/redis/RediSearch":
make run
Ausgabe:
# Using CC=gcc
801022:C 07 Oct 2022 20:19:53.449 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
801022:C 07 Oct 2022 20:19:53.449 # Redis version=7.0.5, bits=64, commit=00000000, modified=0, pid=801022, just started
801022:C 07 Oct 2022 20:19:53.449 # Configuration loaded
801022:M 07 Oct 2022 20:19:53.450 * Increased maximum number of open files to 10032 (it was originally set to 1024).
801022:M 07 Oct 2022 20:19:53.450 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 7.0.5 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 801022
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
801022:M 07 Oct 2022 20:19:53.450 # Server initialized
801022:M 07 Oct 2022 20:19:53.450 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
801022:M 07 Oct 2022 20:19:53.455 * <search> Redis version found by RedisSearch : 7.0.5 - oss
801022:M 07 Oct 2022 20:19:53.455 * <search> RediSearch version 99.99.99 (Git=master-f7f5957c)
801022:M 07 Oct 2022 20:19:53.455 * <search> Low level api version 1 initialized successfully
801022:M 07 Oct 2022 20:19:53.455 * <search> concurrent writes: OFF, gc: ON, prefix min length: 2, prefix max expansions: 200, query timeout (ms): 500, timeout policy: return, cursor read size: 1000, cursor max idle (ms): 300000, max doctable size: 1000000, max number of search results: 1000000, search pool size: 20, index pool size: 8,
801022:M 07 Oct 2022 20:19:53.456 * <search> Initialized thread pool!
801022:M 07 Oct 2022 20:19:53.456 * <search> Enabled role change notification
801022:M 07 Oct 2022 20:19:53.456 * Module 'search' loaded from /home/frank/redis/RediSearch/bin/linux-x64-release/search/redisearch.so
801022:M 07 Oct 2022 20:19:53.456 * Ready to accept connections
Das Modul wurde geladen und der Redis-Server gestartet. In der Ausgabe sollte sich der Eintrag: "Module 'search' loaded from /var/lib/redis/modules/redisearch.so" befinden. Wenn nicht ist irgendwo ein Fehler aufgetreten. Wiederholt dann noch einmal die ersten Schritte der Anleitung.
Mit "Strg"+"c" stoppt man den Redis-Server.
RediSearch Modul automatisch beim Start von Redis laden
Das neu erstellet RediSearch Modul befindet sich nach der Erstellung unter:
/home/frank/redis/RediSearch/bin/linux-x64-release/search/redisearch.so
Wir legen nun unter "/var/lib/redis/" ein Modul-Verzeichnis an und kopieren die neu erstellte Library "redisearch.so" in das erstellte Verzeichnis:
sudo mkdir /var/lib/redis/modules
sudo cp /home/frank/redis/RediSearch/bin/linux-x64-release/search/redisearch.so /var/lib/redis/modules/.
Überprüfen kann man den Kopiervorgang mit:
sudo ls -la /var/lib/redis/modules/
Das Modul sollte jetzt unter "/var/lib/redis/modules/" erscheinen.
Jetzt passen wir die Redis-Server Konfigurationsdatei (/etc/redis/redis.conf) an. Dabei öffnen wir die Datei und ergänzen sie im Bereich MODULES :
sudo vi /etc/redis/redis.conf
Tipp: Wer den "vi" nicht beherscht, kann den "vi" durch den Befehl "nano" ersetzen. Also "sudo nano /etc/redis/redis.conf"
################################## MODULES #####################################
# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
loadmodule /var/lib/redis/modules/redisearch.so
################################## NETWORK #####################################
Die Datei "redis.conf" speichern.
Tipp: Ihr könnt die Redis-Library "redisearch.so" natürlich hinkopieren wo ihr wollt. Ihr müsst nur den entsprechend Pfad unter "loadmodule" anpassen.
Redis-Server neu starten:
service redis-server start
Mit "status" kann man den Redis-Server testen und schauen ob alles läuft. Es sollte "Status: "Ready to accept connections" erscheinen.
service redis-server status
redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2022-10-07 20:22:52 CEST; 3s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 801862 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 18977)
Memory: 2.9M
CPU: 98ms
CGroup: /system.slice/redis-server.service
└─801862 "/usr/bin/redis-server 127.0.0.1:6379" "" "" "" "" "" "" ""
Okt 07 20:22:51 nexus systemd[1]: Starting Advanced key-value store...
Okt 07 20:22:52 nexus systemd[1]: Started Advanced key-value store.
Im Logfile "/var/log/redis/redis-server.log" sollte der Eintrag: "Module 'search' loaded from /var/lib/redis/modules/redisearch.so" erscheinen.
Hier der Ausschnitt dazu:
817526:M 07 Oct 2022 20:55:26.760 * <search> Redis version found by RedisSearch : 7.0.5 - oss
817526:M 07 Oct 2022 20:55:26.760 * <search> RediSearch version 99.99.99 (Git=master-f7f5957c)
817526:M 07 Oct 2022 20:55:26.760 * <search> Low level api version 1 initialized successfully
817526:M 07 Oct 2022 20:55:26.760 * <search> concurrent writes: OFF, gc: ON, prefix min length: 2, prefix max expansions: 200, query timeout (ms): 500, timeout policy: return, cursor read size: 1000, cursor max idle (ms): 300000, max doctable size: 1000000, max number of search results: 1000000, search pool size: 20, index pool size: 8,
817526:M 07 Oct 2022 20:55:26.760 * <search> Initialized thread pool!
817526:M 07 Oct 2022 20:55:26.760 * <search> Enabled role change notification
817526:M 07 Oct 2022 20:55:26.760 * Module 'search' loaded from /var/lib/redis/modules/redisearch.so
Redis und RediSearch Modul im Betrieb testen
Der Redis-Server sollten nun laufen, dass RediSearch-Modul erstellt, kopiert und aktiviert sein. Nun testen wir das zur Laufzeit mit Hilfe der "redis-cli":
redis-cli
127.0.0.1:6379>
127.0.0.1:6379> info modules
# Modules
module:name=search,ver=999999,api=1,filters=0,usedby=,using=,options=
# search_version
search_RedisSearch_version:7.0.5
# search_index
search_number_of_indexes:0
# search_fields_statistics
# search_runtime_configurations
search_concurrent_mode:OFF
search_enableGC:ON
search_minimal_term_prefix:2
search_maximal_prefix_expansions:200
search_query_timeout_ms:500
search_timeout_policy:return
search_cursor_read_size:1000
search_cursor_max_idle_time:300000
search_max_doc_table_size:1000000
search_max_search_results:1000000
search_max_aggregate_results:-1
search_search_pool_size:20
search_index_pool_size:8
search_gc_scan_size:100
search_min_phonetic_term_length:3
127.0.0.1:6379>
Wenn das erscheint, habt ihr alles richtig gemacht! Gratulation
Wer sich für Redis und RediSearch 2 interessiert sollte sich folgendes anschauen bzw. durchlesen:
- RediSEARCH - Deliver search and analytics at the speed of transactions
- Introducing RediSearch 2.0
- Getting Started with RediSearch 2.0
Es gibt auch mehrere Clients für fast alle Programmiersprachen (PHP, Ruby, Javascript, Go, etc.):
Fehlersuche
Sollte ein Fehler beim Starten oder Stoppen des Redis-Servers auftreten könnt ihr das über die Befehle:
systemctl status redis-server.service
oder
journalctl -xeu redis-server.service
genau überprüfen. Auch das Redis-Logfile gibt oft eine Antwort auf Fehler:
cat /var/log/redis/redis-server.log
Über Feedback oder Verbesserungen freue ich mich jederzeit. Wenn Euch die Anleitung gefällt klickt bitte auf das "Herz", als kleines Dankeschön
Gruß
Frank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4187625887
Url: https://administrator.de/contentid/4187625887
Ausgedruckt am: 23.11.2024 um 08:11 Uhr
4 Kommentare
Neuester Kommentar
Hallo,
funktioniert aber nur bis zum reboot
Gruß,
Jörg
funktioniert aber nur bis zum reboot
systemctl enable redis-server
Gruß,
Jörg
Hallo,
deshalb schrieb ich es ja: Du hast vergessen, deine Installation bootfest zu machen
Gruß,
Jörg
deshalb schrieb ich es ja: Du hast vergessen, deine Installation bootfest zu machen
Gruß,
Jörg