Value Separation in Pebble: Storage Engine Optimization
Bài tóm tắt Cockroach Labs 2026 4. Điều chỉnh Độ khó: Khó
Cockroach Labs · 2026 · 4. Điều chỉnh · Độ khó: Khó — bài gốc
Bài của nhà cung cấp về storage engine của chính họ; số liệu do họ tự đo trên benchmark nội bộ, ghi "theo Cockroach Labs". Bài nói về bên trong một database hơn là về tiến hoá hệ thống của người dùng; giữ vì nó cho thấy cách giảm chi phí ở tầng storage khi workload đổi (giá trị lớn, JSONB).
Bối cảnh
- CockroachDB ghi KV xuống Pebble, một LSM tree: compaction chạy nền liên tục đọc các SSTable, merge theo key, ghi lại. Compaction giảm read amplification nhưng tốn CPU, băng thông đọc và rất nhiều băng thông ghi.
- Workload có giá trị lớn (hàng rộng, JSONB) chịu nặng nhất: compaction chỉ cần sắp theo key nhưng phải đọc và ghi lại cả value. Ý tưởng tách value khỏi key đã có từ WiscKey (FAST 2016), LavaStore (VLDB 2024), nhưng theo Cockroach Labs các bản đã công bố không hợp workload của họ.
Thay đổi chính
- Từ v25.4: value tách ra blob file (chuỗi value block + index + footer, định dạng cột); SSTable chỉ giữ một value handle nhỏ (blob file ID, độ dài, block ID, value ID). Compaction gặp value đã tách thì chỉ chép handle.
- Giới hạn mất locality: qua nhiều compaction, value của một SST rải sang nhiều blob file làm scan chậm. Pebble theo dõi blob reference depth mỗi SST; khi vượt ngưỡng, compaction viết blob file mới để depth về 1.
- Giới hạn space amplification: key bị ghi đè hay xoá để lại value chết trong blob file. Mỗi SST mang bitmap (run-length) đánh dấu value còn sống; blob file rewrite compaction OR các bitmap rồi chỉ chép value còn sống, không viết lại SST (handle vẫn đúng nhờ ánh xạ ID logic → file vật lý và bảng ánh xạ block).
- Heuristic của CockroachDB: mặc định tách value từ 256 byte; tách cả value nhỏ ở vùng ít đọc (Raft log); tách sớm value của phiên bản MVCC cũ. Nhưng optimizer chạy nhiều truy vấn
AS OF SYSTEM TIMEđể lấy thống kê, đọc lại lịch sử, nên phần lợi này chưa đạt hết. - Kết quả theo Cockroach Labs: benchmark upsert value 4 KiB tăng khoảng 47% throughput trên cùng phần cứng (bật cuối 6/2025); tổng quát "tới khoảng 50%" tuỳ workload, value nhỏ lợi ít hơn.
Vì sao
- Theo bài, phần lớn độ khó không nằm ở định dạng file mà ở heuristic khi nào gom lại value để đọc vẫn nhanh, dung lượng thừa thấp mà vẫn giữ được lợi về write amplification.
Bài học cho SWE
- Một tối ưu ở tầng storage là đổi chỗ chi phí: bớt ghi lại (write amplification) đổi lấy thêm một lần đọc gián tiếp và dung lượng thừa; phải có cơ chế chặn cả hai đầu (Chi phí hạ tầng và build vs buy).
- Hình dạng dữ liệu quyết định engine nào rẻ: cùng một LSM, workload value lớn và workload value nhỏ có chi phí compaction rất khác (Chọn database theo workload).
- Hành vi ở tầng trên (truy vấn thống kê đọc lịch sử) có thể ăn mất lợi ích của tối ưu ở tầng dưới.
Liên quan
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (2)