注意:该项目正在开发中,请不要依赖它,因为事情可能会崩溃。
MinSQL 是一个日志搜索引擎,设计时考虑到简单性,无需 SDK 即可与之交互,大多数编程语言和工具都具有某种形式的 http 请求功能(即:curl),这就是与 MinSQL 交互所需的全部内容。
docker build . -t minio/minsql
docker run --rm minio/minsql --help
或者
make
./minsql --help
需要一个 MinIO 实例作为 MinSQL 的存储引擎。为了让事情变得更简单,我们为 MinIO 和 MinSQL 提供了一个docker-compose
示例。
要运行该项目,您需要提供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 | 元存储桶密钥 |
MINSQL_PKCS12_CERT | 可选: pkcs12 证书的位置。 |
MINSQL_PKCS12_PASSWORD | 可选:解锁证书的密码。 |
MINSQL_ROOT_ACCESS_KEY | 可选:引导 minsql 的 16 位访问密钥 |
MINSQL_ROOT_SECRET_KEY | 可选:引导 minsql 的 32 位密钥 |
要开始存储日志,您需要在 MinSQL 上设置DataStore
、 Log
、 Token
和Authorization
,这可以使用管理 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
并通过 POST 将其发送到 MinSQL
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 支持的实体列表: