

Wal-g là một công cụ để tạo các file backup cho PostgreSQL/MySQL/MariaDB/MS-SQL Server/MongoDB/Redis được compess và encrypt sau đó đây lên các storage bên thứ ba như AWS S3, GCS, Azure storage...
Vậy câu hỏi đặt ra là bản thân cơ sở dữ liệu đều có tính năng tạo file backup hết, ví dụ như PostgreSQL với tiện ích pgdump hay MySQL với tiện ích mysqldump. Vậy tại sao lại dùng thêm Wal-g làm gì? Câu trả lời đó là vì sử dụng các tiện ích cung cấp sẵn, lấy ví dụ cụ thể ở đây là pgdump sẽ có nhiều hạn chế:
Vậy nên, dùng wal-g sẽ khắc phục các hạn chế trên:
Độ uy tín: Repo của wal-g: https://github.com/wal-g/wal-g được 3,2k star

Bối cảnh:
Giải thích flow backup và restore:

Đầu tiên như hình, ta cần phải tạo một file base backup trước, base backup là một file tạo ra một bản sao lưu toàn bộ dữ liệu của PostgreSQL, bao gồm cả các file dữ liệu, cấu hình, và các file WAL (Write-Ahead Logging). => Trước khi tạo các file WAL luôn phải tạo một base backup toàn bộ dữ liệu trước

Tiếp đến:
git clone https://github.com/chabuuuu/walg-postgres-example
Chạy lệnh duy nhất này để build ra docker image của postgres được setup sẵn wal-g:
./scripts/build-postgres-with-wal-g-docker-image.sh
Chạy postgres1 và s3, khoan chạy postgres2 vì ta đang giả lập trường hợp postgres1 đóng vai trò là db đang chạy trên server chính, trong trường hợp db này sập ta mới thực hiện chạy postgres2 và mang backup từ postgres1 vào để tiếp tục sử dụng.
docker-compose up -d postgres1 s3
Chạy lệnh sau để insert data mẫu vào postgres1
./scripts/pg1/load-seed.sh
./scripts/pg1/insert-fixtures.sh

Sau đó ta thực hiện tạo một base backup:
./scripts/pg1/make-basebackup.sh

Vào localhost:9000 là UI của miniIO, ta đã thấy được file base backup đã xuât hiện
Thử insert tiếp 10 dòng dữ liệu
./scripts/pg1/insert-fixtures.sh

Lúc này đã lên 20 dòng
Bây giờ ta sẽ thực hiện chạy postgres2 lên và restore từ file backup trên miniIO:
./scripts/pg2/restore.sh
Chạy script trên sẽ tự động gọi postgres2 dậy và đồng thời restore backup mới nhất trên miniIO
Và đây là data trong postgres2, đúng 20 dòng:

Test các trường hợp khác: – Thử thêm mới một bảng vào postgres1

kết quả sau khi chạy script restore cả hai db1 và db2 đều giống hệt nhau

– Thử tạo một database mới bên trong db1: loan_db và có một table là contract

Bên db1: table contract sẽ có 5 record như dưới

Sau khi chạy restore, bên phía db2 cũng sẽ có database loan_db

data trong bảng contract cũng được restore y hệt db1

Vậy là mặc định, script restore của wal-g như sau:
/wal-g backup-fetch $PGDATA LATEST
Thì script này sẽ restore lại toàn bộ data được backup, bao gồm toàn bộ của database và table có trong đó.
Tìm hiểu các config của wal-g: Toàn bộ config sẽ được khai báo trong enviroment như sau:

Giài thích:
Vậy ta sẽ đi phân tích một chút về script restore của wal-g, ở phần 2, ta đã sử dụng script:
/wal-g backup-fetch $PGDATA LATEST
Trong đó, LATEST nghĩa là lấy ra file backup mới nhất, ngoài ra, còn có các tùy chọn khác $PGDATA chính là thư mục /var/lib/postgresql/data/, ta sẽ chỉ định thư mục nào làm nơi lưu các file wal sau khi đã được lấy về và extract ra. Partial restore Dùng để chỉ rõ ra sẽ restore database, hay chi tiết hơn là table nào của database nào.
/wal-g backup-fetch $PGDATA LATEST --restore-only=loan_db
Lệnh trên tức là chỉ restore database có tên loan_db thôi
/wal-g backup-fetch $PGDATA LATEST --restore-only=loan_db/contract
Lệnh trên sẽ chỉ restore table contract trong database có tên loan_db
Ví dụ: Postgres1 có 2 database chat_db và loan_db

Trước hết tôi thử tạo bảng contract trong loan_db và insert vào 1 dòng:

Tiếp theo tôi phải thực hiện tạo base backup cho postgres1:
./scripts/pg1/make-basebackup.sh
Sau đó, thực hiện tạo bảng message trong chat_db:

Sau đó, ta thử insert 1 dòng nữa vào loan_db/contract:

Vậy ta đã thực hiện thay đổi trên cả 2 database:
loan_db: thêm 1 record mới vào bảng contract
chat_db: tạo table message Bây giờ hãy thử restore với tùy chọn chỉ restore loan_db:
/wal-g backup-fetch $PGDATA LATEST --restore-only=loan_db/contract
Kết quả trên postgres2:
chat_db không có table message


Gợi ý dựa trên chuyên mục, nội dung tương tự và bài viết được độc giả quan tâm nhất