Production Engineering: vận hành Cube

    Triển khai thành nhiều node, cấu hình biến môi trường, bảo mật, giám sát, xử lý sự cố và phát hành an toàn.

    Trần Ngọc Đăng KhôiChương 05 / 0712 phút đọc
    Mục lục chương
      Ý chính của chươngTrên production, Cube được tách thành node phục vụ API, node cache và node build nền. Các yêu cầu còn lại là bảo đảm cụm này an toàn, giám sát được và phát hành phiên bản mới mà không gián đoạn.
      05.1

      Kiến trúc triển khai

      Cụm gồm ba nhóm node với chức năng riêng: tiếp nhận truy vấn, lưu cache và build nền.

      Handbook mô tả một cụm High Availability chạy trên Kubernetes hoặc Cube Cloud. Handbook gọi các node API là router nodes; theo tài liệu Cube, đó là các API instance, còn router là thành phần của Cube Store. API instance tiếp nhận request từ client, kiểm tra RLS, biên dịch SQL và quản lý cache kết quả. Cube Store gồm một router node điều phối và các worker lưu trữ, xử lý pre-aggregation. Refresh worker chạy nền, build và refresh pre-aggregations theo lịch.

      Chọn một node hoặc một luồng xử lý
      Hình 1Sơ đồ cụm production theo handbook. Ô data warehouse được bổ sung để thể hiện điểm cuối của luồng build.
      Ghi nhớCần ít nhất hai API instance sau load balancer để API vẫn hoạt động khi một node gặp sự cố. Tác vụ build nặng được giao cho refresh worker nên không chiếm tài nguyên phục vụ truy vấn.
      05.2

      Biến môi trường và secrets

      Trên production, hành vi của Cube chủ yếu do một số biến môi trường CUBEJS_ quyết định.

      Biến cấu hình của Cube dùng tiền tố CUBEJS_ (từ v0.28, nhóm biến Redis cũng chuyển sang tiền tố này); riêng Cube Store dùng tiền tố CUBESTORE_. Chọn từng biến để xem giá trị khuyến nghị trên production và tác dụng tương ứng. Hai biến bắt buộc phải cấu hình đúng: CUBEJS_DEV_MODE phải là false, CUBEJS_API_SECRET phải là chuỗi bí mật riêng của production.

      Hình 2Năm biến quan trọng nhất khi triển khai lên production.

      Biến cần hiểu kỹ nhất là CUBEJS_ROLLUP_ONLY, tức rollup-only mode. Khi bật chế độ này, mọi truy vấn chỉ được trả lời từ pre-aggregations; truy vấn nào chưa có bảng rollup phù hợp sẽ không được gửi xuống data warehouse nguồn.

      Đọc sâuMột file .env mẫu cho API instance
      .envproduction
      CUBEJS_DB_TYPE=postgres
      CUBEJS_DB_PASS=<DB_PASSWORD>
      CUBEJS_API_SECRET=<API_SECRET>
      CUBEJS_DEV_MODE=false
      CUBEJS_ROLLUP_ONLY=true

      Trên node refresh worker, thêm CUBEJS_REFRESH_WORKER=true. Biến này thay cho CUBEJS_SCHEDULED_REFRESH_TIMER cũ. Secrets nên được cung cấp từ secret manager của hạ tầng và không được commit vào Git.

      05.3

      Xác thực và bảo mật

      Ba lớp bảo vệ: secret ký JWT đủ mạnh, TLS, và giới hạn nguồn được phép gọi API.

      Cube dùng CUBEJS_API_SECRET để kiểm tra chữ ký JWT trong mỗi request. Nếu secret yếu, bất kỳ ai cũng có thể tự ký token và mạo danh tenant khác. Hai lớp còn lại là TLS cho mọi API và giới hạn nguồn truy cập: CORS chỉ chấp nhận các domain trong whitelist, SQL API chỉ mở cho dải IP nội bộ.

      Hình 3Ba cấu hình bảo mật bắt buộc theo handbook.
      05.4

      Logs, metrics và giám sát

      Log dạng JSON, bốn chỉ số chính và cảnh báo tự động khi latency vượt ngưỡng.

      Handbook đề xuất xuất log dạng JSON để Fluentd hoặc Logstash thu thập, đồng thời kết nối endpoint Prometheus /metrics với Grafana hoặc Datadog. Chọn từng chỉ số để xem ý nghĩa.

      Hình 4Kéo thanh trượt để xem khi nào cảnh báo P95 > 2 giây được kích hoạt. Ngưỡng 2 giây là gợi ý của handbook.
      Ghi nhớP95 là mức thời gian mà 95% request hoàn thành nhanh hơn. Chỉ số này phản ánh phần đuôi chậm mà giá trị trung bình che khuất.
      05.5

      Xử lý sự cố hiệu năng

      Xác định truy vấn chậm, tìm nguyên nhân không trúng pre-aggregation, sau đó kiểm tra queue.

      Quy trình gồm ba bước dưới đây. Phần lớn truy vấn chậm là do pre-aggregation miss: truy vấn bị chuyển xuống data warehouse thay vì đọc từ Cube Store. Lý do miss thường là granularity, thiếu dimension, hoặc khoảng thời gian nằm ngoài refresh_range. Nếu nguyên nhân không phải miss, cần kiểm tra queue length.

      Hình 5Quy trình ba bước khi P95 tăng.
      05.6

      Lỗi thường gặp trên production

      Bốn lỗi thường gặp và cách xử lý nhanh cho từng lỗi.

      Chọn lỗi để xem hiện tượng, nguyên nhân gốc và bước xử lý. Hai cách sửa phổ biến nhất là bọc điều kiện bằng FILTER_GROUP và cấu hình export bucket khi build rollup. Chương 06 trình bày cú pháp sửa cụ thể.

      Hình 6Hiện tượng → nguyên nhân → xử lý.
      05.7

      CI/CD và phát hành

      Data model là code, nên mỗi thay đổi cần đi qua PR, kiểm tra tự động, môi trường thử nghiệm và rolling update.

      Quy trình Git-first trong handbook có bốn bước, kết thúc bằng rolling update trên Kubernetes. Chọn từng bước để xem nội dung kiểm tra.

      Hình 7Từ Pull Request tới production.
      Ghi nhớCần chuẩn bị sẵn phương án quay lại Docker image trước đó. Rolling update tránh gián đoạn dịch vụ nhưng không thay thế được kịch bản rollback.
      05.8

      Checklist sẵn sàng production

      Sáu hạng mục cần hoàn tất trước khi đưa Cube vào phục vụ người dùng thực tế.

      Đánh dấu các hạng mục đã hoàn tất. Trạng thái được lưu trong trình duyệt này. Các ngưỡng (cache hit > 80%, lỗi 5xx > 1%, P95 > 2 giây) là gợi ý của handbook, cần điều chỉnh theo hệ thống thực tế.

      Hình 8Production readiness checklist.
      Chương tiếp theo06 · Reference & Engineering Notes→