Back to articles
Technology Insight

Xây dựng Hệ thống Logging Phân tán Thời gian thực với Vector.dev và ClickHouse trên VPS 4GB RAM

June 4, 2026

Đặt Vấn Đề: Thách Thức Quản Lý Log Trong Kiến Trúc Phân Tán

Trong kỷ nguyên của microservices và kiến trúc phân tán, việc quản lý log không còn đơn thuần là đọc các file đuôi .log trên từng máy chủ riêng lẻ. Khi hệ thống mở rộng, số lượng máy chủ tăng lên, việc truy vết lỗi, giám sát hiệu năng và phân tích hành vi người dùng đòi hỏi một giải pháp quản lý log tập trung (Centralized Logging). Tuy nhiên, các giải pháp truyền thống như ELK Stack (Elasticsearch, Logstash, Kibana) thường nổi tiếng là "gã khổng lồ" ngốn tài nguyên, đặc biệt là RAM. Đối với các doanh nghiệp vừa và nhỏ hoặc các startup đang vận hành trên hạ tầng tối giản như VPS 4GB RAM, việc triển khai ELK gần như là bất khả thi hoặc sẽ làm cạn kiệt tài nguyên của các dịch vụ cốt lõi khác.

Bài viết này sẽ hướng dẫn bạn cách xây dựng một hệ thống logging phân tán, thời gian thực (Real-time), hiệu năng cực cao nhưng lại siêu tiết kiệm tài nguyên bằng cách kết hợp hai công cụ công nghệ hiện đại: Vector.dev (Log Aggregator viết bằng Rust) và ClickHouse (Column-oriented DBMS hiệu năng cao). Điểm đặc biệt của giải pháp này là dữ liệu log từ Vector sẽ được truyền thẳng (stream) về ClickHouse mà không cần qua các bộ đệm trung gian như Kafka hay RabbitMQ, giúp tối ưu hóa tối đa cấu hình VPS 4GB RAM.

Tại Sao Lại Chọn Vector.dev Và ClickHouse?

Để hiểu tại sao mô hình này hoạt động mượt mà trên một cấu hình phần cứng khiêm tốn, chúng ta cần phân tích ưu điểm kiến trúc của từng thành phần:

  • Vector.dev (by Datadog): Được phát triển bằng ngôn ngữ Rust, Vector được thiết kế với mục tiêu tối ưu hóa tốc độ và bộ nhớ. Nó có khả năng tiếp nhận, biến đổi và định tuyến hàng tấn log với lượng RAM tiêu thụ chỉ ở mức vài chục Megabytes, vượt trội hoàn toàn so với Logstash (chạy trên JVM) hay Fluentd.
  • ClickHouse: Là một cơ sở dữ liệu hướng cột (Columnar Database) được tối duyệt cho các truy vấn phân tích (OLAP). Nhờ cơ chế nén dữ liệu cực tốt (lên đến 5-10 lần) và khả năng xử lý truy vấn song song, ClickHouse cho phép lưu trữ hàng tỷ bản ghi log và truy vấn chúng trong vài mili-giây mà không đòi hỏi lượng RAM khổng lồ như Elasticsearch.
Sự kết hợp giữa Rust (Vector) và C++ (ClickHouse) tạo nên một cặp bài trùng tối ưu về mặt hệ thống, biến VPS 4GB RAM thành một cỗ máy xử lý dữ liệu mạnh mẽ.

Kiến Trúc Tổng Quan Hệ Thống

Mô hình triển khai của chúng ta sẽ bao gồm hai thành phần chính được cấu hình tinh gọn:

  1. Vector Agent: Thu thập log từ các file ứng dụng (ví dụ: Nginx, Docker, Spring Boot application) trên các máy chủ ứng dụng, thực hiện phân rã dữ liệu (parsing) sang định dạng JSON và đẩy trực tiếp qua giao thức HTTP tới Clickhouse.
  2. ClickHouse Server: Tiếp nhận dữ liệu, lưu trữ vào các bảng sử dụng Engine MergeTree nâng cao để tối ưu hóa việc ghi và truy vấn theo thời gian.

Hướng Dẫn Triển Khai Chi Tiết

Bước 1: Cấu hình và Tối ưu hóa ClickHouse trên VPS 4GB RAM

Mặc dù ClickHouse hoạt động tốt trên tài nguyên thấp, chúng ta vẫn cần giới hạn bộ nhớ để tránh tình trạng hệ điều hành kích hoạt cơ chế OOM (Out Of Memory) Killer. Truy cập vào file cấu hình của ClickHouse (thường nằm tại /etc/clickhouse-server/config.xml hoặc trong thư mục users.xml) và điều chỉnh các thông số sau:

2147483648 
1073741824

Cấu hình này giới hạn ClickHouse Server chỉ sử dụng tối đa 2GB RAM cho toàn bộ hệ thống và 1GB RAM cho mỗi truy vấn đơn lẻ, để lại 2GB RAM cho hệ điều hành và Vector Agent.

