So sánh công cụ Backup trong môi trường Multi-Tenant
Trong môi trường Multi-Tenant, việc chọn công cụ backup phụ thuộc vào mô hình kiến trúc (Schema riêng hay Database riêng) và yêu cầu về thời gian khôi phục (RTO).
pg_dump phù hợp để backup logic (schema + data) ở mức database hoặc schema riêng lẻ, cho phép khôi phục chọn lọc nhưng tốc độ chậm trên dữ liệu lớn.
pg_basebackup tạo bản sao vật lý (physical copy) của toàn bộ cluster, nhanh hơn nhưng bắt buộc phải dừng hoặc lock instance để đảm bảo tính nhất quán nếu không dùng snapshot, khó áp dụng cho backup từng tenant riêng biệt.
Barman là giải pháp quản lý backup chuyên nghiệp, hỗ trợ incremental backup, WAL archiving, và cho phép khôi phục từng database hoặc tenant mà không cần restore toàn bộ cluster, đây là lựa chọn tối ưu cho production.
Thực hành so sánh tốc độ và dung lượng
Thực hiện backup một tenant mẫu bằng pg_dump để đánh giá kích thước file logic.
pg_dump -U postgres -d tenant_a -F c -f /tmp/backup_tenant_a.dump
Kết quả mong đợi: Tạo file .dump trong /tmp, kích thước thường nhỏ hơn dung lượng thực tế trên disk do định dạng compressed custom.
Thực hiện backup toàn bộ cluster bằng pg_basebackup để thấy sự chênh lệch về tốc độ và dung lượng vật lý.
pg_basebackup -U postgres -D /tmp/basebackup_full -F p -X s -P
Kết quả mong đợi: Tạo thư mục /tmp/basebackup_full chứa toàn bộ data directory, tốc độ nhanh hơn nhưng dung lượng bằng với dung lượng thực tế của data directory.
Xây dựng chiến lược Backup: Full Cluster vs Per-Tenant
Chiến lược Full Cluster sử dụng Barman để backup toàn bộ PostgreSQL instance định kỳ, bao gồm cả WAL logs, đảm bảo khả năng Point-in-Time Recovery (PITR) cho toàn bộ hệ thống.
Chiến lược Per-Tenant sử dụng pg_dump hoặc Barman (với cấu hình chọn lọc) để backup riêng lẻ từng tenant, phù hợp khi cần khôi phục nhanh một tenant bị lỗi mà không ảnh hưởng đến các tenant khác.
Kết hợp cả hai: Dùng Barman cho backup toàn cụm (Full) hàng tuần và backup WAL liên tục, đồng thời dùng pg_dump tự động cho từng tenant quan trọng hàng ngày để giảm RTO khi restore tenant đơn lẻ.
Cấu hình Barman để hỗ trợ cả hai chiến lược
Barman cần được cấu hình để nhận biết các server PostgreSQL và các tenant (database) cụ thể trong file cấu hình chính.
Tạo file cấu hình Barman tại /etc/barman.d/default.conf với nội dung định nghĩa server PostgreSQL và các database cần backup riêng biệt.
[default]
description = "PostgreSQL 16 Multi-Tenant Cluster"
barman_history = /var/lib/barman/default/backup_history
barman_lock = /var/lib/barman/default/lock
barman_lock_file = /var/lib/barman/default/lock.lock
barman_wal_directory = /var/lib/barman/default/wals
backup_directory = /var/lib/barman/default/backups
database_list = "all"
max_inbound_wals = 10
max_wal_archive_delay = 1800
retention_policy = "MAIN_FULL_BACKUP"
retention_policy_mode = "auto"
retention_time = 7
Kết quả mong đợi: File cấu hình được lưu, Barman sẽ backup tất cả database trong cluster theo lịch trình và chính sách retention đã định.
Để backup riêng từng tenant, ta cần cấu hình một server riêng trong Barman cho mỗi tenant hoặc sử dụng option --database khi chạy lệnh backup, tuy nhiên trong thực tế với mô hình Database riêng, ta cấu hình mỗi tenant như một "server" logic trong Barman.
Verify cấu hình chiến lược
Chạy lệnh check để xác minh Barman đã nhận diện đúng các database và cấu hình backup.
barman check default
Kết quả mong đợi: Thông báo "Check OK" hoặc danh sách các cảnh báo cần xử lý (ví dụ: cần cấu hình WAL archiving), không có lỗi nghiêm trọng.
Tự động hóa Backup với Retention Policy
Việc tự động hóa cần kết hợp cron job để kích hoạt backup định kỳ và cấu hình retention policy trong Barman để tự động xóa các bản backup cũ vượt quá ngưỡng thời gian hoặc số lượng.
Retention Policy "MAIN_FULL_BACKUP" giữ lại bản backup đầy đủ gần nhất và các bản incremental liên quan, đảm bảo không lãng phí không gian lưu trữ.
Trong môi trường Multi-Tenant, cần cấu hình retention riêng cho các tenant quan trọng (ví dụ: giữ 30 ngày) và tenant ít quan trọng (ví dụ: giữ 7 ngày) nếu sử dụng nhiều server trong Barman.
Cấu hình Cron Job cho Backup hàng ngày
Thêm task vào crontab của user barman để chạy backup toàn bộ cluster vào 2:00 sáng mỗi ngày.
crontab -u barman -e
Sau khi mở file, thêm dòng sau vào cuối file:
0 2 * * * /usr/bin/barman backup default --wait --jobs 2
Kết quả mong đợi: Cron job được lưu, hệ thống sẽ tự động chạy lệnh backup vào đúng giờ đã định.
Để backup riêng từng tenant (ví dụ tenant_a) vào 3:00 sáng, ta tạo task riêng:
0 3 * * * /usr/bin/barman backup default --database tenant_a --wait
Kết quả mong đợi: Tenant A được backup riêng biệt, độc lập với backup toàn cụm.
Cấu hình Retention Policy tự động xóa
Chạy lệnh cleanup của Barman để áp dụng retention policy và xóa các backup cũ.
barman cleanup default
Kết quả mong đợi: Barman liệt kê các backup sẽ bị xóa và hỏi xác nhận, hoặc tự động xóa nếu cấu hình --immediate.
Để tự động hóa việc cleanup, thêm vào crontab sau job backup (ví dụ 3:00 sáng):
0 3 * * * /usr/bin/barman cleanup default --immediate
Kết quả mong đợi: Các bản backup vượt quá retention_time (7 ngày) sẽ bị xóa tự động, giữ không gian lưu trữ.
Thực hành khôi phục (Restore) Tenant bị lỗi
Khôi phục tenant bị lỗi trong môi trường Multi-Tenant thường được thực hiện bằng cách tạo một database mới và import dữ liệu từ bản backup, tránh việc phải restore toàn bộ cluster gây gián dịch.
Sử dụng pg_restore để khôi phục từ file .dump (backup logic) hoặc sử dụng barman recover để khôi phục từ backup vật lý (nếu cần PITR).
Trong kịch bản này, ta giả định tenant "tenant_b" bị mất dữ liệu và cần khôi phục từ bản backup pg_dump đã tạo trước đó.
Khôi phục tenant từ file .dump
Tạo database mới để chứa dữ liệu khôi phục, đặt tên là tenant_b_restored để tránh xung đột với database cũ nếu còn tồn tại.
createdb -U postgres tenant_b_restored
Kết quả mong đợi: Database tenant_b_restored được tạo thành công trong PostgreSQL.
Sử dụng pg_restore để import dữ liệu từ file backup vào database mới vừa tạo.
pg_restore -U postgres -d tenant_b_restored /tmp/backup_tenant_b.dump
Kết quả mong đợi: Dữ liệu từ thời điểm backup được đưa vào tenant_b_restored, có thể truy cập ngay lập tức.
Khôi phục tenant từ Barman (PITR)
Sử dụng Barman để khôi phục tenant cụ thể vào một thư mục tạm, sau đó copy vào cluster đang chạy (cần stop service hoặc dùng replica).
Lệnh dưới đây sẽ khôi phục toàn bộ cluster đến thời điểm gần nhất trước lỗi, nhưng ta có thể cấu hình để chỉ khôi phục database cụ thể nếu dùng option --database.
barman recover default /tmp/recovery_target --target-database tenant_b --target-timelabel "2024-01-15 02:00:00" --immediate
Kết quả mong đợi: Barman tạo thư mục /tmp/recovery_target chứa dữ liệu khôi phục của tenant_b tại thời điểm 02:00 ngày 15/01/2024.
Để đưa dữ liệu này vào PostgreSQL đang chạy, ta cần tạo database mới và import, hoặc stop PostgreSQL và replace data directory (phức tạp hơn, ít dùng cho restore tenant đơn lẻ).
Verify kết quả khôi phục
Kiểm tra số lượng bảng và dữ liệu trong tenant đã khôi phục so với backup gốc.
psql -U postgres -d tenant_b_restored -c "\dt"
Kết quả mong đợi: Danh sách bảng hiển thị giống hệt như trước khi bị lỗi, dữ liệu có thể truy cập được.
Kiểm tra tính toàn vẹn của bản Backup
Việc kiểm tra tính toàn vẹn (verification) là bước bắt buộc trước khi lưu trữ backup vào long-term storage hoặc trước khi thực hiện restore để đảm bảo file không bị corrupt.
pg_verifybackup (có sẵn trong PostgreSQL 14+) kiểm tra tính nhất quán của backup vật lý (pg_basebackup hoặc Barman full backup).
pg_restore với flag --list hoặc --verbose có thể kiểm tra file .dump (backup logic) mà không cần thực hiện restore thực tế.
Kiểm tra backup vật lý (Barman/Full Cluster)
Sử dụng lệnh check của Barman để xác minh tính toàn vẹn của backup đã lưu trữ, bao gồm kiểm tra WAL files và consistency.
barman check default --check-wals --check-backups
Kết quả mong đợi: Thông báo "Check OK" nếu backup và WAL files đồng bộ, hoặc danh sách lỗi cần khắc phục nếu có file bị thiếu hoặc corrupt.
Đối với backup vật lý lưu trong thư mục /tmp/basebackup_full, sử dụng pg_verifybackup:
pg_verifybackup /tmp/basebackup_full
Kết quả mong đợi: Thông báo "Backup is consistent" hoặc danh sách các vấn đề về consistency.
Kiểm tra backup logic (pg_dump)
Sử dụng pg_restore với option --list để đọc file .dump và kiểm tra cấu trúc mà không cần import dữ liệu.
pg_restore --list /tmp/backup_tenant_a.dump > /tmp/backup_manifest.txt
Kết quả mong đợi: Tạo file manifest chứa danh sách các object (bảng, view, index) trong backup, không có lỗi parse.
Để kiểm tra sâu hơn, chạy restore vào database tạm (test_db) và so sánh checksum.
createdb -U postgres test_verify_db && pg_restore -U postgres -d test_verify_db /tmp/backup_tenant_a.dump
Kết quả mong đợi: Database test_verify_db được tạo và import thành công, không có lỗi runtime.
Verify kết quả kiểm tra toàn vẹn
Chạy lệnh kiểm tra tính toàn vẹn định kỳ (ví dụ hàng tuần) và gửi cảnh báo nếu có lỗi.
barman check default --check-wals --check-backups 2>&1 | grep -i "error\|fail"
Kết quả mong đợi: Nếu không có lỗi, lệnh trả về rỗng; nếu có lỗi, trả về dòng chứa "error" hoặc "fail" để kích hoạt alert.
Điều hướng series:
Mục lục: Series: Triển khai Database Multi-Tenant với PostgreSQL và Ubuntu 24.04
« Phần 5: Triển khai mô hình Database riêng: Quản lý Tenant quy mô lớn
Phần 7: Bảo mật nâng cao: Phân quyền, Audit và mã hóa dữ liệu »