Back to articles
Technology Insight

Cấu hình Vector.dev: Giải pháp xử lý hàng Gigabyte Log từ Docker sang Grafana Loki mượt mà

May 30, 2026

Giới thiệu về bài toán xử lý log quy mô lớn trên Docker

Trong các hệ thống phân tán và vi dịch vụ (microservices) vận hành trên nền tảng Docker, lượng dữ liệu log sinh ra mỗi ngày có thể nhanh chóng chạm ngưỡng hàng chục, thậm chí hàng trăm Gigabyte. Việc quản lý, tập trung hóa và phân tích nguồn dữ liệu khổng lồ này trở thành bài toán sống còn đối với các kỹ sư DevOps và SRE hệ thống.

Mô hình truyền thống sử dụng Promtail hoặc Fluentd kết hợp với Grafana Loki thường gặp phải các giới hạn về mặt hiệu năng khi lượng log tăng đột biến. Nhu cầu về một giải pháp tối ưu tài nguyên phần cứng, có khả năng xử lý bất đồng bộ, nén dữ liệu tốt và hỗ trợ chuẩn hóa dữ liệu (parsing/mapping) mạnh mẽ trước khi lưu trữ là vô cùng cấp thiết. Đó là lý do tại sao Vector.dev - một công cụ định tuyến dữ liệu quan sát (observability data pipeline) viết bằng ngôn ngữ Rust - trở thành mảnh ghép hoàn hảo cho kiến trúc hạ tầng hiện đại.

Tại sao nên chọn Vector.dev thay thế cho Promtail/Fluentbit?

Được xây dựng trên nền tảng Rust bảo mật và tối ưu bộ nhớ, Vector đem lại những lợi ích vượt trội mà các công cụ chạy trên JVM hoặc Go khó lòng đạt được:

  • Hiệu năng cực cao và tiêu thụ RAM cực ít: Vector có khả năng xử lý hàng trăm nghìn sự kiện mỗi giây (events/sec) nhưng chỉ chiếm dụng một lượng RAM và CPU vô cùng nhỏ nhờ cơ chế zero-cost abstractions của Rust.
  • Cơ chế Buffer an toàn (Disk/Memory Buffer): Khi Grafana Loki bị quá tải hoặc gặp sự cố gián đoạn mạng, Vector có thể lưu tạm thời dữ liệu log xuống ổ đĩa cục bộ (Disk Buffer) để tránh làm mất dữ liệu và tự động đẩy bù (backpressure) khi Loki hoạt động trở lại.
  • Ngôn ngữ VRL (Vector Remap Language) mạnh mẽ: Cho phép parse JSON, định dạng lại mốc thời gian (timestamp), loại bỏ các trường thông tin nhạy cảm hoặc thừa thãi ngay trên đường đi của log, giúp giảm tải dung lượng lưu trữ cho Loki index.

Kiến trúc tổng quan của Pipeline: Docker -> Vector -> Loki

Luồng dữ liệu sẽ được thiết lập tuần tự như sau:

  1. Vector Source (docker_logs): Thao tác trực tiếp thông qua Docker Daemon Socket (/var/run/docker.sock) để tự động phát hiện và thu thập toàn bộ log (stdout/stderr) từ tất cả container đang chạy trên host.
  2. Vector Transform (remap): Sử dụng VRL để bóc tách cấu trúc log, chuẩn hóa định dạng, đồng thời gán thêm các nhãn (labels) động như tên container, ID, hay môi trường sản xuất.
  3. Vector Sink (loki): Gom log thành các lô dữ liệu lớn (batching), nén lại và đẩy về endpoint API của Grafana Loki thông qua giao thức HTTP một cách mượt mà.
Lưu ý quan trọng: Việc quản lý nhãn (label) trong Grafana Loki cần hết sức cẩn thận. Việc gán quá nhiều nhãn động (chẳng hạn như gán ID của từng log line làm nhãn) sẽ dẫn đến lỗi High Cardinality, khiến Loki bị cạn kiệt tài nguyên bộ nhớ. Vector giúp giải quyết vấn đề này bằng cách cấu trúc hóa nội dung log vào phần JSON body và chỉ giữ lại các nhãn tĩnh cần thiết để tăng tốc độ truy vấn.

Hướng dẫn cấu hình Vector chi tiết cho hàng Gigabyte Log

1. Chuẩn bị file cấu hình `vector.toml`

Dưới đây là file cấu hình hoàn chỉnh được thiết kế tối ưu cho môi trường chịu tải cao, tích hợp tính năng Disk Buffer và chuẩn hóa cấu trúc dữ liệu log.

