Grafana Mimir: Giải pháp lưu trữ Prometheus metrics ‘vô tận’ trên Object Storage

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

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-metricsmimir-blocks trướ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=2h trê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.

Share: