September 18, 2024
Read time: About 10 minutes
views

Giới thiệu và sử dụng Wal-g để thực hiện backup database và push backup file lên 3rd party service như AWS S3

1. Wal-g là gì và tại sao lại dùng?

alt text

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

alt text

2. Setup wal-g với postgresql

Bối cảnh:

Giải thích flow backup và restore:

alt text

Đầ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

alt text

Tiếp đến:

  1. PostgreSQL sẽ tự động tạo các file wal mỗi x time, x này có thể config được => wal-g sau đó sẽ đem file wal được tạo và push lên miniIO
  2. miniIO save lại file wal được push lên, ở đây là file wal3, cũng là file wal mới nhất hiện tại
  3. Tại Postgres2, nơi cũng được cài đặt wal-g, ta có thể chạy lệnh wal-g backup-fetch LATEST để lấy về dữ liệu backup mới nhất => vậy là combo các file trước wal3 như wal2, wal1 và tất nhiên là base backup sẽ đươc fetch về để restore
  4. Postgres2 sẽ restore dựa trên cả 4 file này, tất nhiên rồi bởi vì chỉ mỗi file wal3 là chưa đủ, vì như đã giải thích ở phần I, file wal chỉ chứa các thay đổi tính từ lúc tạo file wal trước đó, cho nên ta cần một stream các file wal để có thể lấy ra được toàn bộ dữ liệu.
    Vậy tuân theo flow trên, ta sẽ thực hiện lần lượt như sau:
    Clone repo setup sẵn về:
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

alt text

Sau đó ta thực hiện tạo một base backup:

./scripts/pg1/make-basebackup.sh

alt text

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

alt text

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:

alt text

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

alt text

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

alt text

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

alt text

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

alt text

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

alt text

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

alt text

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 đó.

3. Các tính năng của Wal-g

Tìm hiểu các config của wal-g:
Toàn bộ config sẽ được khai báo trong enviroment như sau:

alt text

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

alt text

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

alt text

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:

alt text

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

alt text

Vậy ta đã thực hiện thay đổi trên cả 2 database:

alt text

alt text

About this Post

This post is written by haphuthinh, licensed under CC BY-NC 4.0.

#postgresql#database#wal-g#mysql#mongodb#backup