Back to articles
Technology Insight

Cấu hình Vector.dev: Giải pháp Xử lý và Chuyển tiếp Hàng Gigabyte Log từ Docker sang Grafana Loki Mượt mà

May 30, 2026

Giới thiệu về Thách thức Xử lý Log Quy mô Lớn trong Cụm Docker

Trong các hệ thống phân tán và kiến trúc microservices chạy trên nền tảng Docker, lượng 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ý, thu thập và phân tích dữ liệu khổng lồ này đặt ra một bài toán hóc búa cho các kỹ sư DevOps. Hệ thống logging không chỉ cần đảm bảo tính toàn vẹn của dữ liệu mà còn phải hoạt động với mức tiêu thụ tài nguyên (CPU/RAM) tối thiểu để tránh ảnh hưởng đến các ứng dụng core.

Mô hình kết hợp truyền thống giữa Fluentd/Fluent Bit và Grafana Loki thường gặp các giới hạn về hiệu năng hoặc độ phức tạp khi cấu hình bộ lọc dữ liệu ở quy mô lớn. Đây chính là nơi Vector.dev (được phát triển bởi Datadog) chứng minh sức mạnh vượt trội của mình. Được viết bằng ngôn ngữ Rust, Vector nổi tiếng với tốc độ xử lý cực nhanh, khả năng quản lý bộ nhớ an toàn và tích hợp sẵn ngôn ngữ chuyển đổi dữ liệu mạnh mẽ là VRL (Vector Remap Language).

Bài viết này sẽ hướng dẫn bạn từng bước thiết lập một pipeline thu thập log hoàn chỉnh: Từ việc gom log từ socket của Docker, tinh lọc dữ liệu bằng VRL để giảm dung lượng, cho đến cấu hình bộ đệm thông minh và đẩy dữ liệu mượt mà về Grafana Loki.

---

Kiến trúc Hệ thống Pipeline: Docker → Vector → Grafana Loki

Trước khi đi vào chi tiết tệp cấu hình, hãy cùng hình dung luồng đi của dữ liệu log trong hệ thống. Cấu trúc lý tưởng bao gồm ba thành phần chính:

  • Sources (Nguồn): Vector kết nối trực tiếp vào Docker daemon thông qua tệp tin socket /var/run/docker.sock (hoặc đọc trực tiếp từ các file json-log tại /var/lib/docker/containers/) để thu thập toàn bộ log từ các container đang chạy.
  • Transforms (Xử lý trung gian): Sử dụng VRL để lọc bỏ log rác, chuyển đổi chuỗi định dạng (String) sang JSON cấu trúc, loại bỏ các trường thừa (như thông tin môi trường nhạy cảm) nhằm giảm băng thông và dung lượng lưu trữ trên Loki.
  • Sinks (Đích đến): Dữ liệu sau khi xử lý được gom thành từng batch nén và gửi qua giao thức HTTP API đến Grafana Loki.
Kinh nghiệm thực tế: Việc xử lý lọc bớt các dữ liệu log không cần thiết ngay tại tầng Vector giúp giảm tới 30% - 50% chi phí lưu trữ và tài nguyên tính toán index cho cụm Grafana Loki phía sau.
---

Xây dựng File Cấu hình `vector.yaml` Tối ưu Hiệu năng

Dưới đây là tệp cấu hình hoàn chỉnh bằng định dạng YAML của Vector, được thiết kế chuyên biệt để xử lý lưu lượng log lớn một cách mượt mà và an toàn.


data_dir: /var/lib/vector

# 1. SOURCES: Thu thập log từ Docker Engine
sources:
  docker_logs:
    type: "docker_logs"
    exclude_containers:
      - "vector"
      - "loki"

# 2. TRANSFORMS: Lọc và cấu trúc hóa dữ liệu log
transforms:
  parse_and_filter_logs:
    type: "remap"
    inputs:
      - "docker_logs"
    source: |
      # Kiểm tra và phân tách cấu trúc JSON nếu có
      if can_be_parsed_as_json(.message) {
        parsed, err = parse_json(.message)
        if err == null {
          # Merge các trường JSON vào root object
          . = merge(., parsed)
        }
      }
      
      # Loại bỏ các dòng log debug không cần thiết để giảm tải dung lượng
      if .level == "DEBUG" || .level == "trace" {
        abort
      }
      
      # Loại bỏ các trường metadata dư thừa của Docker để tối ưu hóa bộ nhớ
      del(.source_type)
      del(.stream)

