- rqlite là cơ sở dữ liệu quan hệ phân tán mã nguồn mở, nhẹ, được viết bằng Go
- Được xây dựng dựa trên giao thức đồng thuận Raft và sử dụng SQLite làm bộ máy lưu trữ
- Việc phát triển phiên bản 9.0 đã bắt đầu, với mục tiêu giảm khoảng 50% mức sử dụng đĩa
- Mục tiêu này sẽ đạt được thông qua việc cải tổ thiết kế ở mức cao nhằm loại bỏ nguyên nhân chính gây tiêu thụ đĩa của rqlite
Hiện nay, điều gì đang chiếm phần lớn dung lượng đĩa?
- Nhật ký Raft:
- Nhật ký các thay đổi đối với hệ thống
- Nhật ký này là cốt lõi của hệ thống đồng thuận Raft
- Cơ sở dữ liệu SQLite đang hoạt động:
- Cơ sở dữ liệu đang hoạt động mà rqlite dùng để cung cấp khả năng đọc và ghi
- Khi một câu lệnh SQLite được commit thành công vào nhật ký Raft, câu lệnh đó sẽ được áp dụng vào cơ sở dữ liệu SQLite đang hoạt động
- Ảnh chụp nhanh của cơ sở dữ liệu SQLite đang hoạt động:
- Để ngăn nhật ký Raft tăng vô hạn, phân hệ Raft trong rqlite sẽ định kỳ tạo và lưu một bản sao tại một thời điểm của cơ sở dữ liệu SQLite đang hoạt động
- Bản sao này được gọi là ảnh chụp nhanh
- Khi ảnh chụp nhanh được tạo, rqlite có thể cắt bớt nhật ký Raft
- Bản sao ảnh chụp nhanh này được dùng để rqlite khôi phục nút khi nút khởi động lại, hoặc được truyền sang nút khác khi nút đó cần “bắt kịp” trạng thái của cụm rqlite hiện có
- Tạo ảnh chụp nhanh và cắt nhật ký là các khái niệm cốt lõi của các hệ thống dựa trên Raft
Thiết kế cấp cao cho rqlite 9.0
- Chiến lược chính để giảm mức sử dụng đĩa là loại bỏ nhu cầu lưu bản sao ảnh chụp nhanh của cơ sở dữ liệu SQLite đang hoạt động trong hệ thống Raft
- Nhật ký Raft được cắt bớt định kỳ nhờ việc tạo ảnh chụp nhanh và sẽ ngừng tăng sau một thời điểm nhất định, nhưng cơ sở dữ liệu SQLite đang hoạt động sẽ tiếp tục tăng khi có thêm dữ liệu được ghi vào
- Và vì bản sao ảnh chụp nhanh của cơ sở dữ liệu SQLite gần như có cùng kích thước với cơ sở dữ liệu SQLite đang hoạt động nên kích thước của nó cũng tăng theo
- Do đó, nếu có thể loại bỏ bản sao ảnh chụp nhanh này, rqlite sẽ dùng ít hơn 50% dung lượng đĩa
- Tuy nhiên, ở một số thời điểm nhất định, một nút rqlite vẫn cần một bản sao đã được chụp nhanh. Điều này là không thể tránh khỏi.
- Vậy làm thế nào để bỏ qua việc tạo bản sao nhưng vẫn đáp ứng được nhu cầu tạo và khôi phục ảnh chụp nhanh?
- Để hiểu cách tránh việc lưu thêm bản sao trong quá trình chụp nhanh, điều quan trọng là phải biết rqlite chạy cơ sở dữ liệu SQLite nền ở chế độ Write-Ahead Log (WAL)
- Trong thiết kế 9.0 được đề xuất, tệp cơ sở dữ liệu SQLite đang hoạt động (không bao gồm tệp WAL liên quan) và bản sao đã chụp nhanh của hệ thống Raft là giống hệt nhau về mặt logic
- Dựa trên thực tế này, có thể loại bỏ nhu cầu lưu một bản sao ảnh chụp nhanh riêng biệt trong hệ thống Raft
Cách tiếp cận mới để tạo ảnh chụp nhanh
- Tạo ảnh chụp nhanh và checkpoint WAL:
- Tại thời điểm tạo ảnh chụp nhanh, rqlite sẽ checkpoint Write-Ahead Log (WAL) của cơ sở dữ liệu SQLite đang hoạt động
- Mọi thao tác ghi sau đó sẽ được chuyển tới một tệp WAL mới, nhờ đó tệp SQLite chính vẫn không thay đổi kể từ thời điểm ảnh chụp nhanh được tạo
- Kết quả là cho đến khi ảnh chụp nhanh tiếp theo diễn ra, tệp SQLite chính sẽ đại diện cho trạng thái tại thời điểm cần có trong kho lưu trữ ảnh chụp nhanh của Raft
- Cách tiếp cận này cho phép dùng tệp SQLite kết hợp với tệp WAL cho các thao tác đọc và ghi thông thường, trong khi tệp SQLite chính không thay đổi sẽ đóng vai trò là tập dữ liệu cho kho lưu trữ ảnh chụp nhanh của Raft
- Không còn cần thêm bản sao nào nữa!
- Ghi tham chiếu vào kho lưu trữ ảnh chụp nhanh:
- Thay vì sao chép toàn bộ tệp SQLite, rqlite sẽ ghi một tham chiếu như checksum vào kho lưu trữ ảnh chụp nhanh
- Tham chiếu này có thể được dùng để xác minh rằng tệp SQLite chính khớp với những gì kho lưu trữ ảnh chụp nhanh đang tham chiếu tới bất cứ khi nào cần dữ liệu ảnh chụp nhanh
- (Việc xác minh này giúp bảo vệ khỏi lỗi phần mềm, sai sót vận hành hoặc hỏng đĩa, nhưng không bắt buộc nghiêm ngặt)
- Khôi phục từ ảnh chụp nhanh:
- Như đã đề cập ở trên, mọi thao tác ghi sau quá trình chụp nhanh sẽ được chuyển vào tệp WAL, vì vậy tệp SQLite chính luôn sẵn sàng để dùng cho quá trình khôi phục từ ảnh chụp nhanh, chẳng hạn khi nút khởi động lại hoặc khi truyền ảnh chụp nhanh sang nút khác
- Nói cách khác, tệp SQLite chính (bỏ qua tệp WAL liên quan) sẽ tiếp tục duy trì trạng thái giống hệt về mặt logic với những gì lẽ ra đã được ghi vào kho lưu trữ ảnh chụp nhanh của Raft nếu rqlite thực sự tạo một bản sao dư thừa
- Thiết kế mới này được gọi là “ảnh chụp nhanh tham chiếu”
Các cải tiến bổ sung
- Ảnh chụp nhanh tham chiếu cũng sẽ mang lại một số cải tiến quan trọng khác
- Tạo ảnh chụp nhanh nhanh hơn: vì chỉ ghi lượng dữ liệu tối thiểu vào kho lưu trữ ảnh chụp nhanh của Raft nên quá trình chụp nhanh sẽ nhanh hơn nhiều
- Nó sẽ bao gồm thời gian checkpoint SQLite WAL (thường rất ngắn) và thời gian tính checksum
- Không cần sao chép lượng lớn dữ liệu SQLite vào kho lưu trữ ảnh chụp nhanh mỗi khi tạo ảnh chụp nhanh
- Lợi ích của việc chụp nhanh nhanh hơn trở nên rõ ràng khi biết rằng các thao tác ghi vào rqlite sẽ bị chặn trong quá trình chụp nhanh
- Khởi động lại nhanh hơn: ngay cả các nút có nhiều GB dữ liệu SQLite cũng sẽ khởi động lại nhanh hơn đáng kể
- Hiện tại, khi khởi động lại, rqlite phải khôi phục tệp cơ sở dữ liệu SQLite đang hoạt động từ bản sao trong kho lưu trữ ảnh chụp nhanh của Raft
- Nhưng với thiết kế mới này, khi khởi động, tệp cơ sở dữ liệu SQLite đang hoạt động sẽ đã ở đúng vị trí
- Nhiều nhất, rqlite chỉ cần so sánh checksum trong kho lưu trữ ảnh chụp nhanh với checksum của cơ sở dữ liệu SQLite đang hoạt động
- Các hệ thống nhiều GB sẽ có thể khởi động lại trong vài giây
Bước tiếp theo
- Việc chuyển sang rqlite 9.0 sẽ là một bước tiến quan trọng trong việc tối ưu hiệu quả của rqlite
- Bằng cách triển khai ảnh chụp nhanh tham chiếu, kỳ vọng sẽ giảm đáng kể mức sử dụng đĩa, tăng tốc độ tạo ảnh chụp nhanh và cải thiện thời gian khởi động lại của nút
- Còn nhiều chi tiết cần được xử lý đúng cách như quản lý SQLite WAL, nâng cấp mượt mà từ các bản phát hành trước, lựa chọn checksum, v.v.
- Vì vậy, hãy tiếp tục theo dõi các cập nhật tiếp theo khi tiến tới bản phát hành lớn này
1 bình luận
rqlite - cơ sở dữ liệu phân tán nhẹ dựa trên SQLite