Cài đặt PostgreSQL 16 trên CentOS Stream 9: Bí kíp ‘sống sót’ trong môi trường Production

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Tại sao PostgreSQL trên CentOS Stream 9 lại đáng dùng?

Vừa rồi mình mới hoàn tất đợt “chuyển nhà” cho một loạt hệ thống từ CentOS 7 lên CentOS Stream 9. Qua đó, mình nhận ra cài PostgreSQL để “chạy được” thì dễ, nhưng để “chạy ngon” trong production thì lại là chuyện khác. Sự khác biệt nằm ở cách bạn xử lý SELinux, Firewalld và phân quyền truy cập.

PostgreSQL vốn là con “ngựa thồ” lì lợm cho các hệ thống cần độ tin cậy cao. Kết hợp với CentOS Stream 9, chúng ta có một nền tảng hiện đại với kernel mới và bảo mật khắt khe. Bài viết này đúc kết từ 6 tháng vận hành thực tế các cụm DB cho mảng Fintech. Đây là nơi chỉ cần một sai sót nhỏ ở rule SELinux cũng đủ khiến hệ thống đứng hình.

Quick Start: Cài đặt PostgreSQL 16 trong 5 phút

Nếu bạn cần dựng nhanh một instance để test, hãy dùng các lệnh dưới đây. Mình chọn bản 16 vì đây là phiên bản ổn định nhất hiện nay.

# 1. Thêm repository chính thức của PostgreSQL
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 2. Vô hiệu hóa module postgresql mặc định để tránh xung đột
sudo dnf -qy module disable postgresql

# 3. Cài đặt PostgreSQL 16 server
sudo dnf install -y postgresql16-server

# 4. Khởi tạo database
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

# 5. Kích hoạt và chạy dịch vụ
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16

Bạn hãy kiểm tra lại bằng lệnh: systemctl status postgresql-16. Nếu dòng chữ active (running) màu xanh hiện lên là bạn đã thành công bước đầu.

Cấu hình thực chiến cho môi trường Production

1. Bảo mật tài khoản postgres

Mặc định, PostgreSQL dùng cơ chế peer cho kết nối nội bộ. Nó sẽ tin tưởng hoàn toàn user hệ thống. Để quản trị chuyên nghiệp, bạn nên đặt mật khẩu riêng cho user postgres trong database.

sudo -u postgres psql
# Trong giao diện psql, gõ:
ALTER USER postgres WITH PASSWORD 'mat_khau_sieu_kho_cua_ban';
\q

2. Cấu hình Firewalld: Đừng tắt, hãy mở đúng cổng

Nhiều bạn thường tắt luôn Firewall cho rảnh nợ. Trên CentOS Stream 9, đây là sai lầm chết người. Thay vào đó, hãy chỉ mở đúng cổng 5432 để đảm bảo an toàn.

# Thêm service postgresql vào zone public
sudo firewall-cmd --permanent --add-service=postgresql

# Reload lại cấu hình để áp dụng thay đổi
sudo firewall-cmd --reload

3. Xử lý SELinux: Nỗi ám ảnh của sysadmin

SELinux thường là lý do khiến database không thể khởi động hoặc không ghi được log. Lỗi này hay gặp nhất khi bạn đổi thư mục lưu data (Data Directory) sang ổ cứng ngoài, ví dụ /data/pgsql.

Nếu bạn thay đổi đường dẫn mặc định, hãy chạy lệnh sau để cập nhật context cho SELinux:

sudo semanage fcontext -a -t postgresql_db_t "/data/pgsql(/.*)?"
sudo restorecon -Rv /data/pgsql

Kinh nghiệm xương máu của mình: Hãy luôn để SELinux ở chế độ Enforcing. Đừng chuyển sang Permissive chỉ vì lười fix lỗi. Việc tuân thủ SELinux giúp server của bạn trụ vững trước các đợt scan lỗ hổng tự động.

Mở kết nối từ xa (Remote Access)

Mặc định PostgreSQL chỉ lắng nghe kết nối từ localhost. Để ứng dụng từ server khác truy cập được, bạn cần chỉnh sửa hai file cấu hình sau.

Sửa file postgresql.conf

Mở file tại: /var/lib/pgsql/16/data/postgresql.conf. Tìm dòng listen_addresses và sửa thành:

listen_addresses = '*' 

Mẹo nhỏ: Dùng dấu * sẽ nghe trên mọi card mạng. Nếu server có IP riêng cho mạng nội bộ, bạn nên chỉ định IP đó để tăng tính bảo mật.

Sửa file pg_hba.conf

Đây là file kiểm soát quyền login. Bạn hãy thêm dòng này vào cuối file /var/lib/pgsql/16/data/pg_hba.conf:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             192.168.1.0/24          scram-sha-256

Mình ưu tiên dùng scram-sha-256 vì nó an toàn hơn md5 cũ. Đừng quên thay 192.168.1.0/24 bằng dải IP nội bộ của bạn. Cuối cùng, restart lại dịch vụ:

sudo systemctl restart postgresql-16

4 lưu ý để Database chạy mượt hơn

Dưới đây là những tinh chỉnh giúp mình tránh được các cuộc gọi khẩn cấp lúc nửa đêm:

  • Tăng Shared Buffers: PostgreSQL để mặc định rất thấp (128MB). Với server RAM 8GB, mình thường đẩy lên 2GB (tương đương 25% RAM). Thay đổi này có thể giúp tốc độ đọc dữ liệu tăng đáng kể.
  • Săn tìm Slow Queries: Trong postgresql.conf, hãy set log_min_duration_statement khoảng 500ms. Mọi câu lệnh chạy chậm hơn mức này sẽ bị “ghi sổ” để bạn dễ dàng tối ưu sau này.
  • Backup tự động: Đừng bao giờ tin vào độ bền của ổ cứng. Hãy dùng cronjob chạy pg_dump mỗi đêm. Sau đó, đẩy file backup sang một server khác hoặc S3 storage.
  • Giám sát hiệu năng: Hãy cài thêm extension pg_stat_statements. Đây là công cụ mạnh nhất để soi xem câu query nào đang ngốn CPU của bạn nhiều nhất.

Triển khai PostgreSQL trên CentOS Stream 9 không khó nếu bạn nắm vững quy tắc về bảo mật. Điểm mấu chốt là hãy làm việc cùng hệ điều hành thay vì tìm cách tắt các lớp bảo vệ của nó. Chúc anh em xây dựng được hệ thống database ổn định!

Share: