Bài học 6: Tối ưu kiến trúc với "Bộ đôi hoàn hảo" Filebeat và Logstash
Chào mừng bạn đến với Bài học 6. Ở phần cuối của bài trước, tôi đã nhắc đến một vấn đề thực tế: Logstash rất mạnh, nhưng nó "ăn" khá nhiều RAM và CPU vì chạy trên nền tảng Java (JVM).
Nếu bạn cài trực tiếp Logstash lên máy chủ chạy Nginx hoặc máy chủ ứng dụng (App Server), nó có thể tranh giành tài nguyên và làm chậm trang web của bạn. Để giải quyết bài toán này, Elastic (công ty tạo ra ELK) đã sinh ra một "nhân viên giao hàng" siêu nhẹ mang tên Filebeat.
1. Filebeat là gì và tại sao lại cần nó?
Filebeat là một công cụ (agent) mã nguồn mở, được viết bằng ngôn ngữ Go. Khác với Logstash, Filebeat vô cùng nhẹ, ngốn rất ít RAM và CPU.
Nhiệm vụ duy nhất của Filebeat là đọc các file log trên máy chủ và đẩy nó đi nơi khác càng nhanh càng tốt. Nó hoàn toàn không có khả năng "nhào nặn" hay cắt gọt dữ liệu (Grok/Mutate) mạnh mẽ như Logstash.
Sự phân công lao động hoàn hảo:
- Filebeat (Nhân viên giao hàng): Cài đặt trên máy chủ web (Nginx). Thu thập log thô và gửi đi. Không làm ảnh hưởng đến tốc độ của web.
- Logstash (Nhà máy xử lý): Cài đặt trên một máy chủ riêng biệt. Nhận log thô từ Filebeat gửi tới, tập trung phân tích, cắt gọt, sau đó mới đẩy vào Elasticsearch.
2. Mô hình hoạt động mới
Thay vì: Nginx -> Logstash -> Elasticsearch Giờ đây kiến trúc hệ thống của bạn sẽ chuyên nghiệp hơn:
Máy chủ Web (Nginx + Filebeat) >>> (Mạng nội bộ) >>> Máy chủ Log (Logstash + Elasticsearch + Kibana)
3. Cấu hình Filebeat (Gửi hàng đi)
Để Filebeat biết cần đọc file nào và gửi đi đâu, bạn sẽ chỉnh sửa tệp cấu hình của nó (thường là filebeat.yml). Cấu hình này cực kỳ đơn giản:
# 1. Chỉ định nguồn đọc log (Input)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
# Có thể gắn thêm nhãn để Logstash nhận diện
fields:
log_type: "nginx_access"
# 2. Chỉ định đích đến (Output)
# Tắt output mặc định ra Elasticsearch (nếu có)
# output.elasticsearch:
# hosts: ["localhost:9200"]
# Bật output gửi thẳng tới Logstash
output.logstash:
# Địa chỉ IP của máy chủ đang chạy Logstash và cổng nhận dữ liệu
hosts: ["192.168.1.100:5044"]
4. Cấu hình Logstash (Nhận hàng)
Tại máy chủ chứa Logstash, chúng ta sẽ mở một "cánh cửa" (cổng mạng) để đón dữ liệu từ Filebeat. Bạn sẽ thay đổi khối input trong cấu hình Logstash (logstash.conf) như sau:
# 1. KHỐI INPUT: Lắng nghe Filebeat
input {
beats {
port => 5044 # Mở cổng 5044 để nhận dữ liệu từ các máy chủ Filebeat
}
}
# 2. KHỐI FILTER: Xử lý như bình thường
filter {
# Sử dụng nhãn mà Filebeat đã gắn để phân luồng
if [fields][log_type] == "nginx_access" {
grok {
match => { "message" => "%{IP:client_ip} - - \[%{HTTPDATE:time_local}\] \"%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_bytes_sent}" }
}
}
}
# 3. KHỐI OUTPUT: Đẩy vào kho lưu trữ
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "nginx-logs-%{+YYYY.MM.dd}"
}
}
5. Lợi ích "cứu mạng" của kiến trúc này: Cơ chế Backpressure
Điều gì xảy ra nếu mạng bị chậm, hoặc Elasticsearch đột nhiên bị quá tải và Logstash không thể xử lý kịp?
Nếu dùng kiến trúc cũ, Logstash có thể bị tràn bộ nhớ và treo. Nhưng với Filebeat, khi Logstash bị chậm, nó sẽ gửi tín hiệu "Từ từ thôi!" ngược lại cho Filebeat. Filebeat sẽ lập tức giảm tốc độ đọc file log trên máy chủ Nginx lại, chờ đến khi Logstash rảnh tay mới gửi tiếp. Cơ chế này gọi là Backpressure (Áp lực ngược), giúp đảm bảo bạn không bao giờ bị mất một dòng log nào dù hệ thống có biến cố.
Giờ đây bạn đã hình dung được luồng dữ liệu hoàn chỉnh và an toàn từ máy chủ web qua Filebeat đến Logstash. Bạn có muốn đi sâu vào cách cấu hình Hàng đợi (Queue) lưu trên ổ cứng của Logstash để tăng cường độ an toàn tuyệt đối cho dữ liệu khi hệ thống gặp sự cố mất điện đột ngột không?
All Rights Reserved