# 3. SINKS: Gom batch, nén và chuyển tiếp sang Grafana Loki
sinks:
  loki_output:
    type: "loki"
    inputs:
      - "parse_and_filter_logs"
    endpoint: "http://loki:3100"
    compression: "snappy"
    
    # Định nghĩa nhãn (Labels) cho Loki - Tối ưu hóa Cardinality
    labels:
      container_name: "{{ container_name }}"
      environment: "production"
    
    # Cơ chế kiểm soát luồng và bộ đệm chống tràn RAM
    buffer:
      type: "disk"
      max_size: 5368709120 # Khởi tạo 5GB đệm trên đĩa cứng
      when_full: "block"
      
    # Cấu hình gom lô dữ liệu để giảm số lượng HTTP Request
    batch:
      max_bytes: 5242880 # 5MB mỗi batch
      timeout_secs: 5
---

Giải thích các Điểm Cấu hình Mấu chốt để Xử lý Hàng Gigabyte Log

1. Tránh bẫy High-Cardinality trong Grafana Loki

Một trong những sai lầm phổ biến nhất khi đẩy log lên Loki là biến các thông tin thay đổi liên tục (như container_id, request_id, hoặc timestamp) thành các Labels. Loki hoạt động hiệu quả bằng cách tạo chỉ mục (index) dựa trên label. Nếu số lượng giá trị duy nhất của label quá lớn (High-Cardinality), Loki sẽ bị cạn kiệt bộ nhớ và treo hệ thống.

Trong cấu hình trên, chúng ta chỉ giữ lại nhãn có tính định danh cao như container_name và environment. Toàn bộ các thông tin chi tiết khác sẽ được đẩy vào phần thân của log dưới dạng JSON cấu trúc.

2. Sử dụng Bộ đệm Đĩa cứng (Disk Buffers) thay vì Bộ nhớ RAM

Khi lưu lượng log tăng đột biến đột ngột lên hàng Gigabyte (ví dụ: khi hệ thống bị DDoS hoặc ứng dụng lặp vòng lặp vô hạn lỗi), các sink có thể không kịp gửi dữ liệu đi, dẫn đến việc tích tụ dữ liệu trong bộ đệm. Nếu dùng cấu hình mặc định (In-Memory Buffer), Vector sẽ nhanh chóng bị hệ thống ép chết do lỗi Out-Of-Memory (OOM).

Bằng cách khai báo buffer.type: "disk" kết hợp hạn mức 5GB, Vector sẽ an toàn ghi đè các log tạm thời xuống ổ cứng nếu Loki bị chậm phản hồi, đảm bảo tính ổn định tuyệt đối cho Node.

3. Tối ưu Batching và Nén Dữ liệu bằng Snappy

Việc gửi từng dòng log qua HTTP Client là một thảm họa về mặt hiệu năng network. Việc tinh chỉnh batch.max_bytes: 5242880 giúp Vector gom đủ 5MB dữ liệu log hoặc đợi tối đa 5 giây rồi mới nén bằng thuật toán Snappy và đẩy đi một lần. Điều này làm giảm đáng kể số lượng HTTP Connections và tối ưu hóa băng thông mạng nội bộ.

---

Triển khai Thực tế bằng Docker Compose

Để đưa toàn bộ kiến trúc này vào hoạt động một cách đồng bộ, bạn có thể tham khảo tệp docker-compose.yml chuẩn hóa dưới đây. Tệp này cấu hình quyền đọc socket hệ thống một cách bảo mật dạng Read-Only cho Vector:


version: "3.8"

services:
  loki:
    image: grafana/loki:2.9.x
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - logging

  vector:
    image: timberio/vector:0.34.X-debian
    volumes:
      - ./vector.yaml:/etc/vector/vector.yaml:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /var/lib/vector:/var/lib/vector
    command: --config /etc/vector/vector.yaml
    depends_on:
      - loki
    networks:
      - logging

networks:
  logging:
    name: logging_network
---

Kết luận và Khuyến nghị Giám sát Hệ thống

Sử dụng Vector.dev để làm cầu nối thu thập log cho cụm Docker là một giải pháp kiến trúc mang lại hiệu quả chi phí và hiệu năng vượt trội. Nhờ nền tảng ngôn ngữ Rust bền bỉ và các tính năng kiểm soát luồng cao cấp, hệ thống logging của bạn hoàn toàn có thể tự động co giãn và chịu đựng được áp lực từ các nguồn dữ liệu lớn lên tới hàng Gigabyte log mỗi ngày.

Để hệ thống vận hành trơn tru trong dài hạn, bạn nên bật thêm source internal_metrics từ chính Vector để thu thập các chỉ số về CPU, bộ nhớ, lượng log dropped hoặc tốc độ xử lý của pipeline, từ đó có những bước tinh chỉnh thông số batch và buffer chính xác hơn theo đặc thù dữ liệu doanh nghiệp của mình.

Cấu hình Vector.dev: Giải pháp Xử lý và Chuyển tiếp Hàng Gigabyte Log từ Docker sang Grafana Loki Mượt mà | DPTCloud