Danh sách bài viết trong series Làm Chủ ELK Stack
- Bài 1: ELK Stack Là Gì? Cài Đặt Và Cấu Hình Cơ Bản
- Bài 2: Thu Thập Dữ Liệu Với Logstash
- Bài 3: Tìm Kiếm Và Phân Tích Dữ Liệu Với Elasticsearch
- Bài 4: Trực Quan Hóa Dữ Liệu Với Kibana
- Bài 5: Giám Sát Hệ Thống Với ELK Stack Trong DevOps
- Bài 6: Bảo Mật Và Tối Ưu ELK Stack
Giới Thiệu Về Elasticsearch Trong ELK Stack
Elasticsearch là “trái tim” của ELK Stack, chịu trách nhiệm lưu trữ, tìm kiếm, và phân tích dữ liệu với tốc độ cao. Trong DevOps, Elasticsearch được sử dụng để xử lý log, metric, và dữ liệu thời gian thực, giúp phát hiện sự cố nhanh chóng và hỗ trợ ra quyết định. Ở bài trước, bạn đã học cách dùng Logstash để thu thập và gửi log đến Elasticsearch. Bây giờ, chúng ta sẽ đi sâu vào cách tạo index, thực hiện truy vấn, và phân tích dữ liệu hiệu quả với Elasticsearch, đảm bảo bạn làm chủ công cụ này trong quy trình DevOps.
Yêu Cầu Trước Khi Bắt Đầu
- Đã cài đặt và cấu hình ELK Stack (Bài 1), Logstash đang gửi dữ liệu đến Elasticsearch (Bài 2).
- Có quyền truy cập terminal với Elasticsearch chạy trên
localhost:9200
. - Dữ liệu đã được gửi đến Elasticsearch (VD: index
auth-log-*
từ Bài 2).
Hướng Dẫn Tìm Kiếm Và Phân Tích Với Elasticsearch
Bước 1: Tạo Index Và Mapping
Index là nơi Elasticsearch lưu trữ dữ liệu, tương tự bảng trong cơ sở dữ liệu. Mapping định nghĩa cấu trúc dữ liệu (các trường và kiểu dữ liệu). Tạo index thủ công để kiểm soát cấu trúc:
curl -X PUT "localhost:9200/my-app-log" -H 'Content-Type: application/json' -d '
{
"mappings": {
"properties": {
"timestamp": { "type": "date" },
"message": { "type": "text" },
"level": { "type": "keyword" },
"source": { "type": "keyword" }
}
}
}'
timestamp
: Lưu thời gian log.message
: Nội dung log (text để tìm kiếm toàn văn).level
vàsource
: Keyword để lọc chính xác.
Kiểm tra index:
curl -X GET "localhost:9200/my-app-log?pretty"
Nếu thấy JSON với thông tin mapping, index đã tạo thành công.
Bước 2: Gửi Dữ liệu Vào Index
Sửa file cấu hình Logstash từ Bài 2 (/etc/logstash/conf.d/logstash.conf
) để gửi dữ liệu vào index mới:
input {
file {
path => "/var/log/myapp.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" }
}
mutate {
add_field => { "source" => "myapp" }
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "my-app-log"
}
stdout { codec => rubydebug }
}
Tạo file log mẫu /var/log/myapp.log
:
sudo sh -c 'echo "2024-03-02T10:00:00 INFO Application started" >> /var/log/myapp.log'
sudo sh -c 'echo "2024-03-02T10:01:00 ERROR Failed to connect DB" >> /var/log/myapp.log'
Khởi động lại Logstash:
sudo systemctl restart logstash
Kiểm tra dữ liệu:
curl -X GET "localhost:9200/my-app-log/_search?pretty"
Bạn sẽ thấy JSON chứa các bản ghi log vừa gửi.
Bước 3: Thực Hiện Truy Vấn Cơ Bản
Elasticsearch hỗ trợ nhiều loại truy vấn để tìm kiếm và phân tích. Dưới đây là một số ví dụ phổ biến:
- Truy vấn Match (Tìm kiếm toàn văn):
curl -X GET "localhost:9200/my-app-log/_search?pretty" -H 'Content-Type: application/json' -d ' { "query": { "match": { "message": "failed" } } }'
Kết quả trả về bản ghi chứa “Failed to connect DB”.
- Truy vấn Term (Lọc chính xác):
curl -X GET "localhost:9200/my-app-log/_search?pretty" -H 'Content-Type: application/json' -d ' { "query": { "term": { "level": "ERROR" } } }'
Lọc các log có mức độ
ERROR
. - Truy vấn Range (Lọc theo thời gian):
curl -X GET "localhost:9200/my-app-log/_search?pretty" -H 'Content-Type: application/json' -d ' { "query": { "range": { "timestamp": { "gte": "2024-03-02T10:00:00", "lte": "2024-03-02T10:01:00" } } } }'
Lọc log trong khoảng thời gian cụ thể.
Bước 4: Phân Tích Dữ Liệu Với Aggregation
Aggregation cho phép tổng hợp dữ liệu để phân tích. Ví dụ: Đếm số log theo mức độ level
:
curl -X GET "localhost:9200/my-app-log/_search?pretty" -H 'Content-Type: application/json' -d '
{
"aggs": {
"by_level": {
"terms": {
"field": "level"
}
}
},
"size": 0
}'
Kết quả sẽ hiển thị số lượng log INFO
và ERROR
.

Bảng So Sánh Các Loại Truy Vấn Trong Elasticsearch
Loại Truy Vấn | Mô Tả | Ví Dụ Ứng Dụng | Ưu Điểm | Nhược Điểm |
---|---|---|---|---|
Match | Tìm kiếm toàn văn | Tìm log chứa “error” | Linh hoạt, dễ dùng | Không chính xác tuyệt đối |
Term | Lọc chính xác theo giá trị | Lọc log mức độ ERROR |
Nhanh, chính xác | Không tìm kiếm mờ |
Range | Lọc theo khoảng giá trị | Lọc log trong 1 giờ cụ thể | Hữu ích cho thời gian | Cần định dạng đúng |
Bool | Kết hợp nhiều truy vấn | Tìm log ERROR từ 10h-11h |
Rất linh hoạt | Cú pháp phức tạp |
Mẹo Tối Ưu Hóa Truy Vấn Và Phân Tích
- Định Nghĩa Mapping Rõ Ràng: Đảm bảo các trường (VD:
level
làkeyword
) để truy vấn nhanh hơn. - Sử Dụng Index Đúng: Tạo index theo thời gian (VD:
my-app-log-2024.03.02
) để dễ quản lý. - Kiểm Tra Hiệu Suất: Dùng
_search
vớiprofile: true
để phân tích tốc độ truy vấn.
Lợi Ích Khi Sử Dụng Elasticsearch Trong DevOps
- Tìm kiếm nhanh chóng: Xử lý hàng triệu bản ghi trong vài giây.
- Phân tích sâu sắc: Aggregation giúp phát hiện xu hướng và vấn đề tiềm ẩn.
- Tích hợp mượt mà: Kết nối với Kibana để trực quan hóa dữ liệu.
Thực Hành
Thêm log mới vào /var/log/myapp.log
(VD: “2024-03-02T10:02:00 WARN Database overload”), chạy truy vấn match
để tìm “overload” và aggregation để đếm log theo level
. Kiểm tra kết quả trên terminal hoặc Kibana. Nếu gặp khó khăn, nhắn mình để cùng giải quyết. Bài tiếp theo, chúng ta sẽ khám phá Kibana để trực quan hóa dữ liệu – hẹn gặp bạn!