ADR 0002. Bộ đệm WAL trên đĩa tự viết, giới hạn dung lượng
- Trạng thái: Đã chấp nhận
- Ngày: 2026-09-30
Bối cảnh
Mạng giữa máy chủ và collector có thể gián đoạn. Cần giữ số liệu chưa gửi qua mất mạng và khởi động lại, nhưng không được làm đầy đĩa máy sản xuất, và không thêm phụ thuộc nặng.
Quyết định
Tự viết một WAL nhỏ: các đoạn (segment) 1 MiB, mỗi bản ghi gồm độ dài, CRC32 và lô protobuf đã nén. Thêm cuối, đọc đầu, xóa đoạn khi mọi bản ghi đã được xác nhận. Giới hạn cứng buffer.max_bytes (mặc định 50 MB) và buffer.max_age (24 giờ). Khi đầy, bỏ đoạn cũ nhất và đếm vào agent_dropped_samples_total. Khởi động lại quét đoạn, bỏ bản ghi hỏng CRC, cắt đuôi dở.
Gửi bù theo thứ tự thời gian, cũ trước, có giới hạn tốc độ (mặc định tối đa 2 lô bù mỗi lần gửi) để không dồn tải collector sau sự cố dài.
Hệ quả
- Không cần SQLite hay BoltDB, giữ binary nhỏ và không CGO (ADR 0001).
- Mất tối đa lô đang ghi khi mất điện đột ngột.
- Số liệu cũ hơn 24 giờ bị bỏ, khớp cửa sổ chấp nhận của collector.
- Cần kiểm thử ngắt điện, đầy đĩa, fuzz cho bộ đọc.
- Bộ đệm dùng chung logic ghi cho Linux và Windows, chỉ khác thư mục.
Phương án đã cân nhắc
| Phương án | Lý do không chọn |
|---|---|
| Chỉ đệm trong bộ nhớ | Mất dữ liệu khi khởi động lại, chiếm RAM |
| SQLite | Cần CGO hoặc thư viện lớn, quá nặng cho hàng đợi thêm cuối và xóa đầu |
| BoltDB hoặc BadgerDB | Phụ thuộc và kích thước lớn hơn nhu cầu |
| Không đệm | Mỗi lần mạng gián đoạn ngắn đều mất dữ liệu, tạo lỗ hổng biểu đồ |