frank
Goto Top

Ubuntu: Redisearch v2 Modul für Redis aus dem Source Code selbst bauen

article-picture
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.


back-to-topWarum 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

back-to-topVorbereitung, 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

back-to-topQuellcode 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).

back-to-topAbhä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

back-to-topBuild 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

back-to-topRedis-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

back-to-topRediSearch 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.

back-to-topRediSearch 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  

back-to-topRedis 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 face-smile

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.):


back-to-topFehlersuche


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 face-smile

Gruß
Frank

Content-Key: 4187625887

Url: https://administrator.de/contentid/4187625887

Printed on: April 26, 2024 at 17:04 o'clock

Mitglied: 117471
117471 Dec 02, 2022 at 18:13:17 (UTC)
Goto Top
Hallo,

funktioniert aber nur bis zum reboot face-wink

systemctl enable redis-server

Gruß,
Jörg
Member: Frank
Frank Dec 06, 2022 at 10:26:07 (UTC)
Goto Top
Zitat von @117471:

Hallo,

funktioniert aber nur bis zum reboot face-wink

systemctl enable redis-server

Gruß,
Jörg

Hallo @117471,

da irrst du dich, "systemctl enable" sorgt dafür das es auch nach dem Reboot gestartet wird.
Schau dir dazu mal folgende Seite an: https://wiki.ubuntuusers.de/systemd/systemctl/

Gruß
Frank
Mitglied: 117471
117471 Dec 06, 2022 at 10:35:08 (UTC)
Goto Top
Hallo,

deshalb schrieb ich es ja: Du hast vergessen, deine Installation bootfest zu machen face-wink

Gruß,
Jörg
Member: Frank
Frank Dec 06, 2022 updated at 10:58:49 (UTC)
Goto Top
Zitat von @117471:

Hallo,

deshalb schrieb ich es ja: Du hast vergessen, deine Installation bootfest zu machen face-wink

Gruß,
Jörg

Da es ja per "apt-get install redis" installiert wurde gehe ich davon aus, dass der Dienst bereits "enable" ist. Das habe ich jetzt aber noch nicht geprüft. Aber klar das "enable" kann ich noch in die Anleitung aufnehmen.
Sorry, hatte es beim ersten Mal übersehen, dass ich es oben gar nicht aufgeführt hatte. Ich habe es in der Anleitung ergänzt. Danke.

Gruß
Frank