[sources.docker_container_logs] 
type = "docker_logs" 
exclude_containers = ["vector"] 

[transforms.normalize_and_parse_logs] 
type = "remap" 
inputs = ["docker_container_logs"] 
source = ''' 
# Thử nghiệm phân rã log dạng JSON, nếu thất bại giữ nguyên text 
if can_be_parsed, err = parse_json(.message); can_be_parsed {
  .parsed = parse_json!(.message)
  del(.message)
} 

# Chuẩn hóa thông tin metadata 
.app_name = .container_name 
.environment = "production" 
.timestamp = .timestamp || now() 
''' 

[sinks.grafana_loki_output] 
type = "loki" 
inputs = ["normalize_and_parse_logs"] 
endpoint = "http://loki:3100" 
encoding.codec = "json" 

# Cấu hình tối ưu hóa chống nghẽn cho lượng log lớn 
[sinks.grafana_loki_output.batch] 
max_bytes = 2097152 # 2MB per batch 
timeout_secs = 1.0 

# Khởi tạo bộ đệm an toàn trên ổ đĩa tránh mất mát dữ liệu 
[sinks.grafana_loki_output.buffer] 
type = "disk" 
max_size = 5368709120 # Giới hạn 5GB buffer trên ổ cứng 
when_full = "block" 

# Định nghĩa nhãn tối ưu cho Loki (Tránh High Cardinality) 
[sinks.grafana_loki_output.labels] 
job = "docker-logs" 
container_name = "{{container_name}}" 
environment = "{{environment}}" 
stream = "{{stream}}" 

2. Triển khai bằng Docker Compose

Để Vector có quyền truy cập vào Docker socket và ghi file cấu hình vào container một cách mượt mà, chúng ta cấu hình file docker-compose.yml như sau:

version: "3.8" 

services: 
  vector: 
    image: timberio/vector:0.36.0-alpine 
    container_name: vector_agent 
    restart: always 
    volumes: 
      - ./vector.toml:/etc/vector/vector.toml:ro 
      - /var/run/docker.sock:/var/run/docker.sock:ro 
      - /var/lib/vector/:/var/lib/vector/ 
    environment: 
      - VECTOR_LOG=info 
    depends_on: 
      - loki 

  loki: 
    image: grafana/loki:2.9.4 
    container_name: loki_storage 
    ports: 
     - "3100:3100" 
    command: -config.file=/etc/loki/local-config.yaml 

  grafana: 
    image: grafana/grafana:latest 
    container_name: grafana_ui 
    ports: 
      - "3000:3000" 
    depends_on: 
      - loki 

Kiểm tra và giám sát kết quả trên Grafana Dashboard

Sau khi khởi chạy hệ thống bằng lệnh docker compose up -d, bạn tiến hành truy cập vào giao diện Grafana qua cổng http://localhost:3000. Thực hiện các bước cấu hình sau để kiểm tra dữ liệu:

  1. Điều hướng đến Connections -> Data Sources và chọn Loki.
  2. Điền URL endpoint là http://loki:3100 rồi nhấn Save & Test.
  3. Chuyển sang mục Explore, chọn nguồn dữ liệu Loki vừa tạo và chạy câu lệnh LogQL: {job="docker-logs"}.
  4. Bạn sẽ thấy toàn bộ log từ các container Docker hiển thị theo thời gian thực một cách liền mạch, mượt mà. Phần nội dung cấu trúc JSON được bóc tách chuẩn xác giúp việc lọc lỗi (filtering) và tạo biểu đồ cảnh báo (alerts) trở nên vô cùng trực quan và nhanh chóng.

    Kết luận

    Cấu hình Vector.dev kết hợp với Grafana Loki là một giải pháp kiến trúc tối ưu, mang lại khả năng xử lý log vượt trội cho các hệ thống Docker quy mô lớn. Việc sử dụng ngôn ngữ lập trình VRL kết hợp với cơ chế ghi nhớ đệm ổ đĩa giúp giải quyết triệt để vấn đề mất mát dữ liệu và tối ưu hóa tài nguyên phần cứng, tiết kiệm chi phí vận hành cho doanh nghiệp. Hãy áp dụng Vector vào hệ thống giám sát của bạn ngay hôm nay để trải nghiệm sự khác biệt về mặt hiệu năng.

Cấu hình Vector.dev: Giải pháp xử lý hàng Gigabyte Log từ Docker sang Grafana Loki mượt mà | DPTCloud