NOTA: Este proyecto está en desarrollo, no dependa de él todavía ya que las cosas pueden fallar.
MinSQL es un motor de búsqueda de registros diseñado teniendo en cuenta la simplicidad en la medida en que no se necesita ningún SDK para interactuar con él, la mayoría de los lenguajes y herramientas de programación tienen algún tipo de capacidad de solicitud http (es decir, curl) y eso es todo lo que necesita para interactuar con MinSQL. .
docker build . -t minio/minsql
docker run --rm minio/minsql --help
O
make
./minsql --help
Se necesita una instancia de MinIO como motor de almacenamiento para MinSQL. Para facilitar las cosas, tenemos un ejemplo docker-compose
para MinIO y MinSQL.
Para ejecutar el proyecto, debe proporcionar los detalles de acceso a un Meta Bucket
para almacenar la configuración compartida entre múltiples instancias MinSQL
; la ubicación y el acceso al mismo deben configurarse a través de variables de entorno al iniciar 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
Luego vaya a http://127.0.0.1:9999/ui/
e inicie sesión con MINSQL_ROOT_ACCESS_KEY
y MINSQL_ROOT_SECRET_KEY
proporcionados.
Crear el archivo de redacción
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
Ambiente | Descripción |
---|---|
MINSQL_METABUCKET_NAME | Nombre del meta depósito |
MINSQL_METABUCKET_ENDPOINT | Nombre del punto final, por ejemplo: http://localhost:9000 |
MINSQL_METABUCKET_ACCESS_KEY | Clave de acceso al meta depósito |
MINSQL_METABUCKET_SECRET_KEY | Clave secreta de Meta Bucket |
MINSQL_PKCS12_CERT | Opcional: ubicación de un certificado pkcs12. |
MINSQL_PKCS12_PASSWORD | Opcional: contraseña para desbloquear el certificado. |
MINSQL_ROOT_ACCESS_KEY | Opcional: clave de acceso de 16 dígitos para iniciar minsql |
MINSQL_ROOT_SECRET_KEY | Opcional: clave secreta de 32 dígitos para iniciar minsql |
Para comenzar a almacenar registros, necesita configurar un DataStore
, Log
, Token
y una Authorization
en MinSQL; esto se puede hacer utilizando las API REST del administrador.
Para poner en marcha nuestro código de muestra, vamos a:
minioplay
mylog
Nuestro almacén de datos de muestra apuntará a play
, una instancia de demostración 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"
} '
Vamos a agregar un registro mylog
que almacena su contenido en el almacén de datos 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"
} '
Vamos a generar un token con un token codificado 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
} '
Finalmente, vamos a autorizar que nuestro nuevo token acceda 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"]
} '
Para un registro mylog
definido en la configuración, podemos almacenar registros en MinSQL realizando un PUT
en su instancia de 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"'
Puede enviar varias líneas de registro separadas por new line
Para obtener datos de MinSQL puedes usar SQL. Tenga en cuenta que MinSQL es una capa de datos y no una capa de cálculo, por lo tanto, ciertas declaraciones SQL que necesitan cálculos (SUM, MAX, GROUP BY, JOIN, etc...) no son compatibles.
Todas las declaraciones de consulta deben enviarse mediante POST
a su instancia de MinSQL.
Para seleccionar todos los registros para un registro en particular, puede realizar una instrucción SELECT simple
SELECT * FROM mylog
Y enviar eso a MinSQL vía POST
curl -X POST
http://127.0.0.1:9999/search
-H 'MINSQL-TOKEN: TOKEN1'
-d 'SELECT * FROM mylog'
Esto le devolverá todas las líneas de registro sin procesar almacenadas para ese registro.
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"
Podemos obtener solo partes de los datos utilizando cualquiera de las entidades MinSQL admitidas, que comienzan con el signo $
.
Podemos seleccionar de los datos por su posición, por ejemplo para obtener la primera columna y la cuarta podemos usar $1
y $4
SELECT $ 1 , $ 4 FROM mylog;
A lo que MinSQL responderá
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
Puede ver que los datos se seleccionaron tal cual, sin embargo, la columna de fecha seleccionada no está lo suficientemente limpia, MinSQL proporciona otras entidades para lidiar con esto.
MinSQL proporciona una buena lista de entidades que facilitan la extracción de fragmentos de datos de sus datos sin procesar gracias a nuestro poderoso enfoque de esquema en lectura. Por ejemplo, podemos seleccionar cualquier ip en nuestros datos usando la entidad $ip
y cualquier fecha usando $date
.
SELECT $ip, $ date FROM mylog
A lo que MinSQL responderá
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 sus datos contienen más de una dirección IP, puede acceder a las IP posteriores utilizando entidades posicionales.
SELECT $ip, $ip2, $ip3, $ date FROM mylog
Tenga en cuenta que si no se especifica ningún número de posición en una entidad, se utilizará de forma predeterminada la primera posición, en este caso $ip == $ip1
Al utilizar el potente motor de selección de MinSQL, también puede filtrar los datos para que solo se devuelva la información relevante que necesita extraer de sus registros.
Por ejemplo, para filtrar una sola IP de sus registros, puede seleccionar $ip
SELECT * FROM mylog WHERE $ip = ' 67.164.164.165 '
A lo que MinSQL responderá sólo con las líneas coincidentes
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"
Puede seleccionar líneas de registro que contengan un valor utilizando el operador LIKE
o NOT NULL
para cualquier entidad.
SELECT * FROM mylog WHERE $ line LIKE ' Intel ' AND $email IS NOT NULL
Esta consulta devolvería todas las líneas de registro que contienen la palabra Intel
y que también contienen una dirección de correo electrónico.
Una lista de entidades admitidas por MinSQL: