REMARQUE : ce projet est en cours de développement, veuillez ne pas en dépendre pour l'instant car des choses pourraient se briser.
MinSQL est un moteur de recherche de journaux conçu dans un souci de simplicité dans la mesure où aucun SDK n'est nécessaire pour interagir avec lui, la plupart des langages et outils de programmation ont une certaine forme de capacité de requête http (c'est-à-dire : curl) et c'est tout ce dont vous avez besoin pour interagir avec MinSQL. .
docker build . -t minio/minsql
docker run --rm minio/minsql --help
OU
make
./minsql --help
Une instance de MinIO est nécessaire comme moteur de stockage pour MinSQL. Pour simplifier les choses, nous avons un exemple docker-compose
pour MinIO et MinSQL.
Pour exécuter le projet, vous devez fournir les détails d'accès à un Meta Bucket
pour stocker la configuration partagée entre plusieurs instances MinSQL
. L'emplacement et l'accès à celui-ci doivent être configurés via des variables d'environnement lors du démarrage de MinSQL.
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
Ensuite, allez sur http://127.0.0.1:9999/ui/
et connectez-vous avec les MINSQL_ROOT_ACCESS_KEY
et MINSQL_ROOT_SECRET_KEY
fournis.
Créer le fichier de composition
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
Environnement | Description |
---|---|
MINSQL_METABUCKET_NAME | Nom du méta-bucket |
MINSQL_METABUCKET_ENDPOINT | Nom du point de terminaison, ex : http://localhost:9000 |
MINSQL_METABUCKET_ACCESS_KEY | Clé d'accès au méta-seau |
MINSQL_METABUCKET_SECRET_KEY | Clé secrète du méta-seau |
MINSQL_PKCS12_CERT | Facultatif : emplacement vers un certificat pkcs12. |
MINSQL_PKCS12_PASSWORD | Facultatif : mot de passe pour déverrouiller le certificat. |
MINSQL_ROOT_ACCESS_KEY | Facultatif : clé d'accès à 16 chiffres pour amorcer minsql |
MINSQL_ROOT_SECRET_KEY | Facultatif : clé secrète à 32 chiffres pour amorcer minsql |
Pour commencer à stocker les journaux, vous devez configurer un DataStore
, Log
, Token
et une Authorization
sur MinSQL, cela peut être fait à l'aide des API REST d'administration.
Pour lancer notre exemple de code, nous allons :
minioplay
mylog
Notre exemple de banque de données pointera vers play
, une instance de démonstration de 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"
} '
Nous allons ajouter un journal mylog
qui stocke son contenu sur la banque de données minioplay
.
curl -X POST
http://127.0.0.1:9999/api/logs
-H ' Content-Type: application/json '
-d ' {
"name" : "mylog",
"datastores" : [
"minioplay",
],
"commit_window" : "5s"
} '
Nous allons générer un token avec un token codé en dur abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop
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
} '
Enfin, nous allons autoriser notre nouveau token à accéder 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"]
} '
Pour un journal mylog
défini sur la configuration, nous pouvons stocker les journaux sur MinSQL en effectuant un PUT
sur votre instance MinSQL
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"'
Vous pouvez envoyer plusieurs lignes de journal séparées par new line
Pour extraire des données de MinSQL, vous pouvez utiliser SQL. Notez que MinSQL est une couche de données et non une couche de calcul, donc certaines instructions SQL nécessitant des calculs (SUM, MAX, GROUP BY, JOIN, etc...) ne sont pas prises en charge.
Toutes les instructions de requête doivent être envoyées via POST
à votre instance MinSQL.
Pour sélectionner tous les journaux d'un journal particulier, vous pouvez effectuer une simple instruction SELECT
SELECT * FROM mylog
Et envoyez-le à MinSQL via POST
curl -X POST
http://127.0.0.1:9999/search
-H 'MINSQL-TOKEN: TOKEN1'
-d 'SELECT * FROM mylog'
Cela vous renverra toutes les lignes de journal brutes stockées pour ce journal.
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"
Nous ne pouvons obtenir qu'une partie des données en utilisant l'une des entités MinSQL prises en charge, qui commencent par le signe $
.
Nous pouvons sélectionner les données par leur position, par exemple pour obtenir la première colonne et la quatrième nous pouvons utiliser $1
et $4
SELECT $ 1 , $ 4 FROM mylog;
À quoi MinSQL répondra
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
Vous pouvez voir que les données ont été sélectionnées telles quelles, mais la colonne de date sélectionnée n'est pas assez propre, MinSQL fournit d'autres entités pour gérer cela.
MinSQL fournit une belle liste d'entités qui facilitent l'extraction de morceaux de données à partir de vos données brutes grâce à notre puissante approche Schema on Read. Par exemple, nous pouvons sélectionner n'importe quelle adresse IP dans nos données en utilisant l'entité $ip
et n'importe quelle date en utilisant $date
.
SELECT $ip, $ date FROM mylog
À quoi MinSQL répondra
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
Si vos données contiennent plus d'une adresse IP, vous pouvez accéder aux adresses IP suivantes à l'aide d'entités positionnelles.
SELECT $ip, $ip2, $ip3, $ date FROM mylog
Veuillez noter que si aucun numéro de position n'est spécifié sur une entité, celle-ci sera par défaut la première position, dans ce cas $ip == $ip1
À l'aide du puissant moteur de sélection de MinSQL, vous pouvez également filtrer les données afin que seules les informations pertinentes que vous devez extraire de vos journaux soient renvoyées.
Par exemple, pour filtrer une seule adresse IP de vos journaux, vous pouvez sélectionner par $ip
SELECT * FROM mylog WHERE $ip = ' 67.164.164.165 '
À quoi MinSQL répondra uniquement avec les lignes correspondantes
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"
Vous pouvez sélectionner des lignes de journal contenant une valeur en utilisant l'opérateur LIKE
ou NOT NULL
pour n'importe quelle entité.
SELECT * FROM mylog WHERE $ line LIKE ' Intel ' AND $email IS NOT NULL
Cette requête renverrait toutes les lignes de journal contenant le mot Intel
qui contiennent également une adresse e-mail.
Une liste des entités prises en charge par MinSQL :