Write-Ahead Logs (WAL) trong cơ sở dữ liệu.
Một cơ chế giúp database đảm bảo tính toàn vẹn dữ liệu
Thất bại là một phần tất yếu của bất kỳ hệ thống nào, dù được thiết kế tốt đến đâu. Cơ sở dữ liệu cũng không ngoại lệ! Sau khi khởi động lại do sự cố, cơ sở dữ liệu cần khôi phục lại trạng thái trước khi xảy ra sự cố. Điều này có thể thực hiện được qua kỹ thuật Write ahead logs (WAL). Vậy cụ thể như thế nào, hãy cùng tìm hiểu.
Write ahead logs (WAL) là gì
- Mỗi node trong hệ thống cơ sở dữ liệu lưu giữ một file log chỉ thêm (append-only) trong bộ nhớ lưu trữ lâu dài, và mọi bản cập nhật từ phía client gửi tới node sẽ được ghi vào file này trước tiên (write-ahead), sau đó mới được ghi xuống database. Kỹ thuật ghi log này được gọi là Write-Ahead Logging vì các lệnh cập nhật được ghi vào log trước khi thực hiện cập nhật thực tế trên dữ liệu.
- WAL không lưu trữ trạng thái thực tế của dữ liệu trong cơ sở dữ liệu, mà thay vào đó, mỗi dòng log là một bản sao của câu truy vấn hoặc lệnh của client gửi tới cơ sở dữ liệu. Một khi câu truy vấn đã được ghi vào file log, nó sẽ được cập nhật vào db sau một khoảng thời gian.
- Lý do tại sao không ghi trực tiếp xuống db vì nếu làm như thế sẽ rất chậm, hơn nữa nếu nhiều yêu cầu cùng ghi 1 lúc chắc chắn sẽ ảnh hưởng hiệu năng. Thay vì thế, chỉ cần ghi lại sự thay đổi vào 1 file nhỏ, sau một thời gian sẽ đồng bộ dữ liệu xuống db như vậy sẽ hiểu quả hơn rất nhiều.
Cách WAL giúp khôi phục sự cố
Đối với trường hợp standalone, khi db khởi động lại, ta chỉ việc khôi phục lại dữ liệu từ WAL.
Còn đối với hệ thống phân tán, có node leader và follower, khi node follower down, nó sẽ được khởi động lại và khôi phục dữ liệu từ WAL của chính nó trước. Sau khi khôi phục xong, nó sẽ yêu cầu node leader gửi lại file WAL trong thời gian xảy ra sự cố để đồng bộ.
Trong bài tiếp theo, mình sẽ nói kĩ hơn về WAL trong PosgreSQL.