หมายเหตุ: โครงการนี้อยู่ระหว่างการพัฒนา โปรดอย่าพึ่งพาโครงการนี้เนื่องจากสิ่งต่างๆ อาจพังได้
MinSQL เป็นเครื่องมือค้นหาบันทึกที่ออกแบบมาโดยคำนึงถึงความเรียบง่าย โดยไม่จำเป็นต้องใช้ SDK ในการโต้ตอบกับมัน ภาษาโปรแกรมและเครื่องมือส่วนใหญ่มีความสามารถในการร้องขอ http บางรูปแบบ (เช่น: curl) และนั่นคือทั้งหมดที่คุณต้องมีเพื่อโต้ตอบกับ MinSQL .
docker build . -t minio/minsql
docker run --rm minio/minsql --help
หรือ
make
./minsql --help
จำเป็นต้องมีอินสแตนซ์ของ MiniIO เป็นเครื่องมือจัดเก็บข้อมูลสำหรับ MinSQL เพื่อให้สิ่งต่าง ๆ ง่ายขึ้น เรามีตัวอย่าง 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 | คีย์การเข้าถึง Meta Bucket |
MINSQL_METABUCKET_SECRET_KEY | รหัสลับ Meta Bucket |
MINSQL_PKCS12_CERT | ทางเลือก: ตำแหน่งไปยังใบรับรอง pkcs12 |
MINSQL_PKCS12_PASSWORD | ทางเลือก: รหัสผ่านเพื่อปลดล็อคใบรับรอง |
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 มีรายการเอนทิตีที่ดีที่ทำให้การแยกส่วนข้อมูลจากข้อมูลดิบของคุณเป็นเรื่องง่าย ด้วยวิธี Schema on Read อันทรงพลังของเรา ตัวอย่างเช่น เราสามารถเลือก 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 :