1. Tạo Database và User riêng cho Object Store
Bước 1: Tạo người dùng (user) và cơ sở dữ liệu (database) chuyên biệt cho ứng dụng Object Store để cách ly dữ liệu và quản lý quyền truy cập an toàn.
Lý do: Không nên dùng user postgres mặc định cho ứng dụng. Việc tách biệt giúp giảm rủi ro bảo mật và dễ dàng audit (kiểm toán) hoạt động.
Kết quả mong đợi: User object_store_user được tạo với quyền sở hữu database object_store_db.
sudo -u postgres psql -c "CREATE USER object_store_user WITH PASSWORD 'YourSecurePassword123!';"
sudo -u postgres psql -c "CREATE DATABASE object_store_db OWNER object_store_user;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE object_store_db TO object_store_user;"
Verify: Chạy lệnh sau để kiểm tra user và database đã tồn tại:
sudo -u postgres psql -c "\du object_store_user"
sudo -u postgres psql -c "\l object_store_db"
2. Cấu hình pg_hba.conf để cho phép kết nối an toàn
Bước 1: Chỉnh sửa file cấu hình xác thực pg_hba.conf để cho phép user object_store_user kết nối từ IP của máy chủ ứng dụng hoặc localhost qua giao thức TCP (scram-sha-256).
Lý do: File này kiểm soát ai được phép kết nối vào PostgreSQL và bằng phương thức nào. Object Store thường cần kết nối qua mạng (TCP), không phải socket Unix.
Kết quả mong đợi: File cấu hình đã cập nhật, cho phép kết nối từ mạng nội bộ hoặc localhost với cơ chế mã hóa mật khẩu mạnh.
sudo nano /etc/postgresql/16/main/pg_hba.conf
Thêm các dòng sau vào cuối file (trước dòng local all all peer):
host object_store_db object_store_user 127.0.0.1/32 scram-sha-256
host object_store_db object_store_user 0.0.0.0/0 scram-sha-256
Lưu ý: Dòng 0.0.0.0/0 cho phép kết nối từ mọi IP. Trong môi trường production, hãy thay thế bằng IP cụ thể của server ứng dụng (ví dụ: 192.168.1.50/32).
sudo systemctl restart postgresql
Verify: Thử kết nối từ máy chủ ứng dụng (hoặc local) bằng lệnh:
psql -h 127.0.0.1 -U object_store_user -d object_store_db
3. Điều chỉnh tham số max_connections và shared_buffers trong postgresql.conf
Bước 1: Tối ưu hóa file cấu hình chính postgresql.conf để phù hợp với tải trọng của Object Store (nhiều kết nối đồng thời và I/O cao).
Lý do: Mặc định của PostgreSQL thường quá thấp cho hệ thống lưu trữ object cần nhiều kết nối song song. max_connections giới hạn số session, shared_buffers là bộ nhớ RAM dành riêng cho cache dữ liệu.
Kết quả mong đợi: Server PostgreSQL sẵn sàng xử lý hàng trăm kết nối đồng thời và sử dụng hiệu quả RAM cho cache.
sudo nano /etc/postgresql/16/main/postgresql.conf
Tìm và sửa các dòng sau (giả sử server có 16GB RAM):
max_connections = 500
shared_buffers = 4GB
effective_cache_size = 12GB
Giải thích tham số:
max_connections: Tăng từ 100 lên 500 để Object Store mở nhiều session cho các client upload/download.
shared_buffers: Đặt bằng 25% tổng RAM (4GB cho 16GB RAM). Đây là bộ nhớ dùng chung cho cache.
effective_cache_size: Đặt bằng 75% tổng RAM. PostgreSQL dùng tham số này để ước tính bộ nhớ hệ thống có thể dùng cho query planner.
sudo systemctl restart postgresql
Verify: Kiểm tra giá trị mới trong database:
sudo -u postgres psql -c "SHOW max_connections;"
sudo -u postgres psql -c "SHOW shared_buffers;"
sudo -u postgres psql -c "SHOW effective_cache_size;"
4. Tối ưu hóa bộ nhớ đệm cho các hoạt động đọc/ghi lớn
Bước 1: Điều chỉnh các tham số liên quan đến Write-Ahead Log (WAL) và Checkpoint để giảm độ trễ khi ghi dữ liệu lớn (large object writes).
Lý do: Object Store thực hiện ghi dữ liệu liên tục. Nếu không tối ưu, các lần checkpoint (lưu trạng thái vào disk) sẽ gây nghẽn I/O (I/O spike), làm chậm toàn bộ hệ thống.
Kết quả mong đợi: Giảm thiểu thời gian dừng hệ thống khi ghi dữ liệu, tăng thông lượng (throughput) ghi.
sudo nano /etc/postgresql/16/main/postgresql.conf
Thêm hoặc sửa các dòng sau trong cùng file:
checkpoint_completion_target = 0.9
wal_buffers = 64MB
default_buffers = 256MB
wal_compression = on
wal_level = replica
Giải thích:
checkpoint_completion_target = 0.9: Phân tán hoạt động checkpoint ra trong 90% thời gian giữa hai checkpoint, tránh I/O spike.
wal_buffers: Tăng bộ nhớ đệm cho log ghi (WAL), giúp ghi nhanh hơn vào RAM trước khi flush ra disk.
wal_compression: Nén dữ liệu WAL để giảm lượng I/O disk khi ghi dữ liệu lớn.
sudo systemctl restart postgresql
Verify: Kiểm tra các tham số đã được áp dụng:
sudo -u postgres psql -c "SHOW checkpoint_completion_target;"
sudo -u postgres psql -c "SHOW wal_buffers;"
Sau khi restart, hãy thực hiện một lần upload file thử nghiệm và quan sát load I/O của disk (dùng lệnh iostat -x 1) để đảm bảo không có hiện tượng spike bất thường.
Điều hướng series:
Mục lục: Series: Triển khai Database Object Store với PostgreSQL và Ubuntu 24.04
« Phần 1: Chuẩn bị môi trường Ubuntu 24.04 và cài đặt PostgreSQL
Phần 3: Triển khai phần mềm Object Store dựa trên PostgreSQL »