0

Greenplum Database Bài học 15: Kỹ thuật nén dữ liệu (Compression): So sánh ZSTD, QuickLZ và Zlib trên bảng Columnar

Ở Bài học 14, chúng ta đã mở cánh cửa đến với mô hình lưu trữ hướng cột (AOCO - Append-Optimized Column-Oriented). Một trong những lý do lớn nhất khiến AOCO trở thành "vũ khí tối thượng" cho Data Warehouse chính là khả năng nén dữ liệu siêu việt, giúp giảm dung lượng ổ cứng từ vài Terabyte xuống chỉ còn vài trăm Gigabyte.

Tuy nhiên, nén dữ liệu không bao giờ là một "bữa ăn miễn phí". Nó đánh đổi chu kỳ tính toán của CPU để lấy không gian lưu trữ và băng thông đĩa. Trong bài học này, chúng ta sẽ mổ xẻ ba thuật toán nén phổ biến nhất trên Greenplum: ZSTD, QuickLZ và Zlib, từ đó biết cách chọn cấu hình hoàn hảo cho từng bài toán thực tế.

1. Bản chất của Nén dữ liệu trên bảng Columnar (AOCO)

Trong cấu trúc lưu trữ hướng cột của Greenplum, dữ liệu của từng cột được gom lại thành các khối nhỏ (Compression Blocks) trước khi ghi xuống đĩa.

Khi một câu truy vấn chạy:

  1. Greenplum đọc khối dữ liệu nén từ đĩa lên RAM.

  2. CPU tiến hành giải nén (Decompression) khối dữ liệu đó thành dạng thô.

  3. Tiến hành thực thi phép toán (SELECT, SUM, WHERE).

Vì vậy, hiệu năng tổng thể phụ thuộc vào một bài toán cân bằng tinh tế: Thời gian tiết kiệm được do đọc ít dữ liệu từ ổ cứng hơn có lớn hơn thời gian CPU bỏ ra để giải nén hay không?

2. "Tam hùng" thuật toán nén trên Greenplum

Greenplum hỗ trợ nhiều thuật toán nén khác nhau, nhưng ba cái tên dưới đây xuất hiện trong 99% các hệ thống Enterprise Data Warehouse:

┌────────────────────────────────────────────────────────────────────────┐
│                        TAM HÙNG THUẬT TOÁN NÉN                         │
└───────────────────────────┬────────────────┬───────────────────────────┘
                            │                │
                        1. ZSTD          2. QuickLZ          3. Zlib
                        (Cân bằng hoàn   (Tốc độ cực nhanh,  (Tỷ lệ nén cao,
                         hảo: Nén cao,   tải CPU thấp)       tốn nhiều CPU)
                         tốc độ tốt)

2.1. ZSTD (Zstandard — Lựa chọn hàng đầu hiện nay)

ZSTD là thuật toán nén hiện đại do Facebook phát triển và đã trở thành tiêu chuẩn vàng trong các hệ thống Big Data hiện đại (Greenplum 6/7, ClickHouse, Kafka).

  • Đặc điểm: Cung cấp tỷ lệ nén dữ liệu rất cao (thường vượt trội hơn Zlib) nhưng tốc độ giải nén và nén lại cực kỳ nhanh (nhờ thuật toán tìm kiếm mẫu tối ưu).

  • Cấp độ nén (compressionlevel): Từ 1 đến 19.

    • Mức 1 - 3: Nén cực nhanh, phù hợp với các bảng có lưu lượng INSERT thời gian thực lớn.

    • Mức 5 - 9: Tỷ lệ nén tối ưu, cân bằng hoàn hảo giữa dung lượng đĩa và tải CPU.

  • Khuyên dùng: Là lựa chọn mặc định số 1 cho hầu hết các bảng AOCO trong các hệ thống Greenplum hiện đại.

2.2. QuickLZ (Tốc độ thần tốc, đánh đổi tỷ lệ nén)

QuickLZ nổi tiếng là một trong những thuật toán nén tốc độ cao nhất thế giới.

  • Đặc điểm: Tốn cực kỳ ít tài nguyên CPU cho việc nén và giải nén. Tuy nhiên, đổi lại, tỷ lệ nén của QuickLZ thấp hơn đáng kể so với ZSTD hay Zlib (dữ liệu giảm dung lượng ít hơn).

  • Khuyên dùng: Phù hợp với các hệ thống có CPU yếu, hoặc các bảng dữ liệu cực lớn có tần suất truy vấn đọc (Read) liên tục với cường độ cao mà hệ thống không muốn tốn chu kỳ CPU cho việc giải nén.

2.3. Zlib (Thuật toán truyền thống, ổn định)

Zlib là thuật toán nén kinh điển dựa trên chuẩn DEFLATE (tương tự như công cụ gzip).

  • Đặc điểm: Tỷ lệ nén khá tốt và độ tương thích cao. Tuy nhiên, tốc độ nén/giải nén của Zlib chậm hơn đáng kể so với ZSTD, dễ gây ra hiện tượng nghẽn CPU (CPU Bottleneck) khi chạy các câu truy vấn lớn quét toàn bộ bảng.

  • Khuyên dùng: Thường ít được ưu tiên chọn mới trên các hệ thống Greenplum đời mới (vốn đã có ZSTD tối ưu hơn về mọi mặt), chủ yếu tồn tại ở các hệ thống cũ cần tương thích ngược.

