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 setlog_min_duration_statementkhoảng500ms. 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_dumpmỗ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!

