Buffer _ tag
Ai đã từng làm việc với SQL đều biết là dữ liệu của chúng ta được chứa trong các bảng( table). Tuy nhiên bảng là một khái niệm mang tính hình tượng để chúng ta dễ suy nghĩ. Dữ liệu thật sự của mỗi bảng sẽ được chia nhỏ ra và chứa trong các trang( page) có kích thước bằng nhau.
Mỗi trang( page) được đặt cho 1 mã định danh gọi là buffertag. Buffertag này bao gồm 3 con số, mà thông qua nó sẽ định danh page này thuộc về table nào, và là page thứ mấy trong số các page đang chứa dữ liệu của table.
Dữ liệu trong page chính là dữ liệu thô sẽ được lưu trữ trong bộ nhớ tạm, cụ thể là buffer pool layer của buffer manager.
Quy trình hoạt động của Bộ quản lý vùng đệm
Khi 1 câu truy vấn SQL được gửi đến, các tiến trình sẽ xử lý logic của câu truy vấn và sẽ biết được dữ liệu cần thiết hiện đang được lưu ở trang nào. Hệ thống sẽ mang buffer _ tag của trang tìm được đến kiểm tra với bộ quản lý đệm xem trang này đã có sẵn trong vùng đệm hay chưa.
Nếu trang chưa được lưu trong vùng đệm thì bộ quản lý sẽ yêu cầu truy xuất trực tiếp xuống điã cứng để lấy, sau đó lưu nó vào 1 trong các ô nhớ của vùng đệm. Vị trí của ô đó( buffer _ id) sẽ được trả về cho tiến trình yêu cầu.
Ngược lại, nếu trang đang được lưu trong vùng đệm thì bộ quản lý sẽ trả về buffer _ id của ô hiện đang chứa trang này.
Tiến trình sau khi nhận được buffer _ id có thể thực hiện việc truy xuất trực tiếp dữ liệu mà nó cần.
Khi vùng đệm bị đầy
Buffer pool được lưu trữ trên RAM, 1 lúc nào đó nó cũng sẽ phải đầy. Do đó chúng ta cần 1 thuật toán để xác định nên bỏ đi trang nào để lấy chỗ cho trang mới.
Có nhiều thuật toán khác nhau để làm việc này. PostgreSQL từ bản 8.1 trở đi sử dụng thuật toán Clock Sweep thay cho LRU ở các phiên bản trước.
Ý tưởng của thuật toán Clock Sweep là: ưu tiên loại bỏ page nào ít được truy xuất nhất( usagecount), và tại thời gian xem xét, page đó đang không bị process nào truy xuất( unpinned _).
Thông tin về số lượng truy xuất, số lượng tiến trình đang truy xuất trang đó gọi là metadata của buffer slot đó, và được quản lý bởi Buffer descriptor.
Khi dữ liệu trong buffer pool bị thay đổi
Khi cơ sở dữ liệu nhận được 1 yêu cầu thực hiện thay đổi dữ liệu của bảng, những điều chỉnh sẽ được áp dụng trực tiếp lên trang tương ứng trong vùng đệm( chứ ko phải là phiên bản gốc ở điã cứng). Lúc này, trang tương ứng trong vùng đệm đã bị thay đổi sẽ được đánh dấu là bẩn( dirty).
Những thông tin mới này 1 lúc nào đó sẽ phải được lưu trữ cố định xuống điã cứng. Hành động này gọi là Flush dirty page.
Đảm nhận nhiệm vụ này sẽ là 2 tiến trình chạy nền là checkpointer và background writer.
MỞ RỘNG
Như các bạn đã biết vùng đệm nằm trên RAM, dữ liệu của RAM sẽ mất hết nếu hệ thống xảy ra sự cố như mất điện. Vậy nếu trang trở nên bẩn( dirty), chưa kịp lưu cố định xuống đĩa cứng mà sự cố xảy ra thì đồng nghĩa là chúng ta sẽ bị mất những dữ liệu mới này. Điều này dẫn đến cần phải có 1 thành phần khác đảm nhiệm việc này, đó là WAL.
Mô tả chi tiết của WAL sẽ nằm ngoài phạm vi của bài viết này, nhưng nếu giải thích một cách ngắn gọn thì ý tưởng của WAL sẽ là: Nếu 1 hành động nào đó làm thay đổi trạng thái của dữ liệu, sự thay đổi đó sẽ được ghi nhận( log) lại trước cả khi buffered page được cập nhật. Như vậy, nếu sự cố xảy ra thì hệ thống sẽ xem xét lại các thông tin đã được ghi nhận lại( log) chưa được xử lý và do vậy sẽ đảm bảo dữ liệu được nguyên vẹn.
Đọc và thảo luận bài viết online: https:// engineering. grokking. org /
DIJSKTRA 23