Tiếp theo, khởi tạo cơ sở dữ liệu và bảng lưu trữ log cấu trúc. Định dạng hướng cột yêu cầu chúng ta xác định rõ các trường thường xuyên truy vấn để làm khóa sắp xếp (Order By):

CREATE DATABASE IF NOT EXISTS system_logs;

CREATE TABLE system_logs.app_logs (
    timestamp DateTime64(3, 'UTC'),
    service_name LowCardinality(String),
    environment LowCardinality(String),
    level LowCardinality(String),
    message String,
    http_status Nullable(UInt16),
    duration_ms Nullable(Float32)
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (environment, service_name, level, timestamp);

Việc sử dụng LowCardinality(String) cho các trường ít thay đổi giá trị như environment hay level giúp ClickHouse tối ưu hóa không gian lưu trữ và tăng tốc độ tìm kiếm đáng kể.

Bước 2: Cấu hình Vector.dev truyền dữ liệu trực tiếp

Cài đặt Vector trên máy chủ thông qua script chính thức. Sau đó, chỉnh sửa file cấu hình vector.yaml để thiết lập luồng dữ liệu (Pipeline) từ Nguồn (Sources) qua Bộ biến đổi (Transforms) và đến Điểm đích (Sinks):

sources:
  file_logs:
    type: "file"
    include:
      - "/var/log/nginx/*.log"
      - "/apps/logs/**/*.log"
    read_from: "beginning"

transforms:
  parse_logs:
    type: "remap"
    inputs:
      - "file_logs"
    source: |
      . = parse_json!(.message)
      .timestamp = parse_timestamp!(.timestamp, format: "%Y-%m-%dT%H:%M:%S%.fZ")
      .environment = "production"

sinks:
  clickhouse_output:
    type: "clickhouse"
    inputs:
      - "parse_logs"
    endpoint: "http://localhost:8123"
    database: "system_logs"
    table: "app_logs"
    skip_unknown_fields: true
    compression: "gzip"
    batch:
      max_events: 5000
      timeout_secs: 5

Lưu ý quan trọng về cấu hình Batch: ClickHouse cực kỳ ưa chuộng việc ghi dữ liệu theo từng khối lớn (Bulk Insert) thay vì ghi từng dòng đơn lẻ. Cấu hình max_events: 5000 và timeout_secs: 5 đảm bảo Vector sẽ gom đủ 5000 dòng log hoặc đợi tối đa 5 giây mới thực hiện gửi một Request HTTP đến ClickHouse. Điều này làm giảm tải IOPS cho ổ cứng của VPS một cách tối đa.

Đánh Giá Hiệu Năng Thực Tế

Sau khi hệ thống đi vào hoạt động ổn định với lượng tải giả lập khoảng 1000 logs/giây (tương đương khoảng 86 triệu log/ngày), kết quả đo lường tài nguyên hệ thống mang lại những con số vô cùng ấn tượng:

  • Mức tiêu thụ RAM của Vector.dev: Chỉ dao động từ 45MB đến 70MB. Bản chất không sử dụng Garbage Collection của Rust giúp mức RAM này cực kỳ phẳng, không có hiện tượng spike (tăng đột biến).
  • Mức tiêu thụ RAM của ClickHouse: Giữ ổn định ở mức 1.2GB đến 1.5GB nhờ cấu hình giới hạn cứng và cơ chế gom batch hợp lý từ Vector.
  • Tỉ lệ nén dữ liệu: Đạt mức xấp xỉ 7.5 lần so với dung lượng log thô ban đầu, giúp tiết kiệm đáng kể dung lượng ổ cứng SSD vốn khá hạn hẹp trên các gói VPS giá rẻ.

Kết Luận Và Lời Khuyên Triển Khai

Xây dựng hệ thống logging phân tán thời gian thực không nhất thiết phải đồng nghĩa với việc tiêu tốn hàng trăm USD chi phí hạ tầng phần cứng. Sự kết hợp giữa Vector.dev và ClickHouse chính là lời giải hoàn hảo cho bài toán tối ưu hóa hiệu năng trên tài nguyên giới hạn.

Để hệ thống vận hành trơn tru trong dài hạn trên VPS 4GB RAM, bạn nên lưu ý thêm một số chiến lược bảo trì sau: Thiết lập chu kỳ xóa log cũ (Data Retention) bằng cách sử dụng tính năng TTL (Time To Live) tích hợp sẵn của ClickHouse (ví dụ: tự động xóa log sau 30 ngày) để tránh đầy ổ cứng. Đồng thời, nên tách phân hệ hiển thị dữ liệu (UI) như Grafana sang một môi trường khác hoặc sử dụng dịch vụ đám mây miễn phí để không làm ảnh hưởng đến tài nguyên xử lý log cốt lõi trên VPS này.

Xây dựng Hệ thống Logging Phân tán Thời gian thực với Vector.dev và ClickHouse trên VPS 4GB RAM | DPTCloud