How to debug large db size issue?
Bài tóm tắt etcd (CNCF) 2023 4. Điều chỉnh Độ khó: Trung bình
etcd · 2023 · 4. Điều chỉnh · Độ khó: Trung bình — bài gốc
Bài hướng dẫn vận hành của maintainer etcd, không kể một sự cố cụ thể; giữ vì nêu giới hạn thiết kế của etcd và cách Kubernetes tách một loại dữ liệu ra cụm riêng.
Bối cảnh
- Dung lượng DB của etcd có quota (
--quota-backend-bytes), mặc định 2 GB, khuyến nghị tối đa 8 GB. Vượt quota thì mọi lệnh ghi lỗimvcc: database space exceededvà cụm bật alarmNOSPACE, endpoint báo không khoẻ. - Với cụm phục vụ Kubernetes, etcd đầy là API server không ghi được gì.
Nội dung chính
- Đo: kích thước file
member/snap/db, hoặcetcdctl endpoint status -w jsoncho cảdbSize(cấp phát vật lý) lẫndbSizeInUse(dùng thật); chênh lệch là chỗ trống lấy lại được. Có metric tương ứng (etcd_mvcc_db_total_size_in_bytes,..._in_use_in_bytes, quota). - Compaction + defragmentation: etcd là MVCC, giữ lịch sử mọi key. Compaction là cách duy nhất xoá lịch sử, nhưng không trả lại chỗ trống; phải defrag sau đó. Compaction chạy một lần cho cả cụm; defrag tốn thời gian và đắt nên chạy từng member một, càng ít càng tốt nhưng không để member nào chạm quota.
- Lỗi đã biết: mọi bản 3.5 (3.5.0–3.5.5) có thể mất nhất quán dữ liệu nếu crash giữa lúc defrag online (qua
etcdctlhoặc client API). Khuyến nghị defrag offline bằngetcdutl: dừng từng member, defrag, khởi động lại. Sau đó gỡ alarm bằng tay. - Tìm thứ chiếm chỗ: đếm key theo loại tài nguyên dưới
/registry. Ví dụ trong bài: khoảng 971.000 event so với 51.000 pod, tức event chiếm gần hết. Hỏi tiếp: ai đổi--event-ttlcủa API server (mặc định 1 giờ)? Có phải lỗi đã biết? Cụm lớn thì tăng timeout cho lệnh đếm; etcd không chạy thì dùngetcd-dump-dbđọc thẳng file. - Giải pháp:
- Nếu tăng trưởng là bình thường: tăng quota, nhưng boltDB map cả file DB vào bộ nhớ, nên quota lớn hơn là tốn RAM hơn (quá 8 GB chỉ khi máy có nhiều RAM), và phải chắc thay đổi sống qua lần nâng cấp hay tạo lại VM của nhà cung cấp.
- Tách event ra cụm etcd riêng bằng
--etcd-servers-overrides=/events#...của API server. - Xoá object không cần rồi compaction + defrag.
- Nếu tăng trưởng không bình thường: tìm nguyên nhân trước; mọi cách trên chỉ là giảm nhẹ.
Vì sao
- Theo nhận định của wiki: etcd hợp với lượng nhỏ dữ liệu điều phối (boltDB map cả file vào bộ nhớ, quota vài GB); dữ liệu nhiều và mau hết hạn như event không hợp với giả định đó. Tách nó ra cụm riêng là chia kho theo loại dữ liệu (Sharding và tách database).
- MVCC biến mỗi lần ghi thành một phiên bản mới, nên bảo trì định kỳ (compaction + defrag) là bắt buộc; làm offline từng member một vì bản online có lỗi tính đúng (Tự động hoá vận hành và auto-remediation).
Bài học cho SWE
- Theo dõi cả dung lượng cấp phát lẫn dung lượng dùng thật; chênh lệch lớn nghĩa là đến lúc defrag, gần quota nghĩa là sắp mất khả năng ghi.
- Khi một loại dữ liệu chiếm áp đảo kho điều phối, tách nó ra kho riêng trước khi tăng quota.
- Thao tác bảo trì nặng chạy từng node, và ưu tiên bản offline nếu bản online chưa chắc an toàn khi crash.
- OpenAI 2018 đã gặp đúng hai chuyện này ở 2.500 node: tách Events ra cụm etcd riêng, và etcd chạm quota 2 GB khiến autoscaler xoá hết worker (OpenAI 2018).
Liên quan
#etcd#Kubernetes#Storage quota#MVCC#Compaction#Defragmentation#boltDB#NOSPACE#Kubernetes events#etcd-servers-overrides
Được nhắc tới trong
Công ty (1)