LB dựa vào health check để quyết định còn gửi request tới backend nào.
- Passive (thụ động): quan sát chính lưu lượng thật — backend trả lỗi hoặc timeout liên tiếp quá ngưỡng thì bị đánh dấu hỏng và tạm loại (
max_fails/fail_timeouttrong nginx). - Active (chủ động): LB tự gọi định kỳ vào một endpoint riêng, ví dụ
GET /healthz, không chờ user gặp lỗi trước.
Hai kiểu endpoint:
- Liveness/shallow: chỉ trả 200 nếu tiến trình còn chạy.
- Deep/readiness: kiểm tra cả phụ thuộc (DB, cache) — nhạy hơn nhưng nguy hiểm hơn.
Hậu quả khi cấu hình sai:
- Deep check chung một DB: DB chậm một nhịp thì toàn bộ backend cùng báo hỏng, LB loại hết, dịch vụ mất sạch dù chỉ là sự cố cục bộ. Đây là lý do nhiều hệ thống có cơ chế "fail open": khi quá nhiều node bị coi là hỏng thì bỏ qua kết quả check và cứ gửi lưu lượng.
- Check quá nhạy (ngưỡng 1 lần lỗi): node bị bật/tắt liên tục, tải nhảy qua lại.
- Check quá hời hợt: tiến trình sống nhưng thread pool đã cạn, LB vẫn dồn request vào node đã hỏng thực chất.
- Thiếu graceful shutdown: pod bị xoá trước khi LB kịp ngừng gửi → user gặp lỗi 502 lúc deploy.