Chiến Lược Sao Lưu Gia Tăng (Incremental Backup) Từng Phút Cho Database Lớn Bằng Wal-G và S3
1. Thách thức khi sao lưu Cơ sở Dữ liệu (Database) dung lượng lớn
Đối với các doanh nghiệp sở hữu hệ thống cơ sở dữ liệu lớn (từ vài trăm GB đến hàng chục TB), chiến lược sao lưu truyền thống như Daily Full Backup (sao lưu toàn bộ hàng đêm) không còn khả thi. Phương pháp này đối mặt với ba rào cản lớn:
- RPO (Recovery Point Objective) quá lớn: Nếu hệ thống gặp sự cố vào lúc 18h00, doanh nghiệp sẽ mất toàn bộ dữ liệu từ sau thời điểm backup gần nhất (lúc nửa đêm), tương đương gần 18 tiếng dữ liệu bị xóa sạch.
- Áp lực hạ tầng khủng khiếp: Việc đọc và nén hàng TB dữ liệu liên tục hàng đêm gây quá tải I/O đĩa cứng và nghẽn băng thông mạng, ảnh hưởng trực tiếp đến hiệu năng của ứng dụng đang chạy.
- Chi phí lưu trữ leo thang: Lưu trữ hàng chục bản Full Backup trên Cloud Storage (như AWS S3, MinIO) sẽ làm tăng chi phí vận hành một cách chóng mặt.
Để giải quyết bài toán này, chiến lược Incremental-Forever Backup (Sao lưu gia tăng vĩnh viễn) kết hợp Continuous Archiving (Lưu trữ liên tục) nổi lên như một tiêu chuẩn vàng. Bằng cách sử dụng công cụ mã nguồn mở hiệu năng cao Wal-G kết hợp với lưu trữ dạng Object Storage S3-Compatible, doanh nghiệp có thể thực hiện sao lưu cận thời gian thực (từng phút) một cách mượt mà.
---2. Tổng quan giải pháp: Wal-G và Kiến trúc S3
Wal-G là thế hệ kế thừa của Wal-E, một công cụ sao lưu và phục hồi vật lý dành cho PostgreSQL (và mở rộng ra cả MySQL, MSSQL). Wal-G được viết bằng ngôn ngữ Go, tận dụng tối đa sức mạnh xử lý song song đa luồng (multi-threading), giúp tốc độ nén và đẩy dữ liệu lên Cloud nhanh gấp nhiều lần so với các công cụ cũ.
Kiến trúc sao lưu từng phút dựa trên hai thành phần cốt lõi của Wal-G:
- Base Backup (Physical Backup): Bản sao lưu vật lý toàn bộ các block dữ liệu tại một thời điểm nhất định. Thường chỉ cần thực hiện 1 lần/tuần hoặc 1 lần/tháng.
- Delta/Incremental Backup & WAL Archiving: Cơ chế liên tục đẩy các file Write-Ahead Log (WAL) hoặc các block dữ liệu thay đổi (Delta) lên S3 mỗi khi đạt giới hạn thời gian (ví dụ: 60 giây) nhờ vào cấu hình
archive_timeoutcủa database.
Mô hình hoạt động: Khi có dữ liệu mới ghi vào Database, các thay đổi sẽ được ghi vào file log (WAL) trước. Wal-G sẽ bọc các file WAL này (hoặc quét các block thay đổi qua cơ chế Delta) và đẩy ngay lên S3 theo chu kỳ từng phút. Khi cần khôi phục (Restore), hệ thống chỉ cần tải bản Base Backup gần nhất, sau đó "re-play" (chạy lại) chuỗi file WAL/Delta lên tới đúng phút hoặc đúng giây mong muốn (Point-In-Time Recovery - PITR).---
3. Hướng dẫn cấu hình chi tiết sao lưu từng phút
Dưới đây là các bước thiết lập chi tiết trên môi trường Production sử dụng hệ quản trị cơ sở dữ liệu PostgreSQL và bộ lưu trữ S3-Compatible.
Bước 1: Cài đặt và cấu hình biến môi trường Wal-G
Tải xuống phiên bản Wal-G phù hợp với hệ điều hành và phân quyền thực thi cho file binary:
sudo wget -O /usr/local/bin/wal-g [https://github.com/wal-g/wal-g/releases/download/v2.0.1/wal-g-pg-ubuntu-20.04-amd64](https://github.com/wal-g/wal-g/releases/download/v2.0.1/wal-g-pg-ubuntu-20.04-amd64)
sudo chmod +x /usr/local/bin/wal-g
Tiếp theo, tạo file cấu hình môi trường an toàn nhằm lưu trữ thông tin kết nối tới S3. Thông thường, chúng ta sử dụng thư mục bảo mật thuộc quyền sở hữu của user postgres:
sudo mkdir -p /etc/wal-g.d/env
sudo touch /etc/wal-g.d/env/AWS_ACCESS_KEY_ID
sudo touch /etc/wal-g.d/env/AWS_SECRET_ACCESS_KEY
sudo touch /etc/wal-g.d/env/WALG_S3_PREFIX
# Ghi thông tin cấu hình
echo "AKIAIOSFODNN7EXAMPLE" | sudo tee /etc/wal-g.d/env/AWS_ACCESS_KEY_ID
echo "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" | sudo tee /etc/wal-g.d/env/AWS_SECRET_ACCESS_KEY
echo "s3://my-database-backup-bucket/prod-db" | sudo tee /etc/wal-g.d/env/WALG_S3_PREFIX
sudo chown -R postgres:postgres /etc/wal-g.d
sudo chmod 600 /etc/wal-g.d/env/*
Bước 2: Cấu hình Engine Database (PostgreSQL)
Để kích hoạt tính năng lưu trữ liên tục, truy cập vào file cấu hình chính postgresql.conf và điều chỉnh các tham số sau nhằm bắt buộc đẩy dữ liệu log lên S3 tối đa mỗi 60 giây:
wal_level = replica
archive_mode = on
archive_command = 'envdir /etc/wal-g.d/env wal-g wal-push %p'
archive_timeout = 60
max_wal_senders = 10
Trong đó, tham số archive_timeout = 60 đóng vai trò quyết định: Nó ép buộc database phải đóng file log hiện tại và gọi lệnh wal-push để đẩy lên S3 sau mỗi 1 phút, ngay cả khi file log đó chưa đầy. Điều này đảm bảo mục tiêu RPO luôn nhỏ hơn hoặc bằng 1 phút.
Sau khi sửa cấu hình, tiến hành khởi động lại dịch vụ database:
sudo systemctl restart postgresql
Bước 3: Tạo bản sao lưu toàn vẹn đầu tiên (Base Backup)
Chạy lệnh dưới đây dưới quyền user postgres để khởi tạo bản backup nền móng vật lý ban đầu:
sudo -u postgres envdir /etc/wal-g.d/env wal-g backup-push /var/lib/postgresql/16/main
---
4. Chiến lược tự động hóa và quản lý vòng đời dữ liệu (Retention Policy)
Để tối ưu hóa không gian lưu trữ và đảm bảo hệ thống vận hành tự động, chúng ta cần thiết lập lịch trình thông qua Cron Job và áp dụng quy tắc xóa bỏ các bản sao lưu quá hạn.
Lập lịch sao lưu tự động
Mặc dù các file log (WAL) được đẩy lên S3 từng phút một cách tự động nhờ archive_command, chúng ta vẫn cần tạo các bản Delta Backup định kỳ (ví dụ: mỗi đêm) để giảm thời gian phải re-play log khi khôi phục dữ liệu:
# Mở bảng lập lịch cron dưới quyền user postgres
sudo crontab -u postgres -e
# Thêm dòng sau để thực hiện Delta Backup vào 2 giờ sáng mỗi ngày
0 2 * * * envdir /etc/wal-g.d/env wal-g backup-push /var/lib/postgresql/16/main
Cấu hình chính sách lưu trữ (Retention Policy)
Nếu không dọn dẹp, kho lưu trữ S3 sẽ nhanh chóng bị quá tải. Wal-G cung cấp lệnh giúp tự động xóa bỏ các bản backup cũ nhưng vẫn giữ lại các file log cần thiết để phục vụ khôi phục chuỗi dữ liệu hiện tại:
# Xóa các bản backup cũ, chỉ giữ lại 7 bản gần nhất
wal-g delete retain 7 --confirm
Doanh nghiệp có thể kết hợp tính năng S3 Lifecycle Rules để tự động chuyển các bản sao lưu cũ sang các phân lớp lưu trữ rẻ hơn như S3 Glacier Flexible Retrieval hoặc Glacier Deep Archive nhằm tiết kiệm tối đa chi phí hạ tầng dài hạn.
---5. Quy trình khôi phục dữ liệu Point-In-Time Recovery (PITR)
Thử thách lớn nhất của hệ thống sao lưu không nằm ở khâu lưu dữ liệu, mà nằm ở tốc độ và độ chính xác khi khôi phục (Restore). Khi xảy ra sự cố nghiêm trọng vào một thời điểm chính xác (ví dụ: một truy vấn lỗi làm hỏng bảng dữ liệu lúc 14:15:30), quy trình khôi phục về đúng phút trước đó diễn ra như sau:
- Dừng dịch vụ Database hiện tại và làm sạch thư mục data:
sudo systemctl stop postgresql sudo mv /var/lib/postgresql/16/main /var/lib/postgresql/16/main.corrupted sudo mkdir -p /var/lib/postgresql/16/main sudo chown postgres:postgres /var/lib/postgresql/16/main - Tải bản Base Backup/Delta Backup phù hợp từ S3: Lệnh dưới đây sẽ tự động tìm kiếm bản backup hợp lệ gần nhất với thời điểm đích và giải nén đa luồng vào thư mục data:
sudo -u postgres envdir /etc/wal-g.d/env wal-g backup-fetch /var/lib/postgresql/16/main LATEST - Thiết lập đích khôi phục thời gian (PITR): Tạo file tín hiệu khôi phục và cấu hình lệnh nhận diện file log trong file
postgresql.auto.confhoặcrecovery.signal:sudo -u postgres touch /var/lib/postgresql/16/main/recovery.signal echo "restore_command = 'envdir /etc/wal-g.d/env wal-g wal-fetch %f %p'" | sudo tee -a /var/lib/postgresql/16/main/postgresql.auto.conf echo "recovery_target_time = '2026-06-02 14:14:00+00'" | sudo tee -a /var/lib/postgresql/16/main/postgresql.auto.conf - Khởi động lại database và theo dõi quá trình re-play log: Database sẽ khởi chạy ở chế độ phục hồi, liên tục gọi lệnh
wal-fetchđể kéo các file log từng phút từ S3 về và nạp vào data block cho đến khi đạt chính xác thời mốc14:14:00.sudo systemctl start postgresql sudo tail -f /var/log/postgresql/postgresql-16-main.log
6. Kết luận và Khuyến nghị vận hành Production
Việc kết hợp giữa Wal-G và hạ tầng lưu trữ S3 mang lại giải pháp sao lưu gia tăng từng phút toàn diện cho các hệ thống Big Data. Nó giải quyết triệt để bài toán dung lượng nhờ khả năng nén cực cao của thuật toán lz4/brotli, đồng thời bảo vệ doanh nghiệp trước mọi rủi ro mất mát dữ liệu với RPO tối thiểu.
Để vận hành giải pháp này một cách an toàn nhất trên môi trường Production, các kỹ sư hệ thống cần lưu ý:
- Giám sát liên tục (Monitoring): Thiết lập cảnh báo (Alerting) qua các công cụ như Prometheus/Grafana để theo dõi mã thoát (Exit Code) của lệnh
wal-push. Bất kỳ sự chậm trễ nào trong việc đẩy log lên S3 đều cần được phát hiện ngay lập tức. - Kiểm thử khôi phục định kỳ (Drill Test): Một bản sao lưu chỉ thực sự có giá trị khi nó có khả năng phục hồi thành công. Hãy thiết lập một hệ thống tự động tải backup từ S3 về và tiến hành restore thử nghiệm mỗi tuần một lần để kiểm tra tính toàn vẹn của dữ liệu.
