ubuntuusers.de

indexierte Suche mit MySQL vs. Inhaltssuche mit Python3

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

halloICKEbins

Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Mahlzeit,

Ich wurde gerne mal eure Meinung zur Umsetzung einer Suche wissen:

Habe ca. 1000 Dateien (bis jetzt) mit jeweils 1.700 Einträge pro Datei. Die Datei enthält pro Zeile exemplarisch die unten genannten Einträge:

Mar 20 08:08:45 hostname feb FW: so-0/1/0.0   A icmp 192.168.207.222 80.90.100.290:38273 [0xs9]

Ich hätte jetzt die Möglichkeit die Dateien in einen MySQL-DB zu schreiben (pro Datei eine Tabelle mit 2 Spalten für Zeilennummer und Inhalt der Zeile) um dann über eine indexierte Suche auf die zweite Spalte, zu suchen. Habe gelesen, dass bei 100.000 Einträgen ca. 17 Vergleiche angestellt werden müssen.

Zweite Möglichkeit wäre eine Suche über Python3 in den Dateien selber (siehe Quellcode) und das Ergebnis dann in eine DB bzw. Datei übergeben.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import os

path='/files/logs/'
searchstring = "192.168.207.222" # oder "icmp" oder "38273"

for filename in os.listdir(path):
    with open(path + filename, "r") as f:
        searchlines = f.readlines()
    for i, line in enumerate(searchlines):
        if searchstring in line: 
            for l in searchlines[i:i+1]:
                print (filename, i + 1, l)
                while True:
                    location = l.find(searchstring, location + 1)
                    if location == -1:
                        break
                    print (location) 

Problem an der zweiten Möglichkeit besteht darin, dass ein Cronjob (Script) die Auslösung mittels HTML (PHP) zum Beispiel sekündlich überwachen müsste um Wartezeiten bei der Suche des auslösenden Nutzers zu verhindern. Vielleicht gibt es hier auch andere Möglichkeiten???

Die dritte Möglichkeit über PHP in den Dateien zu suchen habe ich schon selber mal umgesetzt... funktionierte auch ganz gut bei wenigen Dateien...wurde jetzt aber durch die Anzahl der Dateien relativ unrentabel!!!

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

@halloICKEbins: Also das mit der Datenbank klingt sehr falsch. Zum einen das Du 1000 Tabellen anlegen willst die alle die gleiche Struktur haben und zum zweiten das Du Textdateien als zwei Spalten mit Zeilennummer als Index und Zeileninhalt als zweite Spalte speichern möchtest.

Welchen Vorteil soll das bringen und mit welcher Magie willst Du da schneller in den Werten in der zweiten Tabelle suchen als durch serielles lesen der Textdateien und suchen in den Zeilen? Und was haben die 100.000 Einträge, die Du ja gar nicht hast, mit 17 was für Vergleichen zu tun? Da ist doch sicher von der Suche in einem Index die Rede, das sind die Zeilennummern, wonach Du aber gar nicht suchst. (Das würde allerdings wenigstens ansatzweise Sinn machen um solche Dateien in eine relationale Datenbanktabelle zu stecken.)

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Wächst die Zahl noch? Pro Tag eine Datei? Hast Du die typischen Suchen schon alle genannt?

Wieso hast Du überhaupt 1000 Dateien?

Lass uns überschlagen, 1000 * 1700 ist ca. 2 Mio. Bei 100 Zeichen pro Zeile also 200 Mio. Bytes. Die sind mit grep in weniger als 1s durchsucht (bei einer Datei) - auf einem SSD-Drive.

Wie schnell soll es werden? Bei 1000 Dateien müsstest Du mal probieren, wie lange ein

1
grep 192.168.207.222 /var/log/foobar*.log 

dauert, oder wie die Dateien auch heißen und wo sie liegen.

Bei massig output dauert das Schreiben auf den Bildschirm viel länger, als die Suche, also probier etwas mit wenig Resultaten.

Bei mir bei 150 MB 0.2 s.

encbladexp Team-Icon

Ehemaliger
Avatar von encbladexp

Anmeldungsdatum:
16. Februar 2007

Beiträge: 17524

Vor allem ist die Frage nach was du wirklich Suchen willst. Willst du nur nach einem Teil vom Text suchen, oder könnte man die Dateien Parsen und für die Datenbank aufbereiten? Das kann nämlich, gerade wenn öfters Auswertungen/Suchen laufen, erheblichen Einfluss auf die Geschwinigkeit haben.

Wenn du nur "ab und an" was machen willst, dann ist grep effizient genug. Aber je spezifischer und häufiger du Informationen brauchst, desto mehr performt eine Datenbank, wenn deren Struktur passt.

mfg Stefan

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Es kann auch sinnvoll sein, in 2 Dateien zu suchen, in einer großen von Gestern bis Bismark, und einer kleinen, die wächst, von heute. Bei der von gestern kann der Cache die Datei die ganze Zeit im Speicher halten.

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Dann hatte ich ja schonmal eine Antwort ob MySQL oder nicht.

