Vector trong Môi trường Production: Cách Chúng Tôi Giảm 90% Tài nguyên Logging

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Chi phí cho Khả năng Quan sát (Observability)

Sáu tháng trước, stack observability của chúng tôi đã trở thành chính thứ mà nó vốn dĩ phải ngăn chặn: một mối nguy hiểm cho môi trường production. Chúng tôi đã vận hành một hệ thống ELK (Elasticsearch, Logstash, Kibana) tiêu chuẩn, nhưng khi mở rộng lên hơn 50 microservices, các instance Logstash bắt đầu ngốn RAM còn nhiều hơn cả logic nghiệp vụ thực tế mà chúng giám sát.

Overhead của JVM không chỉ là một sự phiền toái; nó là một rủi ro gây ra các lỗi OOM (Out of Memory) thường xuyên. Chúng tôi cần một giải pháp tinh gọn, nhanh chóng và không yêu cầu bằng cấp về tối ưu hóa JVM.

Sau đó, chúng tôi tìm thấy Vector. Được xây dựng từ đầu bằng Rust, Vector là một router hiệu suất cao cho dữ liệu observability. Sau nửa năm chạy production, kết quả đã rõ ràng: nó xử lý hàng triệu sự kiện mỗi giây trong khi vẫn duy trì một footprint nhỏ đến mức bạn sẽ quên mất nó đang chạy. Đối với bất kỳ kỹ sư nào đang xây dựng hạ tầng có khả năng phục hồi (resilient infrastructure), việc vượt qua các trình vận chuyển log cũ kỹ không còn là lựa chọn nữa.

So sánh các Đối thủ: Vector và Những “Cựu binh”

Logstash đã là tiêu chuẩn ngành trong nhiều năm, nhưng việc phụ thuộc vào hệ sinh thái Java khiến nó trở nên nặng nề. Fluentd đã cải thiện điều này bằng cách sử dụng kết hợp C/Ruby, nhưng nó thường bị nghẽn khi xử lý logic chuyển đổi phức tạp ở thông lượng cao. Vector đại diện cho thế hệ thứ ba của sự tiến hóa này.

Tính năng Logstash Fluentd Vector
Ngôn ngữ JRuby/Java C/Ruby Rust
Sử dụng Bộ nhớ Cao (500MB+) Vừa phải (100MB+) Rất thấp (<30MB)
Type Safety Yếu Trung bình Mạnh
Cam kết Chuyển phát At-least-once At-least-once End-to-end Acks

Kiến trúc của Vector về cơ bản là khác biệt. Nó coi log, metric và trace như một luồng dữ liệu thống nhất. Trong khi Logstash sử dụng một DSL riêng thường mang lại cảm giác khó hiểu, Vector sử dụng VRL (Vector Remap Language). Viết VRL mang lại cảm giác như đang viết code functional sạch sẽ—hãy coi nó như TypeScript cho dữ liệu telemetry của bạn.

Tại sao Chúng tôi Chuyển đổi: Những Số liệu Thực tế

Điểm mạnh

  • Hiệu quả Triệt để: Các sidecar log của chúng tôi giảm từ 500MB RAM xuống chỉ còn 28MB. Trong một cụm Kubernetes với 200 node, điều đó đã giải phóng gần 100GB bộ nhớ cho toàn hệ thống.
  • Độ tin cậy Tuyệt đối: Vector tích hợp sẵn bộ đệm đĩa (disk buffers). Nếu Clickhouse hoặc S3 ngoại tuyến để bảo trì, Vector sẽ cache dữ liệu cục bộ và tự động thử lại. Chúng tôi chưa mất một dòng log nào kể từ khi di chuyển.
  • Engine VRL: Bạn có thể thực hiện parse phức tạp (Grok, Regex, JSON) và logic điều kiện mà không gặp phải hình phạt hiệu suất lớn thường thấy trong các bộ lọc dựa trên Ruby hoặc Java.
  • Không Phụ thuộc: Nó là một file binary tĩnh duy nhất. Không cần runtime, không xung đột phiên bản glibc, và không có lỗ hổng bảo mật kế thừa từ một máy ảo VM đồ sộ.

Sự Đánh đổi

  • Độ chín của Hệ sinh thái: Vector có các sink cho tất cả các nhà cung cấp lớn, nhưng nó thiếu thư viện các plugin lâu đời và ít phổ biến như trong hệ sinh thái Fluentd.
  • Độ dốc của Cú pháp: Nếu bạn đã quen với cấu hình YAML hoặc Ruby, cấu trúc của Vector sẽ mất một hoặc hai tuần để thành thạo, đặc biệt là khi đi sâu vào các hàm VRL nâng cao.

Chiến lược Production Đa tầng

Tôi khuyên dùng kiến trúc hai tầng cho bất kỳ môi trường DevOps nghiêm túc nào. Đừng để các ứng dụng của bạn giao tiếp trực tiếp với database. Hãy chia công việc thành hai vai trò:

  1. Agent (Source): Chạy Vector như một DaemonSet nhẹ trên mọi node. Nhiệm vụ duy nhất của nó là thu thập log từ file hoặc socket và gửi chúng ngay lập tức đến hub.
  2. Hub (Aggregator): Một cụm Vector tập trung, mạnh mẽ hơn. Đây là nơi bạn thực hiện các tác vụ nặng: loại bỏ trùng lặp (deduplication), ẩn thông tin cá nhân (PII masking) và điều hướng đến nhiều đích đến khác nhau.

Sự tách biệt này giúp các node cục bộ luôn nhẹ nhàng, trong khi hub sẽ quản lý logic phức tạp và bộ đệm.

Từng bước: Xây dựng Pipeline Đầu tiên của Bạn

Hãy cùng xây dựng một pipeline sẵn sàng cho production để thu thập dữ liệu Syslog, chèn metadata môi trường và điều hướng nó đến cả Clickhouse để phân tích và S3 để lưu trữ lâu dài.

1. Cài đặt

Trên Linux, bạn có thể chạy nó trong vài giây:

curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | sh

2. Cấu hình Pipeline

Tạo một file vector.yaml. Logic tuân theo mô hình đơn giản Source -> Transform -> Sink.

sources:
  syslog_in:
    type: "syslog"
    address: "0.0.0.0:514"
    mode: "tcp"

transforms:
  clean_logs:
    type: "remap"
    inputs:
      - "syslog_in"
    source: |
      # Thử parse dưới dạng JSON; bỏ qua nếu là văn bản thuần túy
      parsed, err = parse_json(.message)
      if err == null {
        . = merge(., parsed)
      }

      # Chèn ngữ cảnh triển khai (deployment context)
      .env = "production"
      .cluster = "k8s-us-east"
      
      # Ẩn các số thẻ tín dụng tiềm năng
      .message = redact(.message, filters: [r'\d{4}-\d{4}-\d{4}-\d{4}'])

sinks:
  clickhouse_out:
    type: "clickhouse"
    inputs:
      - "clean_logs"
    endpoint: "http://clickhouse-internal:8123"
    table: "logs"
    database: "observability"

  s3_archive:
    type: "aws_s3"
    inputs:
      - "clean_logs"
    bucket: "prod-log-archive"
    region: "us-east-1"
    compression: "gzip"
    encoding:
      codec: "ndjson"

3. Kiểm tra (Validation): Cẩn tắc vô áy náy

Một trong những tính năng bị đánh giá thấp nhất của Vector là trình kiểm tra tích hợp. Nó phát hiện các lỗi cú pháp trước khi chúng có thể làm sập hệ thống logging production của bạn.

vector validate --config vector.yaml
vector --config vector.yaml

4. Viết Logic với VRL

VRL cho phép bạn viết logic dễ đọc thay vì lồng ghép các pattern Grok phức tạp. Ví dụ, để đánh dấu các yêu cầu API chậm:

.duration_ms = to_float!(.response_time) * 1000.0
.is_slow = .duration_ms > 500

if .is_slow {
  .priority = "high"
  .tags = push(.tags, "performance-alert")
}

Cách tiếp cận này giúp pipeline log của bạn dễ bảo trì và kiểm thử như chính code ứng dụng vậy.

Lời kết

Chuyển sang Vector không chỉ là tiết kiệm chi phí cloud cho chu kỳ CPU. Đó là về việc giành quyền kiểm soát hoàn toàn đối với luồng dữ liệu của bạn. Lợi ích về hiệu suất là không thể phủ nhận, nhưng chiến thắng thực sự là sự ổn định. Nếu bạn đã mệt mỏi với việc chống lại các lỗi heap của Logstash hoặc xung đột plugin của Fluentd, hãy bắt đầu thử nghiệm Vector cho một dịch vụ duy nhất. Bạn sẽ không muốn quay lại đâu.

Share: