ПРИМЕЧАНИЕ. Этот проект находится в стадии разработки, поэтому пока не полагайтесь на него, так как что-то может сломаться.
MinSQL — это система поиска по журналам, разработанная с учетом простоты, поскольку для взаимодействия с ней не требуется SDK, большинство языков программирования и инструментов имеют ту или иную форму HTTP-запросов (например, Curl), и это все, что вам нужно для взаимодействия с MinSQL. .
docker build . -t minio/minsql
docker run --rm minio/minsql --help
ИЛИ
make
./minsql --help
В качестве механизма хранения для MinSQL необходим экземпляр MinIO. Чтобы упростить задачу, у нас есть пример docker-compose
для MinIO и MinSQL.
Чтобы запустить проект, вам необходимо предоставить данные доступа к Meta Bucket
для хранения общей конфигурации между несколькими экземплярами MinSQL
. Местоположение и доступ к нему должны быть настроены с помощью переменных среды при запуске 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
Затем перейдите по адресу http://127.0.0.1:9999/ui/
и войдите в систему, используя предоставленные MINSQL_ROOT_ACCESS_KEY
и MINSQL_ROOT_SECRET_KEY
.
Создайте файл компоновки
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
Среда | Описание |
---|---|
MINSQL_METABUCKET_NAME | Название мета-корзины |
MINSQL_METABUCKET_ENDPOINT | Имя конечной точки, например: http://localhost:9000 |
MINSQL_METABUCKET_ACCESS_KEY | Ключ доступа к мета-ведру |
MINSQL_METABUCKET_SECRET_KEY | Секретный ключ Meta Bucket |
MINSQL_PKCS12_CERT | Необязательно: расположение сертификата pkcs12. |
MINSQL_PKCS12_ПАРОЛЬ | Необязательно: пароль для разблокировки сертификата. |
MINSQL_ROOT_ACCESS_KEY | Необязательно: 16-значный ключ доступа для загрузки minsql. |
MINSQL_ROOT_SECRET_KEY | Необязательно: 32-значный секретный ключ для загрузки minsql. |
Чтобы начать хранить журналы, вам необходимо настроить DataStore
, Log
, Token
и Authorization
в MinSQL. Это можно сделать с помощью REST API администратора.
Чтобы запустить наш пример кода, мы собираемся:
minioplay
mylog
Наш образец хранилища данных будет указывать на play
— демонстрационный экземпляр 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"
} '
Мы собираемся добавить журнал mylog
, который будет хранить свое содержимое в хранилище данных 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"
} '
Мы собираемся сгенерировать токен с жестко запрограммированным токеном 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
} '
Наконец, мы собираемся авторизовать наш новый токен для доступа к 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"]
} '
Для журнала mylog
, определенного в конфигурации, мы можем хранить журналы в MinSQL, выполнив PUT
в ваш экземпляр 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"'
Вы можете отправить несколько строк журнала, разделенных new line
Чтобы получить данные из MinSQL, вы можете использовать SQL. Обратите внимание, что MinSQL — это уровень данных, а не уровень вычислений, поэтому некоторые операторы SQL, требующие вычислений (SUM, MAX, GROUP BY, JOIN и т. д.), не поддерживаются.
Все операторы запроса должны быть отправлены через POST
на ваш экземпляр MinSQL.
Чтобы выбрать все журналы для определенного журнала, вы можете выполнить простой оператор SELECT.
SELECT * FROM mylog
И отправьте это в MinSQL через POST.
curl -X POST
http://127.0.0.1:9999/search
-H 'MINSQL-TOKEN: TOKEN1'
-d 'SELECT * FROM mylog'
Это вернет вам все необработанные строки журнала, сохраненные для этого журнала.
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"
Мы можем получить только часть данных, используя любой из поддерживаемых MinSQL объектов, которые начинаются со знака $
.
Мы можем выбирать данные по их положению, например, чтобы получить первый столбец, а четвертый мы можем использовать $1
и $4
SELECT $ 1 , $ 4 FROM mylog;
На что MinSQL ответит
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
Вы можете видеть, что данные были выбраны как есть, однако выбранный столбец даты недостаточно чист, MinSQL предоставляет другие объекты для решения этой проблемы.
MinSQL предоставляет хороший список сущностей, которые упрощают извлечение фрагментов данных из необработанных данных благодаря нашему мощному подходу «Схема при чтении». Например, мы можем выбрать любой IP-адрес в наших данных, используя объект $ip
и любую дату, используя $date
.
SELECT $ip, $ date FROM mylog
На что MinSQL ответит
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
Если ваши данные содержат более одного IP-адреса, вы можете получить доступ к последующим IP-адресам, используя позиционные объекты.
SELECT $ip, $ip2, $ip3, $ date FROM mylog
Обратите внимание: если для объекта не указан позиционный номер, по умолчанию будет установлена первая позиция, в этом случае $ip == $ip1
Используя мощный механизм выбора MinSQL, вы также можете фильтровать данные, чтобы возвращалась только та информация, которую вам необходимо извлечь из журналов.
Например, чтобы отфильтровать один IP-адрес из ваших журналов, вы можете выбрать его по $ip
SELECT * FROM mylog WHERE $ip = ' 67.164.164.165 '
На что MinSQL ответит только совпадающими строками
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"
Вы можете выбрать строки журнала, содержащие значение, используя оператор LIKE
или NOT NULL
для любой сущности.
SELECT * FROM mylog WHERE $ line LIKE ' Intel ' AND $email IS NOT NULL
Этот запрос вернет все строки журнала, содержащие слово Intel
, которые также содержат адрес электронной почты.
Список поддерживаемых MinSQL сущностей: