Hồ Sơ Định Cỡ Bảng Tick & Tự Động Hóa Nến OHLCV (Continuous Aggregates)
Thiết kế hệ thống tổng hợp khung thời gian 1m/5m/1h tự động từ luồng dữ liệu tần suất cao bằng Continuous Aggregates của TimescaleDB trên TimescaleOps.
Quét trực tiếp hàng trăm triệu dòng dữ liệu thô mỗi lần tải biểu đồ 30 ngày gây lãng phí nhân CPU và cạnh tranh I/O với luồng ghi trực tiếp. Continuous Aggregates tính sẵn các khung thời gian đã đóng và chỉ ghép thêm phần dữ liệu mới nhất ở phút hiện tại.
| Quy Mô Luồng Mẫu | Chu Kỳ Chunk / Phân Vùng | RAM DDR5 Khuyến Nghị | Dung Lượng Ổ Đĩa Ước Tính | Cấu Hình Hạ Tầng Tham Chiếu |
|---|---|---|---|---|
| 50 Streams • 1K events/s | 7d / 1d |
8 GB DDR5 | 128 GB Local NVMe | Vultr HF 8GB / Hostinger KVM 2 |
| 250 Streams • 10K events/s | 1d |
16 GB DDR5 | 384 GB Local NVMe | Vultr HF 16GB (3.5GHz+) |
| 1,000 Streams • 50K events/s | 6h |
32 GB DDR5 | 2 TB NVMe / ZFS | InterServer Ryzen 64GB |
| High-Density 150K events/s | 6h / 1h |
64 GB DDR5 | 6 TB ZFS Vault | InterServer Bare-Metal + Vultr Ingest |
CREATE MATERIALIZED VIEW ohlcv_1m
WITH (timescaledb.continuous, timescaledb.materialized_only = false) AS
SELECT
time_bucket('1 minute', ts) AS bucket,
symbol_id,
venue_id,
first(last_px, ts) AS open,
max(last_px) AS high,
min(last_px) AS low,
last(last_px, ts) AS close,
sum(last_qty) AS volume,
sum(last_px * last_qty) / NULLIF(sum(last_qty), 0) AS vwap
FROM market_ticks_ohlcv
GROUP BY bucket, symbol_id, venue_id
WITH NO DATA;
SELECT add_continuous_aggregate_policy('ohlcv_1m',
start_offset => INTERVAL '2 hours',
end_offset => INTERVAL '1 minute',
schedule_interval => INTERVAL '1 minute');
1. Đặt Trạm Thu Thập TimescaleDB Trên Hạ Tầng Xung Nhịp Đơn Nhân Cao & Local NVMe
Tiến trình phân tích luồng dữ liệu và chèn lô COPY vào PostgreSQL phụ thuộc lớn vào xung nhịp đơn nhân CPU. Đặt máy chủ thu thập trên ổ Local NVMe xung nhịp 3.5GHz+ gần nguồn phát dữ liệu giúp giảm hàng đợi TCP.
2. Tổng Hợp Đa Tầng (Hierarchical Continuous Aggregates) Trong TimescaleDB
Từ TimescaleDB 2.9+, bạn có thể tạo khung tổng hợp 1 phút (ohlcv_1m) từ bảng gốc, sau đó xây tiếp các bảng 15m, 1h, 1d chồng trực tiếp lên ohlcv_1m để tiến trình làm mới chỉ đọc 60 dòng mỗi giờ thay vì quét lại dữ liệu thô.
3. Bật Nén Cột TimescaleDB Cho Cả Bảng Gốc Lẫn Bảng Tổng Hợp Lịch Sử
Bản thân mỗi Continuous Aggregate cũng là một hypertable. Kết hợp nén cột sau 7 ngày cho bảng thô và sau 14 ngày cho bảng ohlcv_1m giúp lưu trữ nhiều năm dữ liệu tổng hợp rất gọn nhẹ.
Câu Hỏi Kỹ Thuật Về TS-02 // OHLCV-CAGG Trên TimescaleOps
Nên lưu mã định danh trong hypertable TimescaleDB dạng TEXT hay số nguyên INT?
Hãy ánh xạ chuỗi ký tự sang bảng danh mục dùng khóa SMALLINT hoặc INT. Khóa số nguyên giúp thu gọn kích thước chỉ mục B-tree trên RAM.
Làm sao ghi 50.000 dòng/giây từ Python hoặc Rust vào TimescaleDB hiệu quả?
Gom đệm 2.000–10.000 dòng trong RAM (hoặc chu kỳ 250ms) rồi đẩy xuống bằng giao thức nhị phân COPY của PostgreSQL thay vì chạy từng lệnh INSERT lẻ.
Cờ materialized_only = false có làm chậm truy vấn Continuous Aggregate không?
Không đáng kể nếu bạn giữ end_offset ở mức 1 phút, vì khi đó PostgreSQL chỉ quét thêm tối đa 60 giây cuối của bảng nóng.