Cấu hình chính sách giữ dữ liệu (Retention Policy)
Bước đầu tiên để quản lý dung lượng là thiết lập cơ chế tự động xóa dữ liệu cũ. TimescaleDB sử dụng extension timescaledb_toolkit hoặc hàm add_retention_policy để thực hiện việc này.
Chức năng này sẽ tạo một cron job bên trong PostgreSQL để quét và xóa các chunk (khối dữ liệu) đã quá thời gian quy định, giúp bảng không bao giờ bị tràn đĩa.
Thực thi câu lệnh SQL sau để đặt chính sách giữ dữ liệu trong 30 ngày cho hypertable conditions:
SELECT add_retention_policy('conditions', INTERVAL '30 days');
Kết quả mong đợi: PostgreSQL trả về ID của policy đã được tạo (ví dụ: 1). Không có lỗi hiển thị.
Verify kết quả Retention Policy
Kiểm tra danh sách các policy đang chạy bằng cách truy vấn catalog _timescaledb_catalog.retention_policies:
SELECT hypertable_name, retention_interval FROM _timescaledb_catalog.retention_policies WHERE hypertable_name = 'conditions';
Kết quả mong đợi: Thấy một dòng hiển thị conditions và 30 days (hoặc P30D).
Bật tính năng nén dữ liệu (Compression)
Để giảm đáng kể dung lượng ổ cứng, bạn cần bật tính năng Compression cho Hypertable. TimescaleDB sử dụng thuật toán Chunked Row Compression (CRoCo) để nén dữ liệu theo từng chunk.
Trước khi bật, bạn cần đảm bảo hypertable đã có dữ liệu. Sau đó, thực thi hàm alter_compression để kích hoạt chế độ nén mặc định.
Lệnh dưới đây bật nén cho tất cả các chunk mới được tạo trong hypertable conditions:
SELECT alter_compression('conditions', compress_segmentby => 'time', compress_orderby => 'time');
Kết quả mong đợi: Trả về ID của compression policy (ví dụ: 1). Lưu ý: Dữ liệu cũ đã tồn tại chưa được nén ngay lập tức, chỉ các chunk mới tạo sẽ được nén tự động.
Verify kết quả Compression Policy
Kiểm tra cấu hình nén hiện hành của hypertable:
SELECT hypertable_name, compress_segmentby, compress_orderby FROM _timescaledb_catalog.hypertables WHERE hypertable_name = 'conditions';
Kết quả mong đợi: Cột compress_segmentby và compress_orderby hiển thị giá trị time.
Tùy chỉnh thuật toán nén cho từng cột
Mặc định, TimescaleDB chỉ nén cột thời gian. Để tối ưu dung lượng cho các cột số hoặc chuỗi, bạn cần cấu hình cụ thể cho từng cột thông qua tham số compressby.
Giả sử bảng conditions có các cột: device_id (chuỗi), temperature (số thực), humidity (số thực). Ta sẽ áp dụng thuật toán phù hợp: deltadelta cho số liên tục, dict cho chuỗi lặp lại.
Thực thi lệnh SQL sau để tùy chỉnh thuật toán nén chi tiết:
SELECT alter_compression('conditions',
compress_segmentby => 'time',
compress_orderby => 'time',
compressby => '{device_id=dict,temperature=deltadelta,humidity=deltadelta}');
Kết quả mong đợi: Trả về ID policy cập nhật. Dữ liệu mới sẽ được nén theo các thuật toán đã chỉ định.
Verify kết quả tùy chỉnh
Kiểm tra chi tiết thuật toán nén áp dụng cho từng cột:
SELECT column_name, compression_algorithm FROM _timescaledb_catalog.compression WHERE hypertable_name = 'conditions';
Kết quả mong đợi: Danh sách các cột cùng với thuật toán tương ứng (ví dụ: device_id đi với dict, temperature đi với deltadelta).
Nén dữ liệu lịch sử (Backfill)
Việc bật compression chỉ ảnh hưởng đến dữ liệu tương lai. Để tiết kiệm dung lượng ngay lập tức cho dữ liệu cũ, bạn cần chạy lệnh nén thủ công (backfill) trên các chunk hiện có.
Lệnh compress_chunk sẽ nén một chunk cụ thể. Nếu chạy trên toàn bộ hypertable, TimescaleDB sẽ tự động xác định và nén các chunk chưa nén.
Thực thi lệnh sau để nén tất cả các chunk chưa nén của hypertable conditions:
SELECT compress_chunk(chunk) FROM timescaledb_information.chunks WHERE hypertable_name = 'conditions' AND NOT is_compressed;
Kết quả mong đợi: Trả về danh sách các ID chunk đã được nén thành công. Quá trình này có thể mất vài giây đến vài phút tùy lượng dữ liệu.
Đánh giá sự thay đổi về dung lượng và tốc độ
Sau khi thực hiện nén, bạn cần so sánh kích thước thực tế trên đĩa để xác định mức độ tiết kiệm.
Sử dụng hàm pg_size_pretty kết hợp với pg_total_relation_size để xem kích thước của hypertable trước và sau khi nén.
Thực thi câu lệnh SQL sau để kiểm tra kích thước hiện tại:
SELECT pg_size_pretty(pg_total_relation_size('conditions')) AS total_size;
Kết quả mong đợi: Con số hiển thị nhỏ hơn đáng kể so với trước khi thực hiện bước nén (thường giảm từ 50% đến 90% tùy dữ liệu).
Đánh giá tốc độ truy vấn
Nén dữ liệu giúp giảm lượng I/O khi đọc, từ đó tăng tốc độ truy vấn cho các dữ liệu đã qua nén (compressed chunks).
Thực thi lệnh EXPLAIN (ANALYZE, BUFFERS) trên một truy vấn chọn lọc theo thời gian để xem số lượng buffer đọc:
EXPLAIN (ANALYZE, BUFFERS) SELECT time, avg(temperature) FROM conditions WHERE time > NOW() - INTERVAL '30 days' GROUP BY time(1 hour);
Kết quả mong đợi: Trong phần Buffers, giá trị shared hit hoặc shared hit sẽ tăng lên so với shared read, chứng tỏ hệ thống đọc dữ liệu nén từ bộ nhớ cache hiệu quả hơn.
Verify tổng thể hệ thống
Tóm tắt trạng thái hiện tại của hypertable bao gồm cả retention và compression:
SELECT
hypertable_name,
is_compressed,
(SELECT retention_interval FROM _timescaledb_catalog.retention_policies WHERE hypertable_name = 'conditions') as retention_policy
FROM timescaledb_information.hypertables
WHERE hypertable_name = 'conditions';
Kết quả mong đợi: Một dòng duy nhất hiển thị is_compressed = true và retention_policy = 30 days.
Điều hướng series:
Mục lục: Series: Triển khai Database Time-Series với TimescaleDB và Ubuntu 24.04
« Phần 3: Khái niệm Hypertable và tạo bảng dữ liệu chuỗi thời gian
Phần 5: Truy vấn dữ liệu chuỗi thời gian với Continuous Aggregate »