3. Bảng so sánh chi tiết các thuật toán nén

Tiêu chí so sánh ZSTD (Zstandard) QuickLZ Zlib (Gzip-based)
Tỷ lệ nén (Compression Ratio) Cao đến Rất cao (Tiết kiệm không gian đĩa tối đa). Thấp đến Trung bình (Dung lượng file lớn hơn). Khá cao (Cân bằng tốt giữa dung lượng và hiệu năng).
Tốc độ giải nén (Decompression Speed) Rất nhanh (Tối ưu hóa cực tốt cho truy vấn OLAP). Cực kỳ nhanh (Tốc độ xử lý thô vượt trội). Chậm hơn so với ZSTD và QuickLZ.
Tải tiêu thụ CPU (CPU Overhead) Thấp - Trung bình (Cân bằng tuyệt vời). Rất thấp (Gần như không tốn tải CPU). Cao (Tiêu tốn nhiều chu kỳ CPU hơn khi giải nén).
Dải tùy chỉnh cấp độ (Levels) Rộng (Từ 1 đến 19), linh hoạt tùy chỉnh theo nhu cầu. Cố định / Hạn chế mức độ tùy biến. Tiêu chuẩn (Từ 1 đến 9).
Độ trưởng thành trên Greenplum Chuẩn mực từ phiên bản Greenplum 6 & 7. Được hỗ trợ lâu đời trong hệ sinh thái Greenplum. Được hỗ trợ lâu đời trong hệ sinh thái Greenplum.
Đánh giá & Khuyên dùng cho Production Tuyệt vời (Là lựa chọn hàng đầu được khuyên dùng hiện nay). Phù hợp khi ưu tiên tuyệt đối tốc độ xử lý của CPU. Ít ưu tiên hơn ZSTD trong các hệ thống Big Data hiện đại.

4. Cú pháp thực chiến cấu hình nén trên Greenplum

Khi tạo bảng AOCO, bạn khai báo tham số compresstype và compressionlevel trực tiếp trong mệnh đề WITH:

SQL

-- 1. Sử dụng ZSTD với mức độ nén tối ưu (Cân bằng tốt nhất)
CREATE TABLE fact_orders_zstd (
    order_id BIGINT,
    customer_id BIGINT,
    order_amount NUMERIC(12,2),
    order_status VARCHAR(20),
    created_at TIMESTAMP
) 
WITH (
    appendoptimized = true,
    orientation = column,
    compresstype = zstd,
    compressionlevel = 5
)
DISTRIBUTED BY (customer_id);

-- 2. Sử dụng QuickLZ khi hệ thống ưu tiên tốc độ xử lý CPU tối đa
CREATE TABLE fact_logs_quicklz (
    log_id BIGINT,
    log_message TEXT,
    log_level VARCHAR(10),
    logged_at TIMESTAMP
) 
WITH (
    appendoptimized = true,
    orientation = column,
    compresstype = quicklz
)
DISTRIBUTED RANDOMLY;

5. Kinh nghiệm thực chiến của DBA khi chọn thuật toán nén

  1. Đừng đẩy mức nén (compressionlevel) lên quá cao một cách mù quáng: Nhiều kỹ sư nghĩ rằng chọn zstd mức 19 sẽ giúp tiết kiệm ổ cứng tối đa. Thực tế, mức 19 làm tốc độ nén chậm đi hàng chục lần và tiêu thụ lượng lớn RAM/CPU khi giải nén, trong khi dung lượng đĩa tiết kiệm thêm được so với mức 5 hoặc 7 là không đáng kể. Mức 3 đến 6 là "điểm ngọt" (sweet spot) cho đa số ứng dụng.

  2. Kiểm tra dung lượng thực tế sau khi nén: Bạn có thể sử dụng câu lệnh pg_size_pretty(pg_total_relation_size('table_name')) trước và sau khi chuyển đổi bảng sang AOCO kèm ZSTD để đo lường chính xác không gian đĩa mà hệ thống đã tiết kiệm được.

Tóm tắt Bài học 15

  • Nén dữ liệu trên bảng Columnar giúp tiết kiệm dung lượng ổ cứng khổng lồ, đổi lại CPU sẽ tốn thêm một phần chu kỳ để giải nén khi truy vấn.

  • ZSTD là thuật toán nén xuất sắc nhất hiện nay nhờ cân bằng hoàn hảo giữa tỷ lệ nén cao và tốc độ giải nén siêu việt.

  • QuickLZ phù hợp khi cần tiết kiệm tối đa tải CPU, trong khi Zlib ít được ưu tiên hơn trên các hệ thống Greenplum hiện đại.

  • "Điểm ngọt" cấu hình mức nén thường nằm ở khoảng cấp độ 3 đến 6.

Ở bài học tiếp theo (Bài học 16), chúng ta sẽ bước sang một kỹ thuật thiết kế bảng nâng cao giúp quản lý hàng tỷ bản ghi chuỗi thời gian: Thiết kế Partitioning (Phân vùng bảng): Chiến lược Range và List Partitioning cho dữ liệu Time-Series.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí