Cơ sở dữ liệu 22/09/2026 6 phút

TOAST trong PostgreSQL: lưu giá trị lớn ra sao và vì sao SELECT * đắt

TOAST tự nén giá trị lớn rồi đẩy phần còn lớn ra bảng phụ, giữ bảng chính gọn. Đo thật: bảng chính chỉ 15 MB dù tổng dữ liệu hơn 1 GB, và đọc không chạm cột lớn nhanh hơn 33 lần. Nén xảy ra trước, chiến lược lưu, và vì sao SELECT * tốn kém. PostgreSQL 16.

DevOps 31/08/2026 7 phút

emptyDir trong RAM ghi nhanh gấp bốn lần trên đĩa — nhưng nó âm thầm ăn vào giới hạn bộ nhớ của pod, và cú OOMKilled sau đó đổ lỗi nhầm chỗ

Pod là thứ tạm thời, dữ liệu thì thường không — đo bốn cách gắn lưu trữ và cái nào sống sót qua việc pod bị xoá. emptyDir trên tmpfs nhanh gấp bốn emptyDir trên đĩa nhưng tính vào limits.memory nên ghi quá tay là OOMKilled dù ứng dụng chẳng cấp phát gì. emptyDir gắn vòng đời POD không phải container: sống qua restart, chết qua xoá pod. PVC local-path cấp phát muộn (WaitForFirstConsumer) và bị ghim vào một node, nên node chết là pod kẹt Pending. Và reclaimPolicy Delete mặc định nghĩa là kubectl delete pvc xoá dữ liệu vĩnh viễn, không thùng rác.

DevOps 31/08/2026 7 phút

Xoá pod db-1 của StatefulSet rồi để nó dựng lại: IP đổi, nhưng tên, PVC và dữ liệu 'du lieu cua db-1' còn nguyên vẹn — đó là cả điểm khác biệt với Deployment

Deployment giả định các bản thay thế được cho nhau; với cơ sở dữ liệu thì không. Đo ba thứ StatefulSet có mà Deployment không: khởi động tuần tự (4,3 / 9,6 / 14,9 giây, chờ bản trước), danh tính ổn định (tên DNS và PVC riêng cho từng bản — xoá pod rồi dựng lại thì chỉ IP đổi, dữ liệu còn), và thu gọn không xoá PVC (an toàn dữ liệu nhưng vẫn trả tiền đĩa). Cùng cái bẫy nguy hiểm nhất: node chết thì StatefulSet CHỜ, vì hai bản cùng tên ghi cùng dữ liệu là hỏng — và --force là lời cam đoan 'bản cũ đã chết' mà nếu sai thì mất dữ liệu.