Một trong các thành phần quan trọng nhất trong PostgreSQL đó là Write-ahead Log (WAL). WAL phục vụ cho mục đích khôi phục lại database khi PostgreSQL bị shutdown đột ngột (máy chủ bị mất điện, process postmaster bị kill,…)

Đọc thêm  Một số lỗi thông thường khi khởi động PostgreSQL

Trong bài viết này, tôi sẽ giải thích cho các bạn ý nghĩa của WAL file.

Tôi đã từng làm việc với rất nhiều hệ quản trị Cơ sở dữ liệu quan hệ (RDBMS) và nhận thấy hầu như RDBMS nào cũng có khái niệm giống với WAL trong PostgreSQL.

WAL (trong PostgreSQL) hay transaction log (trong SQL Server) hay Redo log (trong Oracle) đều là những file lưu trữ thông tin mô tả sự thay đổi trong database.


   Ví dụ về sự cần thiết của WAL

   Ví dụ

Tôi có 1 ví dụ cụ thể thế này: Khi bạn update 1 giá trị A thành giá trị B, thì giá trị mới (B) chưa được ghi thẳng xuống ổ đĩa đâu.

Nguyên nhân là bởi: Trong 1 hệ thống có nhiều thay đổi, nếu mỗi lần thay đổi đã ghi xuống đĩa luôn như thế, thì không hệ thống nào đủ khả năng xử lý được. Cách làm tốt hơn là khi có thay đổi thì chỉ thay đổi giá trị A thành giá trị B ở trên Memory thôi, nhưng chưa ghi xuống đĩa ngay. Gom nhiều lần thay đổi lại rồi mới ghi xuống đĩa. Như vậy sẽ giảm số lần request và dung lượng ghi xuống đĩa hơn.

Tuy nhiên, nó lại nảy sinh 1 vấn đề khác: Giá trị B mà tôi đã thay đổi, nhưng nó mới nằm trên Memory, vậy nếu đúng lúc đó bị mất điện thì sao?

Các bạn đều biết Memory là bộ nhớ lưu trữ tạm thời, nếu mất điện máy chủ thì dữ liệu trên đó cũng sẽ bị xóa hết, vậy giá trị B của tôi cũng bị mất!

Và đó là chỗ cần sự tham gia của WAL.

   Cơ chế thực hiện

Cơ chế lúc này sẽ như sau: Khi bạn thay đổi A thành B, B sẽ thay thế A nằm ở trên Memory, tuy nhiên PostgreSQL sẽ tạo ra 1 mẩu thông tin mô tả về thay đổi đó, và nó  sẽ được lưu vào 1 file nằm trên đĩa, đó là WAL.

Dữ liệu A hoặc B có thể lớn, nhưng thông tin mô tả về thay đổi sẽ rất bé, nên lựa chọn lưu xuống file WAL sẽ nhanh hơn nhiều so với lựa chọn bạn lưu dữ liệu đầy đủ (như A hoặc B).

Vậy, khi máy chủ bị mất điện thì dữ liệu trên Memory sẽ bị xóa sạch. Khi database khởi động trở lại, dữ liệu ở dưới đĩa vẫn là dữ liệu cũ (dữ liệu A). Tuy nhiên, nó sẽ đọc các thông tin thay đổi ở trong WAL file và phát hiện thấy A đã thay đổi thành B. Như vậy nó sẽ biết cần phải thực hiện recover để khôi phục lại dữ liệu B.


   Đặc điểm của WAL file

Như tôi đã nói ở trên, WAL file là 1 file nằm trên đĩa cứng. Bạn có thể tìm thấy nó trong thư mục pg_wal (từ bản PostgreSQL 10 trở đi, trước đó là thư mục pg_xlog). Thư mục này trong data directory (hay thư mục lưu dữ liệu của PostgreSQL)

Vị trí của thư mục pg_wal

Đọc thêm  Ý nghĩa các thư mục trong PostgreSQL

Kích thước mặc định của WAL file là 16MB. Bạn hoàn toàn có thể điều chỉnh kích thước của WAL file thông qua tham số max_wal_size.

Kiểm tra kích thước của WAL file hiện tại bằng câu lệnh:

show max_wal_size;

 max_wal_size
--------------
 16M
(1 row)

 

Sau khi sử dụng hết 16MB, hệ thống sẽ sinh ra 1 WAL file mới, và cứ tiếp tục như thế. Số lượng các WAL file có thể được kiểm soát cũng bởi tham số wal_keep_segments.

show wal_keep_segments;

wal_keep_segments
-------------------
 128
(1 row)
Đọc thêm  Cấu hình tham số trong PostgreSQL

Các WAL file

Mỗi khi có thay đổi trên database, một bản ghi thông tin mô tả thay đổi sẽ được sinh ra và ghi nối vào WAL file hiện tại. Mỗi bản ghi này sẽ được ghi cùng với số thứ tự của nó hay còn gọi Log Sequence Number (LSN). Số LSN cũng sẽ được lưu lại trong control file mỗi khi checkpoint xảy ra.

Khi cần sử dụng WAL file để khôi phục, hệ thống sẽ so sánh LSN hiện tại (VD: LSN_n) với LSN được lưu trong control file (VD: LSN_1). Nếu LSN_n > LSN_1 thì nó biết được rằng hệ thống sẽ cần phải recover bằng cách lấy các bản ghi trong WAL file từ LSN_1 đến LSN_n.


   Tham số cấu hình wal_level

Tham số wal_level quy định bao nhiêu thông tin sẽ được ghi lại vào WAL. Nó có thể nhận các giá trị: minimum, replica, logical, sắp xếp mức độ chi tiết tăng dần.

   Ở mức độ minimum, WAL chỉ chứa thông tin tối thiểu đủ để khôi phục database cluster trong trường hợp bị crash đột ngột thôi.

   Ở mức độ replica, WAL bao gồm các thông tin ở mức độ minimum, kèm theo đó là các thông tin đủ để hỗ trợ cho các tính năng như archive log mode, streaming replication.

   Cuối cùng, ở mức độ logical, WAL bao gồm các thông tin ở mức độ replica, kèm theo đó là các thông tin để hỗ trợ tính năng logical replication.

Mặc định, wal_level = replica.

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

 

WAL level càng cao thì càng hỗ trợ nhiều tính năng hơn, tuy nhiên, tài nguyên sử dụng cũng nhiều hơn. Chúng ta sẽ cần phải cân nhắc điều này khi đặt giá trị cho tham số wal_level.


   Các công dụng của WAL

   Đầu tiên, như mô tả ở trên bài viết, WAL file để khôi phục hệ thống khi có sự cố đột ngột.

  WAL hỗ trợ tính năng backup online và point-in-time recovery của PostgreSQL

   WAL hỗ trợ cho các tính năng đồng bộ dữ liệu (Log shipping, Replication)

Hi vọng sau bài viết này, các bạn đã hiểu hơn về WAL, ý nghĩa và tác dụng của nó trong PostgreSQL. Hẹn gặp lại các bạn ở những bài viết sau.

Nguồn: https://dangxuanduy.com/

Xin cho tôi được biết, bạn cảm thấy bài viết này như thế nào? Ý kiến của bạn sẽ giúp tôi nâng cao chất lượng bài viết của mình.

    Hãy chia sẻ bài viết này nếu bạn thấy có ích nhé
    5 1 vote
    Article Rating
    Subscribe
    Notify of
    guest
    0 Comments
    Inline Feedbacks
    View all comments