Quay lại danh sách
Tin tức công nghệ

Tự Động Phân Vùng (Partitioning) Bảng Dữ Liệu Log Khổng Lồ Trong PostgreSQL Bằng pg_partman Trên Linux

1 tháng 6, 2026

Đặt Vấn Đề: Gánh Nặng Từ Những Bảng Dữ Liệu Log Khổng Lồ

Trong kỷ nguyên số hóa và kiến trúc vi dịch vụ (microservices) bùng nổ, lượng dữ liệu nhật ký hệ thống (log dữ liệu, audit log, transaction log) phát sinh mỗi ngày là vô cùng khổng lồ. Đối với các hệ quản trị cơ sở dữ liệu như PostgreSQL, việc lưu trữ hàng trăm triệu, thậm chí hàng tỷ bản ghi log trong một bảng duy nhất (monolithic table) theo thời gian sẽ dẫn đến những hệ lụy nghiêm trọng về mặt hiệu năng:

  • Hiệu năng truy vấn suy giảm nghiêm trọng: Khi kích thước bảng vượt quá bộ nhớ RAM, các thao tác tìm kiếm, quét chỉ mục (Index Scan) trở nên chậm chạp do hệ thống phải thực hiện nhiều tác vụ I/O trên ổ đĩa.
  • Chi phí bảo trì cực kỳ đắt đỏ: Tiến trình tự động dọn dẹp hệ thống (Auto-Vacuum) phải mất nhiều giờ, thậm chí nhiều ngày để xử lý một bảng lớn, gây chiếm dụng tài nguyên CPU và Disk I/O, ảnh hưởng trực tiếp đến các tiến trình nghiệp vụ khác.
  • Rủi ro khi xóa dữ liệu cũ: Việc chạy lệnh DELETE với điều kiện thời gian trên các bảng lớn không chỉ diễn ra rất chậm mà còn làm trầm trọng hơn tình trạng phình to dữ liệu (table bloat) do PostgreSQL sử dụng cơ chế MVCC.

Để giải quyết triệt để bài toán này, kỹ thuật Partitioning (Phân vùng dữ liệu) ra đời như một vị cứu tinh. Thay vì lưu trữ tập trung, dữ liệu được chia nhỏ thành các bảng độc lập (child tables) dựa trên một tiêu chí cụ thể (thường là thời gian đối với log). Tuy nhiên, việc quản lý phân vùng một cách thủ công – như tự tạo bảng mới cho ngày tiếp theo, di chuyển dữ liệu cũ – là một công việc nhàm chán và dễ xảy ra sai sót. Đó là lý do tại sao chúng ta cần đến pg_partman, một extension chuyên dụng hàng đầu giúp tự động hóa hoàn toàn quy trình này trên môi trường Linux.

pg_partman Là Gì Và Tại Sao Nên Lựa Chọn?

pg_partman (PostgreSQL Partition Manager) là một extension mã nguồn mở nổi tiếng, được thiết kế chuyên biệt để quản lý cả hai cơ chế phân vùng: phân vùng dựa trên khoảng giá trị (Range-based) và phân vùng dựa trên số dư (ID-based). Đối với dữ liệu log, phân vùng theo thời gian (Time-based Range Partitioning) là giải pháp tối ưu nhất.

“pg_partman không thay thế cơ chế Declarative Partitioning mặc định của PostgreSQL từ phiên bản 10 trở lên, mà đóng vai trò như một người quản trị tự động, lo liệu toàn bộ vòng đời của phân vùng từ lúc khởi tạo cho đến khi hạ tầng lưu trữ cần giải phóng.”

Những ưu điểm vượt trội khiến pg_partman trở thành tiêu chuẩn công nghiệp bao gồm: tự động tạo trước các phân vùng tương lai để tránh gián đoạn ghi dữ liệu, hỗ trợ dọn dẹp hoặc nén (archive) các phân vùng cũ tự động, tích hợp sâu với pg_cron hoặc Background Worker (BGW) của Postgres để chạy ngầm mà không cần script bash bên ngoài.

Hướng Dẫn Triển Khai Chi Tiết pg_partman Trên Máy Chủ Linux

Bước 1: Cài đặt Extension pg_partman

Tùy thuộc vào bản phân phối Linux và phiên bản PostgreSQL đang sử dụng, bạn có thể dễ dàng cài đặt pg_partman qua trình quản lý gói. Dưới đây là câu lệnh thực hiện trên hệ điều hành Ubuntu/Debian với PostgreSQL 16:

sudo apt-get update
sudo apt-get install postgresql-16-partman

Đối với hệ điều hành RHEL/Rocky Linux, bạn sử dụng kho lưu trữ PGDG và cài đặt qua dnf:

sudo dnf install postgresql16-pg_partman

Bước 2: Cấu hình Shared Preloaded Libraries

Để pg_partman có thể tự động chạy các tác vụ nền (Background Worker) mà không cần phụ thuộc vào bộ lập lịch bên ngoài, chúng ta cần khai báo nó trong tệp cấu hình chính của PostgreSQL. Mở tệp postgresql.conf (thường nằm tại /etc/postgresql/16/main/ trên Ubuntu):

shared_preload_libraries = 'pg_partman_bgw'

Sau khi lưu tệp cấu hình, tiến hành khởi động lại dịch vụ PostgreSQL để thay đổi có hiệu lực:

sudo systemctl restart postgresql

Bước 3: Khởi tạo Extension trong Cơ sở Dữ liệu

Truy cập vào giao diện dòng lệnh psql với quyền quản trị viên (superuser) và tạo một schema riêng cho pg_partman để giữ cho cơ sở dữ liệu luôn ngăn nắp, sau đó kích hoạt extension:

CREATE SCHEMA partman;
CREATE EXTENSION pg_partman SCHEMA partman;

Kịch Bản Thực Tế: Phân Vùng Bảng Application Logs Theo Ngày

Hãy cùng xây dựng một kịch bản thực tế: Chúng ta có một bảng lưu trữ log ứng dụng mang tên app_logs thuộc schema public. Bảng này nhận hàng chục triệu bản ghi mỗi ngày và cần được phân vùng tự động theo ngày.

1. Khởi tạo bảng cha (Parent Table) với cơ chế Declarative Partitioning

Đầu tiên, chúng ta tạo bảng cấu trúc chính. Lưu ý rằng cột dùng để phân vùng (ở đây là created_at) bắt buộc phải là một phần của khóa chính (Primary Key) nếu bảng có định nghĩa khóa chính.

CREATE TABLE public.app_logs (
    log_id BIGSERIAL,
    log_level VARCHAR(10) NOT NULL,
    message TEXT,
    component VARCHAR(50),
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    PRIMARY KEY (log_id, created_at)
) PARTITION BY RANGE (created_at);

2. Cấu hình pg_partman để quản lý bảng

Sử dụng hàm hàm khởi tạo create_parent được cung cấp sẵn bởi pg_partman để thiết lập cấu hình tự động phân vùng theo ngày (daily):

SELECT partman.create_parent(
    p_parent_table := 'public.app_logs',
    p_control := 'created_at',
    p_type := 'native',
    p_interval := 'daily',
    p_premake := 4
);

Trong đó:

  • p_parent_table: Tên đầy đủ bao gồm cả schema của bảng cha cần phân vùng.
  • p_control: Cột điều khiển dùng làm tiêu chí phân vùng (phải có kiểu dữ liệu thời gian hoặc số nguyên).
  • p_type: Chọn native để sử dụng cơ chế Declarative Partitioning tối ưu của PostgreSQL.
  • p_interval: Định kỳ phân vùng. daily nghĩa là mỗi ngày hệ thống sẽ có một bảng riêng.
  • p_premake: Số lượng phân vùng được tạo sẵn trước cho tương lai. Số 4 có nghĩa là pg_partman luôn tạo sẵn bảng cho 4 ngày tiếp theo, đảm bảo hệ thống không bao giờ bị thiếu bảng ghi dữ liệu.

3. Kiểm tra kết quả khởi tạo

Sau khi thực thi lệnh trên, pg_partman sẽ tự động tạo bảng phân vùng cho ngày hiện tại và 4 ngày kế tiếp. Bạn có thể kiểm tra danh sách các bảng con bằng lệnh:

\d+ public.app_logs

Tối Ưu Hóa Quy Trình Quản Lý Vòng Đời Dữ Liệu (Retention Policy)

Một trong những tính năng tuyệt vời nhất của pg_partman là khả năng tự động dọn dẹp các phân vùng quá cũ để giải phóng tài nguyên đĩa cứng. Giả sử doanh nghiệp của bạn chỉ có nhu cầu giữ lại log trong vòng 30 ngày gần nhất, các dữ liệu cũ hơn sẽ bị xóa bỏ.

Để thiết lập chính sách duy trì dữ liệu (Retention), chúng ta cập nhật bảng cấu hình của pg_partman:

UPDATE partman.part_config
SET retention := '30 days',
    retention_keep_table := false
WHERE parent_table = 'public.app_logs';

Nếu bạn đặt retention_keep_table := true, pg_partman sẽ chỉ ngắt liên kết (detach) bảng con ra khỏi bảng cha chứ không xóa hẳn bảng con đó khỏi ổ đĩa, giúp bạn có thể sao lưu (dump) ra hệ thống lưu trữ lạnh (Cold Storage) trước khi xóa hoàn toàn.

Kết Luận

Tự động hóa phân vùng bằng pg_partman là giải pháp chuẩn mực và tối ưu nhất hiện nay để quản lý các bảng dữ liệu log khổng lồ trên PostgreSQL chạy trên môi trường Linux. Nó giúp loại bỏ hoàn toàn các rủi ro do thao tác thủ công, duy trì hiệu năng truy vấn ở mức ổn định như ngày đầu tiên và tối ưu hóa không gian lưu trữ một cách thông minh. Đầu tư thời gian triển khai pg_partman ngay hôm nay chính là chìa khóa giúp hệ thống cơ sở dữ liệu của doanh nghiệp vận hành bền bỉ và sẵn sàng mở rộng trong tương lai.

Tự Động Phân Vùng (Partitioning) Bảng Dữ Liệu Log Khổng Lồ Trong PostgreSQL Bằng pg_partman Trên Linux | DPTCloud