注意:該專案正在開發中,請不要依賴它,因為事情可能會崩潰。
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 支援的實體清單: