HINWEIS: Dieses Projekt befindet sich in der Entwicklung. Bitte verlassen Sie sich noch nicht darauf, da es sonst zu Problemen kommen kann.
MinSQL ist eine Protokollsuchmaschine, die auf Einfachheit ausgelegt ist, da für die Interaktion kein SDK erforderlich ist. Die meisten Programmiersprachen und Tools verfügen über eine Form von HTTP-Anfragefunktion (z. B. Curl) und das ist alles, was Sie für die Interaktion mit MinSQL benötigen .
docker build . -t minio/minsql
docker run --rm minio/minsql --help
ODER
make
./minsql --help
Als Speicher-Engine für MinSQL wird eine Instanz von MinIO benötigt. Zur Vereinfachung haben wir ein docker-compose
Beispiel für MinIO und MinSQL.
Um das Projekt auszuführen, müssen Sie die Zugriffsdetails für einen Meta Bucket
bereitstellen, um die gemeinsame Konfiguration zwischen mehreren MinSQL
Instanzen zu speichern. Der Speicherort und der Zugriff darauf sollten beim Starten von MinSQL über Umgebungsvariablen konfiguriert werden.
export MINSQL_METABUCKET_NAME=minsql-meta
export MINSQL_METABUCKET_ENDPOINT=http://localhost:9000
export MINSQL_METABUCKET_ACCESS_KEY=minio
export MINSQL_METABUCKET_SECRET_KEY=minio123
export MINSQL_ROOT_ACCESS_KEY=minsqlaccesskeyx
export MINSQL_ROOT_SECRET_KEY=minsqlsecretkeypleasechangexxxx
./minsql
Gehen Sie dann zu http://127.0.0.1:9999/ui/
und melden Sie sich mit den bereitgestellten MINSQL_ROOT_ACCESS_KEY
und MINSQL_ROOT_SECRET_KEY
an.
Erstellen Sie die Compose-Datei
cat > docker-compose.yml <<EOF
version: '2'
services:
minio-engine:
image: minio/minio
volumes:
- data:/data
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server /data
mc:
image: minio/mc
depends_on:
- minio
entrypoint: >
/bin/sh -c "
echo /usr/bin/mc config host a http://minio-engine:9000 minio minio123;
/usr/bin/mc mb a/minsql-meta;
"
minsql:
image: minio/minsql
depends_on:
- minio
- mc
ports:
- "9999:9999"
environment:
MINSQL_METABUCKET_NAME: minsql-meta
MINSQL_METABUCKET_ENDPOINT: http://minio-engine:9000
MINSQL_ACCESS_KEY: minio
MINSQL_SECRET_KEY: minio123
MINSQL_ROOT_ACCESS_KEY: minsqlaccesskeyx
MINSQL_ROOT_SECRET_KEY: minsqlsecretkeypleasechangexxxx
volumes:
data:
EOF
docker-compose up
Umfeld | Beschreibung |
---|---|
MINSQL_METABUCKET_NAME | Name des Meta-Buckets |
MINSQL_METABUCKET_ENDPOINT | Name des Endpunkts, z. B. http://localhost:9000 |
MINSQL_METABUCKET_ACCESS_KEY | Meta-Bucket-Zugriffsschlüssel |
MINSQL_METABUCKET_SECRET_KEY | Geheimer Meta-Bucket-Schlüssel |
MINSQL_PKCS12_CERT | Optional: Speicherort für ein pkcs12-Zertifikat. |
MINSQL_PKCS12_PASSWORD | Optional: Passwort zum Entsperren des Zertifikats. |
MINSQL_ROOT_ACCESS_KEY | Optional: 16-stelliger Zugriffsschlüssel zum Bootstrap von MinSQL |
MINSQL_ROOT_SECRET_KEY | Optional: 32-stelliger geheimer Schlüssel zum Bootstrap von MinSQL |
Um mit dem Speichern von Protokollen zu beginnen, müssen Sie einen DataStore
, Log
, Token
und eine Authorization
in MinSQL einrichten. Dies kann mithilfe der Admin-REST-APIs erfolgen.
Um unseren Beispielcode zum Laufen zu bringen, werden wir Folgendes tun:
minioplay
Datenspeichermylog
Protokoll Unser Beispieldatenspeicher wird auf play
verweisen, eine Demo-Instanz von MinIO.
curl -X POST
http://127.0.0.1:9999/api/datastores
-H ' Content-Type: application/json '
-d ' {
"bucket" : "play-minsql",
"endpoint" : "https://play.minio.io:9000",
"prefix" : "",
"name" : "minioplay",
"access_key" : "Q3AM3UQ867SPQQA43P2F",
"secret_key" : "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
} '
Wir werden ein Protokoll mylog
hinzufügen, das seinen Inhalt im minioplay
-Datenspeicher speichert.
curl -X POST
http://127.0.0.1:9999/api/logs
-H ' Content-Type: application/json '
-d ' {
"name" : "mylog",
"datastores" : [
"minioplay",
],
"commit_window" : "5s"
} '
Wir werden ein Token mit einem fest codierten Token abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop
generieren
curl -X POST
http://127.0.0.1:9999/api/tokens
-H ' Content-Type: application/json '
-d ' {
"access_key" : "abcdefghijklmnop",
"secret_key" : "abcdefghijklmnopabcdefghijklmnop",
"description" : "test",
"is_admin" : true,
"enabled" : false
} '
Abschließend autorisieren wir unseren neuen Token für den Zugriff auf mylog
curl -X POST
http://127.0.0.1:9999/api/auth/abcdefghijklmnop
-H ' Content-Type: application/json '
-d ' {
"log_name" : "mylog",
"api" : ["search","store"]
} '
Für ein in der Konfiguration definiertes Protokoll mylog
können wir Protokolle auf MinSQL speichern, indem wir einen PUT
auf Ihre MinSQL-Instanz durchführen
curl -X PUT
http://127.0.0.1:9999/mylog/store
-H 'MINSQL-TOKEN: TOKEN1'
-d '10.8.0.1 - - [16/May/2019:23:02:56 +0000] "GET / HTTP/1.1" 400 256 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"'
Sie können mehrere Protokollzeilen, getrennt durch new line
senden
Um Daten aus MinSQL abzurufen, können Sie SQL verwenden. Beachten Sie, dass MinSQL eine Datenschicht und keine Berechnungsschicht ist. Daher werden bestimmte SQL-Anweisungen, die Berechnungen erfordern (SUM, MAX, GROUP BY, JOIN usw.), nicht unterstützt.
Alle Abfrageanweisungen müssen per POST
an Ihre MinSQL-Instanz gesendet werden.
Um alle Protokolle für ein bestimmtes Protokoll auszuwählen, können Sie eine einfache SELECT-Anweisung ausführen
SELECT * FROM mylog
Und senden Sie das per POST an MinSQL
curl -X POST
http://127.0.0.1:9999/search
-H 'MINSQL-TOKEN: TOKEN1'
-d 'SELECT * FROM mylog'
Dadurch erhalten Sie alle für dieses Protokoll gespeicherten Rohprotokollzeilen zurück.
67.164.164.165 - - [24/Jul/2017:00:16:46 +0000] "GET /info.php HTTP/1.1" 200 24564 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
67.164.164.165 - - [24/Jul/2017:00:16:48 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "http://104.236.9.232/info.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
24.26.204.22 - - [24/Jul/2017:00:17:16 +0000] "GET /info.php HTTP/1.1" 200 24579 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
45.23.126.92 - - [24/Jul/2017:00:16:18 +0000] "GET /info.php HTTP/1.1" 200 24589 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
Wir können nur Teile der Daten abrufen, indem wir eine der unterstützten MinSQL-Entitäten verwenden, die mit einem $
-Zeichen beginnen.
Wir können die Daten anhand ihrer Position auswählen, um beispielsweise die erste Spalte zu erhalten, und für die vierte Spalte können wir $1
und $4
verwenden
SELECT $ 1 , $ 4 FROM mylog;
Worauf MinSQL antworten wird
67.164.164.165 [24/Jul/2017:00:16:46
67.164.164.165 [24/Jul/2017:00:16:48
24.26.204.22 [24/Jul/2017:00:17:16
45.23.126.92 [24/Jul/2017:00:16:18
Sie können sehen, dass die Daten unverändert ausgewählt wurden, die ausgewählte Datumsspalte jedoch nicht sauber genug ist. MinSQL bietet andere Entitäten, um damit umzugehen.
MinSQL bietet eine schöne Liste von Entitäten, die dank unseres leistungsstarken Schema-on-Read-Ansatzes das Extrahieren von Datenblöcken aus Ihren Rohdaten einfach machen. Zum Beispiel können wir jede IP in unseren Daten auswählen, indem wir die Entität $ip
verwenden, und jedes Datum, indem wir $date
verwenden.
SELECT $ip, $ date FROM mylog
Worauf MinSQL antworten wird
67.164.164.165 24/Jul/2017
67.164.164.165 24/Jul/2017
24.26.204.22 24/Jul/2017
45.23.126.92 24/Jul/2017
Wenn Ihre Daten mehr als eine IP-Adresse enthalten, können Sie über Positionseinheiten auf die nachfolgenden IPs zugreifen.
SELECT $ip, $ip2, $ip3, $ date FROM mylog
Bitte beachten Sie, dass, wenn für eine Entität keine Positionsnummer angegeben ist, diese standardmäßig auf die erste Position gesetzt wird, in diesem Fall $ip == $ip1
Mit der leistungsstarken Auswahl-Engine von MinSQL können Sie die Daten auch filtern, sodass nur die relevanten Informationen zurückgegeben werden, die Sie aus Ihren Protokollen extrahieren müssen.
Um beispielsweise eine einzelne IP aus Ihren Protokollen herauszufiltern, können Sie sie nach $ip
auswählen
SELECT * FROM mylog WHERE $ip = ' 67.164.164.165 '
Darauf antwortet MinSQL nur mit den übereinstimmenden Zeilen
67.164.164.165 - - [24/Jul/2017:00:16:46 +0000] "GET /info.php HTTP/1.1" 200 24564 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
67.164.164.165 - - [24/Jul/2017:00:16:48 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "http://104.236.9.232/info.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
Sie können Protokollzeilen auswählen, die einen Wert enthalten, indem Sie für jede Entität den LIKE
-Operator oder NOT NULL
verwenden.
SELECT * FROM mylog WHERE $ line LIKE ' Intel ' AND $email IS NOT NULL
Diese Abfrage würde alle Protokollzeilen zurückgeben, die das Wort Intel
enthalten und auch eine E-Mail-Adresse enthalten.
Eine Liste der von MinSQL unterstützten Entitäten: