Nỗi lo mang tên ‘Disk Full’ khi chạy Prometheus
Nếu đang vận hành cụm Prometheus theo dõi khoảng 20-30 server, chắc hẳn bạn đã từng nhận cảnh báo ổ cứng đầy lúc nửa đêm. Prometheus mặc định lưu dữ liệu trên local disk. Khi metrics tăng hoặc bạn cần lưu dữ liệu 1-2 năm để làm báo cáo, chi phí cho ổ cứng SSD/NVMe sẽ cực kỳ đắt đỏ. Việc backup và di chuyển hàng trăm GB dữ liệu TSDB thủ công cũng là một cơn ác mộng.
Hệ thống của mình trước đây chỉ dám giữ dữ liệu trong 15 ngày để bảo vệ ổ cứng. Sau khi triển khai Mimir, mình đã đẩy được toàn bộ metrics cũ lên Object Storage (S3/MinIO). Việc này giúp truy xuất xu hướng từ 6 tháng trước chỉ trong vài giây mà không tốn thêm một đồng ổ cứng vật lý nào. Mimir là dự án mã nguồn mở từ Grafana Labs, có khả năng xử lý hàng tỷ metrics với kiến trúc cực kỳ linh hoạt.
Tại sao mình chọn Mimir thay vì Thanos?
Nhiều bạn thường cân nhắc Thanos vì nó quá nổi tiếng. Tuy nhiên, sau khi dùng thử cả hai, mình thấy Mimir có những lợi thế thực tế hơn:
- Triển khai siêu tốc: Mimir hỗ trợ chế độ
monolithic. Bạn chỉ cần duy nhất một file binary để chạy toàn bộ hệ thống, thay vì phải quản lý 5-7 component rời rạc như Thanos. - Cơ chế Push thay vì Pull: Mimir nhận dữ liệu qua
remote_write. Bạn không cần cài thêm Sidecar bên cạnh Prometheus, giúp giảm tải cho các node monitor. - Tốc độ truy vấn: Nhờ cơ chế sharding và hashing thông minh, Mimir xử lý các query phức tạp trên lượng dữ liệu lớn nhanh hơn đáng kể.
Mô hình hoạt động
Luồng dữ liệu sẽ đi như sau: Prometheus thu thập metrics rồi đẩy ngay sang Mimir qua remote_write. Tại đây, Mimir nén dữ liệu và lưu trữ lâu dài vào MinIO (Object Storage). Cuối cùng, Grafana sẽ kết nối trực tiếp vào Mimir để lấy dữ liệu hiển thị biểu đồ.
Hướng dẫn cài đặt với Docker Compose
Để bắt đầu, bạn cần một server Linux đã cài sẵn Docker. Chúng ta sẽ dựng một cụm lab hoàn chỉnh gồm MinIO, Mimir, Prometheus và Grafana.
1. Thiết lập MinIO (Lưu trữ metrics)
Tạo file docker-compose.yml. MinIO sẽ đóng vai trò là kho lưu trữ giá rẻ thay thế cho AWS S3.
services:
minio:
image: minio/minio
container_name: mimir-minio
volumes:
- ./minio-data:/data
environment:
MINIO_ROOT_USER: mimiradmin
MINIO_ROOT_PASSWORD: mimirpassword
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
2. Cấu hình Grafana Mimir
Tạo file mimir-config.yaml. Đây là phần quan trọng nhất để Mimir kết nối tới MinIO.
target: all
common:
storage:
backend: s3
s3:
endpoint: minio:9000
access_key_id: mimiradmin
secret_access_key: mimirpassword
insecure: true
bucket_name: mimir-metrics
multitenancy_enabled: false
blocks_storage:
backend: s3
s3:
bucket_name: mimir-blocks
tsdb:
dir: /tmp/mimir/tsdb
server:
http_listen_port: 9009
3. Kết nối Prometheus sang Mimir
Mở file prometheus.yml và thêm cấu hình remote_write. Câu lệnh này yêu cầu Prometheus đẩy dữ liệu đi ngay khi thu thập được.
global:
scrape_interval: 15s
remote_write:
- url: http://mimir:9009/api/v1/push
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
4. Kích hoạt hệ thống
Bổ sung Mimir, Prometheus và Grafana vào docker-compose.yml rồi chạy lệnh docker-compose up -d. Sau vài phút, toàn bộ stack monitoring của bạn sẽ sẵn sàng hoạt động.
Cấu hình Data Source trên Grafana
Truy cập Grafana tại cổng 3000. Thay vì trỏ trực tiếp vào Prometheus (cổng 9090), bạn hãy thêm mới một Prometheus Data Source với URL là http://mimir:9009/prometheus.
Điểm hay ở đây là Grafana sẽ thấy Mimir như một server Prometheus khổng lồ. Mimir tự động tổng hợp dữ liệu mới từ RAM và dữ liệu cũ từ MinIO để trả về kết quả chính xác nhất.
Kinh nghiệm thực tế khi vận hành
Sau một thời gian chạy Mimir cho môi trường production, mình có 3 lưu ý quan trọng cho bạn:
- Tạo Bucket thủ công: Mimir không tự tạo bucket trên MinIO. Bạn phải truy cập cổng 9001, tạo sẵn hai bucket là
mimir-metricsvàmimir-blockstrước khi khởi động Mimir. - RAM là yếu tố sống còn: Mimir cần RAM để index và nén dữ liệu. Với 15-20 server, hãy cấp ít nhất 4GB RAM để tránh tình trạng container bị restart do OOM (Out of Memory).
- Giữ Retention của Prometheus ngắn: Bạn nên để
--storage.tsdb.retention.time=2htrên Prometheus. Việc này giúp giảm tải ổ cứng local tối đa vì dữ liệu đã có Mimir lo.
Lời kết
Chuyển sang Grafana Mimir là bước đi đúng đắn nếu bạn muốn hệ thống monitoring chuyên nghiệp và bền bỉ hơn. Bạn sẽ không còn phải lo xóa dữ liệu cũ để nhường chỗ cho dữ liệu mới mỗi tuần. Với chi phí Object Storage cực rẻ, Mimir giúp bạn lưu trữ metrics bao lâu tùy thích mà vẫn đảm bảo tốc độ truy vấn ổn định.

