Cấu hình chức năng archive mode trong PostgreSQL

 1. Tình huống

Như chúng ta đã biết ở bài trước, Write-ahead log (WAL) là file ghi lại các thay đổi xảy ra trong database. Nó nhằm mục đích khôi phục lại database cluster, khi nó bị crash hay shutdown đột ngột.

Tuy nhiên, liệu chúng ta có thể khôi phục lại database cluster tại bất cứ thời điểm nào trong quá khứ được hay không? Câu trả lời là: Có thể được, nhưng chỉ có WAL file không thì không đủ.

Nguyên nhân là bởi: WAL file chỉ lưu trữ với số lượng giới hạn. Những WAL file mới được sinh ra thì những WAL file cũ, không cần thiết nữa sẽ bị xóa đi. Do đó, chúng ta không thể có đủ thông tin để restore lại bất cứ thời điểm nào chúng ta muốn.

Từ đó, giải pháp đưa ra cũng rất đơn giản: Backup WAL file cũ ra 1 chỗ khác thay vì xóa hẳn WAL file đó luôn. WAL file backup này gọi là Archive Log

2. Lý thuyết về Archive log mode

Chế độ archive log mode được điều khiển bởi tham số archive_mode. Khi giá trị archive_mode = on, tức là chế độ archive mode đã được kích hoạt.

Lúc này, mỗi khi một WAL file được ghi đầy, PostgreSQL sẽ gọi tiếp câu lệnh xử lý được đặt trong tham số archive_command.

Không như các hệ quản trị khác như Oracle, bạn chỉ cần chỉ ra thư mục archive log, PostgreSQL cho phép bạn tùy ý viết câu lệnh truyền WAL file tới bất cứ đâu bạn muốn. Nó có thể đơn giản là 1 câu lệnh copy (cp), hoặc thậm chí là cả 1 shell script phức tạp.

Đây là 1 ví dụ đơn giản về archive_command:

archive_command = 'test ! -f /backup/archive/%f && cp %p /backup/archive/%f'

Giá trị của archive_command này có ý nghĩa: Mỗi khi một WAL file được ghi đầy, PostgreSQL sẽ thực hiện kiểm tra xem file archive log đã được sinh ra trong thư mục /backup/archive/ hay chưa, và copy WAL file sang thư mục /backup/archive/ nếu chưa có file.

Nếu câu lệnh trong archive_command thực hiện thành công, PostgreSQL sẽ hiểu là quá trình archive WAL file đã thực hiện thành công và có thể xóa WAL file được rồi.

Tuy nhiên, nếu câu lệnh trong archive_command gặp lỗi, PostgreSQL sẽ  hiểu là quá trình archive WAL file thất bại và sẽ cố gắng thử lại cho đến khi archive thành công.

Trong quá trình archive bị lỗi, WAL file vẫn được sinh ra liên tục và không tự xóa được.

Điều này có thể dẫn đến rủi ro, phân vùng chứa WAL file bị đầy, và có thể dẫn đến dừng PostgreSQL database. Do đó, bạn nhớ chú ý, đừng để phân vùng WAL hay archive bị đầy nhé.

 

3. Cấu hình archive log mode

1. Kiểm tra tham số archive_mode

postgres=# show archive_mode ;
 archive_mode 
--------------
 off
(1 row)

Như vậy là chế độ archive log mode chưa được kích hoạt

2. Kiểm tra wal_level

Để kích hoạt được archive log mode, yêu cầu bắt buộc wal_level phải từ replica trở lên.

postgres=# show wal_level ;
 wal_level 
-----------
 replica
(1 row)

Như vậy, wal_level đã thỏa mãn rồi

Nếu giá trị wal_level = minimum, bạn thay đổi nó bằng câu lệnh sau:

alter system set wal_level = replica;

3. Tạo thư mục lưu archive

Chúng ta cần tạo thư mục để lưu archive và chú ý thư mục đó phải cho phép user postgres có thể đọc ghi vào

# mkdir -p /backup/archive/
# chown postgres:postgres /backup/archive/

4. Chỉnh sửa tham số archive_mode và archive_command;

alter system set archive_mode = on;
alter system set archive_command = 'test ! -f /backup/archive/%f && cp %p /backup/archive/%f';

5. Restart PostgreSQL

$ pg_ctl restart

và kiểm tra lại thư mục /backup/archive/ xem WAL file đã được copy sang chưa

Related posts

Perform Manual Failover & Switchover with repmgr in PostgreSQL

Configure automatic failover with repmgrd in PostgreSQL

Monitor Streaming Replication trong PostgreSQL