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