Aber gibt es eine andere Möglichkeit der Initiierung durch den Nutzers außer über ein Cronjob - welcher zum Beispiel in die DB schaut ob die Suche gestartet werden soll ???

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Mir ist das Szenario noch nicht so ganz klar - woher kommen die Daten, was davon ist interessant, was soll der User auf welchem Wege darin suchen können?

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Der Nutzer soll alles im String suchen können ... Die Dateien sind Logs, welche ca. alle 4 Stunden neu abgespeichert werden

encbladexp Team-Icon

Ehemaliger
Avatar von encbladexp

Anmeldungsdatum:
16. Februar 2007

Beiträge: 17524

Woher kommen die Logs? Lass dir doch nicht alles aus der Nase ziehen 😉

mfg Stefan

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Sind pflogs von OpenBSD-Firewalls...der komplette Eintrag ist halt wichtig und ich möchte halt nach allem filtern

encbladexp Team-Icon

Ehemaliger
Avatar von encbladexp

Anmeldungsdatum:
16. Februar 2007

Beiträge: 17524

Gut, aber für Logfiles gibt es dedizierte Softwarelösungen. Logstash ist eine davon, gibt aber noch mehr am Markt.

mfg Stefan

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Ich finde Du schuldest uns noch eine Antwort, wie schnell es jetzt ist und wie schnell es werden soll.

Zur Frage SSD oder Festplatte aus den 80ern hast Du Dich auch nicht geäußert.

Auch nicht dazu, wieso es so viele Dateien sein sollen.

halloICKEbins schrieb:

Aber gibt es eine andere Möglichkeit der Initiierung durch den Nutzers außer über ein Cronjob - welcher zum Beispiel in die DB schaut ob die Suche gestartet werden soll ???

Wenn die Dateien minütlich oder häufiger aktualisiert werden - bzw. anders gesagt: Man startet cronjobs nicht minütlich. Man kann beim Systemstart ein Script starten, das endlos läuft, und bei jeder Runde eine Sekunde oder mehr oder weniger pausiert, damit der Rechner währenddessen anderes tun kann.

1
2
3
4
5
while true 
do 
  echo "hier die wahre Arbeit"  
  sleep 1
done 

Nur verstehe ich noch nicht, wieso das überhaupt ständig arbeiten soll. Der User will nach 192.168.4.5 suchen und Du bekommst diese Information. Dann suchst Du danach. Was willst Du vorab tun?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13204

halloICKEbins schrieb:

Sind pflogs von OpenBSD-Firewalls...der komplette Eintrag ist halt wichtig und ich möchte halt nach allem filtern

Dann ist möglicherweise eine Spalte für den Text nicht so verkehrt - kombiniert mit einem Volltextindex. SQLite kann das und PostgreSQL auch z.B. Wenn, ja wenn, die direkte Suche mit grep und Co. nicht schnell genug ist.

Ich hätte allerdings auch gerne noch eine Beschreibung des Szenarios, u.a. solcher Fragen wie viele Anfragen erwartet werden, wie groß sind die Logs, wie soll aufgeräumt werden usw.

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Dann versuche ich mal weiter auszuholen...und das Gesamtkonstrukt zu erläutern...

In "meiner" Umgebung gibt es mehrere Firewalls auf OpenBSD-Basis, mehrere L2-Cisco-Switche und L3-Cisco-Router...Die meisten "meiner" OpenBSD-Firewalls generieren mittels "logrotate" ca. aller 4 Stunden eine pflog.0 (ca. 1700 Zeilen) pro Gerät...diese werden auf einem Ubuntu-Server mittels push-Prinzip zentral gesammelt und mehreren Nutzern mittels PHP im Ordner (/www/html/.../pflogsfiles) bereitgestellt...des weiteren werden von den L2/L3-Geräten diverse weitere Informationen (arp, vlan, status interface, usw.) gesammelt und ebenfalls auf der Informationsseite dargestellt.

Der Nutzer soll eine zentrale Informationsquelle haben und über diese natürlich auch seine Suche steuern können...ohne Ahnung von der Konsole haben zu müssen und nicht zu switchen zwischen PHP, Shell usw.

@user_unknown:

Nur verstehe ich noch nicht, wieso das überhaupt ständig arbeiten soll. Der User will nach 192.168.4.5 suchen und Du bekommst diese Information. Dann suchst Du danach. Was willst Du vorab tun?

Ich weiß ja nicht, wann der Nutzer was suchen will, also muss ich ja irgendwie die Anfrage abfangen...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

halloICKEbins schrieb:

Ich weiß ja nicht, wann der Nutzer was suchen will, also muss ich ja irgendwie die Anfrage abfangen...

Gut, und das machst Du in einer Endlosschleife, die einmal gestartet werden muss. Was soll da ein cronjob?

PHP ist aber nicht mein Fall. Die Geschwindigkeit von Grep sollte aber einen Anhaltspunkt bieten, was möglich ist.

Antworten |