Vì sao pg_dump là chưa đủ cho môi trường Production?
Lúc mới bắt đầu quản trị Postgres, mình cứ nghĩ pg_dump mỗi đêm là đủ. Cho đến khi database hệ thống chạm mốc 500GB và khách hàng yêu cầu khôi phục dữ liệu đúng vào lúc 10:15 sáng—thời điểm nằm giữa hai bản backup. Lúc này, pg_dump hoàn toàn bất lực vì nó chỉ cho phép bạn quay lại trạng thái của đêm hôm trước. Mọi giao dịch trong 10 tiếng buổi sáng coi như mất trắng.
Đó là lý do mình chuyển sang dùng Barman (Backup and Recovery Manager). Đây là công cụ mã nguồn mở giúp quản lý sao lưu PostgreSQL theo tiêu chuẩn doanh nghiệp. Điểm “ăn tiền” nhất của Barman là hỗ trợ Point-in-Time Recovery (PITR). Bạn có thể dễ dàng phục hồi database về đúng một mốc thời gian cụ thể, chính xác đến từng giây, ngay trước khi sự cố xảy ra.
Quick Start: Cài đặt Barman trong 5 phút
Để đảm bảo an toàn, bạn nên cài Barman trên một server riêng biệt. Điều này giúp bảo vệ bản sao lưu nếu chẳng may server database gặp sự cố phần cứng hoặc cháy nổ.
1. Cài đặt Barman
# Trên Ubuntu/Debian
sudo apt update
sudo apt install barman barman-cli -y
2. Cấu hình SSH không mật khẩu
Barman cần quyền truy cập vào DB server qua user postgres để sao chép dữ liệu thô. Hãy tạo key và copy sang DB server bằng lệnh sau:
# Chuyển sang user barman trên Barman server
sudo su - barman
ssh-keygen -t rsa
ssh-copy-id postgres@<IP_DB_SERVER>
3. Cấu hình Server trong Barman
Tạo file cấu hình tại /etc/barman.d/pg_production.conf:
[pg_production]
description = "Main PostgreSQL Production Database"
conninfo = host=<IP_DB_SERVER> user=barman dbname=postgres
ssh_command = ssh postgres@<IP_DB_SERVER>
retention_policy = RECOVERY WINDOW OF 2 WEEKS
archiver = on
4. Chạy backup lần đầu
# Kiểm tra kết nối
barman check pg_production
# Thực hiện backup
barman backup pg_production
Cơ chế WAL Archive – Linh hồn của PITR
Sức mạnh của Barman nằm ở cách nó xử lý WAL (Write-Ahead Logging). Trong Postgres, mọi thay đổi dữ liệu đều được ghi vào các file log nhỏ (thường là 16MB). Barman sẽ liên tục thu thập (archive) các file này về server lưu trữ.
Khi cần khôi phục, Barman lấy một bản Base Backup (bản sao đầy đủ) rồi lần lượt áp dụng các file WAL theo đúng trình tự thời gian. Quá trình này giống như việc bạn tua lại một cuốn băng video đến đúng phân cảnh mình muốn xem. Đây chính là bản chất của Point-in-Time Recovery (PITR).
Cấu hình đẩy log từ PostgreSQL Server
Sửa file postgresql.conf trên DB server để kích hoạt chế độ đẩy log sang Barman:
wal_level = replica
archive_mode = on
archive_command = 'rsync -a %p barman@<IP_BARMAN_SERVER>:/var/lib/barman/pg_production/incoming/%f'
Kinh nghiệm thực tế cho thấy các file WAL có thể tích tụ rất nhanh. Nếu không quản lý tốt, chúng sẽ làm đầy ổ cứng chỉ trong vài giờ cao điểm. Barman giúp bạn giải quyết việc này bằng cách tự động nén và xóa các file cũ dựa trên chính sách lưu trữ (retention policy) đã thiết lập.
Tuyệt chiêu Point-in-Time Recovery (Cứu thua phút chót)
Hãy tưởng tượng kịch bản ác mộng: Một script migration bị lỗi chạy lúc 2h sáng và xóa sạch bảng customers. Với Barman, bạn không cần phải hoảng loạn. Chỉ cần xác định thời điểm 01:59:59—ngay trước khi lệnh lỗi thực thi.
Lệnh khôi phục về một thời điểm cụ thể:
barman recover --target-time "2023-10-27 01:59:59" \
pg_production \
/path/to/new/data/directory
Lúc này, Barman tự động tính toán cần lấy bản backup nào và những file WAL nào để phục hồi. Sau khi hoàn tất, bạn chỉ việc trỏ database vào thư mục mới và khởi động lại. Hệ thống sẽ hoạt động như chưa từng có lỗi xảy ra.
Kinh nghiệm thực chiến khi vận hành Barman
Tối ưu dung lượng lưu trữ
Database 1TB của mình ban đầu backup tốn rất nhiều không gian. Sau khi bật compression = gzip trong file cấu hình, dung lượng backup giảm hơn 65%, chỉ còn khoảng 350GB. Điều này giúp tiết kiệm đáng kể chi phí ổ cứng mà không làm chậm quá trình phục hồi quá nhiều.
Đừng quên giám sát (Monitoring)
Backup tự động không có nghĩa là bạn có thể bỏ mặc nó. Mình luôn cài đặt một job cron chạy barman check mỗi giờ. Nếu trạng thái không phải OK—ví dụ do ổ cứng đầy hoặc lỗi SSH—hệ thống sẽ ngay lập tức gửi cảnh báo qua Telegram. Tin mình đi, phát hiện lỗi backup lúc đang rảnh rỗi tốt hơn nhiều so với việc phát hiện nó lúc database vừa bị sập.
Xử lý dữ liệu sau khi phục hồi
Nhiều khi sau khi restore để debug, mình cần trích xuất nhanh dữ liệu ra CSV để so sánh. Để chuyển đổi CSV sang JSON phục vụ việc phân tích hoặc import vào các công cụ NoSQL, mình thường dùng công cụ tại toolcraft.app/vi/tools/data/csv-to-json. Nó xử lý trực tiếp trên trình duyệt nên dữ liệu nhạy cảm không bị đẩy lên server, rất an toàn và tiện lợi.
Các tính năng nâng cao đáng giá
- Streaming Backup: Barman hỗ trợ streaming WAL liên tục thay vì đợi đủ 16MB mới gửi đi. Cách này giúp giảm rủi ro mất dữ liệu xuống gần như bằng 0 (Zero Data Loss).
- Hook Scripts: Bạn có thể dùng
post-backup-scriptđể tự động đẩy bản backup lên S3 hoặc Google Cloud Storage. Đây là bước quan trọng để hoàn thiện mô hình backup 3-2-1. - Barman Cloud: Bộ công cụ này cho phép backup trực tiếp từ Postgres lên Cloud Object Storage mà không cần qua server trung gian, cực kỳ phù hợp cho kiến trúc Cloud-native.
Lời kết
Barman không đơn thuần là một tool backup, nó là một hệ thống quản lý an toàn dữ liệu toàn diện. Dành vài giờ để cấu hình Barman ngay hôm nay sẽ giúp bạn ngủ ngon hơn mỗi đêm. Đừng đợi đến khi dữ liệu biến mất mới thấy hối tiếc vì đã trung thành quá lâu với pg_dump.
Nếu bạn đang chạy PostgreSQL trên server riêng (VM hoặc Bare-metal), Barman là lựa chọn số một. Dù các dịch vụ như AWS RDS đã có sẵn cơ chế tương tự, việc hiểu cách Barman hoạt động vẫn giúp bạn nắm vững bản chất của PostgreSQL và tự tin hơn trong các tình huống xử lý sự cố database.

