Bài học 7: Chống mất mát dữ liệu với Hàng đợi vĩnh viễn (Persistent Queues)
Chào mừng bạn đến với Bài học 7. Ở phần trước, chúng ta đã xây dựng được kiến trúc an toàn với Filebeat và Logstash. Tuy nhiên, vẫn còn một lỗ hổng chí mạng: Điều gì xảy ra nếu máy chủ Logstash bị mất điện đột ngột hoặc bị treo (crash) giữa chừng?
Để giải quyết triệt để bài toán này, chúng ta sẽ tìm hiểu về tính năng Hàng đợi vĩnh viễn (Persistent Queues - PQ).
1. Rủi ro của cơ chế mặc định (Memory Queue)
Theo mặc định, khi Logstash nhận dữ liệu từ Filebeat (hoặc bất kỳ nguồn nào), nó sẽ lưu tạm dữ liệu đó vào Bộ nhớ trong (RAM) để xử lý cho nhanh. Cơ chế này gọi là Memory Queue.
Vấn đề là RAM mang tính chất tạm thời. Nếu Logstash đang ngậm 5.000 dòng log trong RAM mà chưa kịp đẩy sang Elasticsearch, và máy chủ đột ngột sập nguồn, toàn bộ 5.000 dòng log đó sẽ "bốc hơi" vĩnh viễn. Trong các hệ thống tài chính hoặc ngân hàng, việc mất log giao dịch là thảm họa.
2. Persistent Queue (PQ) là gì?
Persistent Queue (Hàng đợi vĩnh viễn) là cơ chế bắt buộc Logstash phải ghi tạm dữ liệu xuống Ổ cứng (Disk) ngay lập tức khi vừa nhận được, thay vì chỉ lưu trên RAM.
Hãy tưởng tượng việc này giống như một người phục vụ nhà hàng:
- Memory Queue: Khách gọi món, người phục vụ chỉ nhớ trong đầu rồi chạy vào bếp. Nếu lỡ vấp ngã đập đầu, họ sẽ quên sạch khách đã gọi gì.
- Persistent Queue: Khách gọi món, người phục vụ ghi ngay ra một cuốn sổ. Dù có vấp ngã ngất xỉu, khi tỉnh dậy mở sổ ra, họ vẫn biết khách bàn số 3 vừa gọi món gì để làm tiếp.
3. So sánh Memory Queue và Persistent Queue
| Tiêu chí | Memory Queue (Mặc định) | Persistent Queue (PQ) |
|---|---|---|
| Nơi lưu trữ | Bộ nhớ trong (RAM) | Ổ cứng (Disk) |
| Tốc độ xử lý | Cực kỳ nhanh | Chậm hơn một chút (do tốn thời gian ghi đĩa) |
| Mức độ an toàn | Rủi ro mất dữ liệu cao khi sự cố | Tuyệt đối an toàn, tự động phục hồi |
| Dung lượng chứa | Rất nhỏ (giới hạn bởi RAM) | Rất lớn (vài GB đến hàng chục GB) |
| Khả năng đệm | Dễ bị đầy và từ chối nhận thêm log | Làm bộ đệm xuất sắc khi Elasticsearch bị chậm |
4. Cách kích hoạt Persistent Queue
Cấu hình Hàng đợi không nằm trong tệp logstash.conf (nơi chứa Input/Filter/Output), mà nó nằm ở tệp cấu hình hệ thống của chính Logstash, thường là logstash.yml.
Bạn chỉ cần mở tệp logstash.yml và chỉnh sửa 3 dòng sau:
# 1. Chuyển kiểu hàng đợi từ bộ nhớ (memory) sang ổ cứng (persisted)
queue.type: persisted
# 2. Chỉ định thư mục trên ổ cứng để Logstash lưu file tạm
path.queue: "/var/lib/logstash/queue"
# 3. Đặt giới hạn dung lượng tối đa cho hàng đợi (Ví dụ: 4 Gigabytes)
# Nếu đầy 4GB, Logstash sẽ báo Filebeat ngừng gửi dữ liệu
queue.max_bytes: 4gb
5. Vòng đời của một dòng log khi có PQ
Khi bật PQ, quy trình xử lý của hệ thống sẽ trở nên cực kỳ chặt chẽ và an toàn theo 5 bước sau:
- Nhận hàng: Filebeat gửi dòng log Nginx đến Logstash.
- Ghi sổ: Logstash lập tức ghi dòng log này vào tệp tin trên ổ cứng (trong thư mục /var/lib/logstash/queue).
- Xác nhận (ACK): Logstash gửi tín hiệu báo về cho Filebeat: "Tôi đã ghi vào ổ cứng an toàn, anh có thể xóa log gốc đi rồi".
- Xử lý: Logstash từ từ kéo dòng log từ ổ cứng lên RAM để chạy qua các bộ lọc (Grok, Mutate, Date).
- Dọn dẹp: Sau khi dòng log được đẩy vào kho Elasticsearch thành công, Logstash mới chính thức gạch bỏ dòng log đó khỏi "cuốn sổ" trên ổ cứng.
Nếu máy chủ sập nguồn ở Bước 4, dòng log vẫn còn nằm an toàn trên ổ cứng ở Bước 2. Khi máy chủ khởi động lại, Logstash sẽ tự động mở "sổ" ra và làm tiếp phần việc đang dang dở, đảm bảo không một byte dữ liệu nào bị bỏ sót.
All rights reserved