02:03 — Tiếng Chuông Xé Màn Đêm
[02:03:17] 🔴 CRITICAL — Service "linh-bao-app" health check FAILED (5/5)
[02:03:18] 🔴 ERROR — Database connection pool exhausted (max: 100/100)
[02:03:19] 🟡 WARN — Response time P99: 32,481ms (threshold: 2,000ms)
[02:03:20] 🔴 DOWN — Load balancer returning HTTP 503 to all users
// Pagerduty escalated → On-call Engineer notified
Cảnh Giới 1 — Định Thần: Đạo Tâm Bất Biến Giữa Biến Cố
2 giờ sáng. Trí não còn đang nửa tỉnh nửa mê — phản ứng đầu tiên của đa số tu sĩ là hoảng loạn. Nhưng một đại lão SRE hiểu rằng: Hoảng loạn là liều thuốc độc. Mỗi nhát kiếm (câu lệnh gõ xuống) khi tâm không tĩnh sẽ chỉ khiến vết thương của hệ thống thêm trầm trọng.
"
Sự cố đã xảy ra — việc của chúng ta không phải là hối tiếc, mà là cứu vãn sinh linh (User) và khôi phục tông môn. Hít một hơi thật sâu. Định thần. Rồi mới xuất kiếm.
- Xác định Incident Commander — một người ra quyết định, tránh "lắm thầy thối ma"
- Mở War Room (Slack/Meet) — ghi lại mọi hành động theo thời gian thực, không có "hành động chui"
- Đặt mục tiêu thời gian — "15 phút để hiểu vấn đề, 30 phút để có plan, 1 giờ để restore"
Cảnh Giới 2 — Truy Vết: Phóng Thần Thức Soi Xét Vạn Vật
Khi trận pháp sụp đổ, hiện trường là đống đổ nát hỗn độn. Kỹ sư cần dùng Thần thức Observability để nhìn thấu bản chất — không đoán mò, chỉ theo dấu vết.
CPU Usage
94% ↑ (threshold: 80%)
Memory Usage
98% ↑↑ OOM imminent
DB Connections
100/100 — POOL EXHAUSTED
HTTP 200 Rate
3% ↓↓ (normal: 99.9%)
Active Users
47,832 — Pháo hoa spike (+820%)
Lật lại từng trang nhật ký (Logs) qua ELK/Loki — giữa hàng triệu dòng thông báo vô thưởng vô phạt, một dòng chữ đỏ hiện lên như quỷ khí:
// ELK Stack — Kibana query: level:ERROR AND timestamp:[now-1h TO now]
ERROR [02:01:47] HikariPool-1 - Connection is not available, request timed out after 30000ms
ERROR [02:01:48] java.lang.OutOfMemoryError: Java heap space
WARN [02:01:49] Slow query detected (47,382ms): SELECT * FROM orders WHERE user_id=? ← ĐÂY RỒI!
// Missing index on orders.user_id → Full table scan → 12M rows → DB lock
Dấu vết đã rõ: Một Tâm Ma ẩn mình trong câu truy vấn SQL không có index. Sau nhiều ngày tích tụ silent, nó bộc phát ngay khi lượng truy cập tăng đột biến lúc xem pháo hoa — khiến Database bị phong tỏa hoàn toàn.
Cảnh Giới 3 — Trảm Ma: Nhất Kiếm Định Giang Sơn (Hotfix)
Trong tình thế ngàn cân treo sợi tóc, không có thời gian để rèn lại thanh kiếm mới. Phải dùng đến Thuật Vá Trận (Hotfix) — nhanh, chính xác, không để lại tác dụng phụ:
Incident Response Playbook — 02:07 to 02:21
1
Cô lập vùng ảnh hưởng — tắt tạm các non-critical service (report, analytics) để giải phóng DB connection cho core flow
2
Kill long-running queries — dùng pg_terminate_backend() để giết các query đang treo, giải phóng connection pool ngay lập tức
3
Scale up tài nguyên tạm thời — tăng DB connection pool limit + thêm read replica để hệ thống có hơi thở tạm thời
4
Hotfix deploy — thêm CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id); — index tạo không lock table, thực hiện được online
5
Monitor recovery — theo dõi Grafana, xác nhận query time giảm từ 47,000ms về 12ms trước khi declare incident resolved
Grafana
Loki
PostgreSQL
kubectl
PagerDuty
Dòng Thời Gian Trận Chiến
02:03 — BÁNG ĐỘNG ĐỎ
Truyền Tin Thạch Rung Lên
PagerDuty kích hoạt. Production down 100%. 47,000+ user không truy cập được. Tâm ma tỉnh giấc.
02:07 — PHÓNG THẦN THỨC
Grafana + Loki Lên Tiếng
DB connection pool exhausted. Tìm thấy slow query 47 giây trên bảng orders — thiếu index user_id. Root cause confirmed.
02:11 — TRẢM MA
Kill Queries + Scale Up
pg_terminate_backend() giải phóng 100 connection đang treo. Scale DB pool lên 200. Hệ thống bắt đầu thở lại.
02:21 — PHỤC HỒI
Linh Lực Xanh Trở Lại
Index tạo online thành công. Response time P99: 18ms. HTTP 200 rate: 99.97%. Incident resolved. Tổng thời gian: 18 phút.
Hậu Chiến — Đúc Lại Kiếm Phổ (Post-mortem)
Khi ánh mặt trời đầu tiên của năm mới hiện lên, trận chiến kết thúc. Nhưng sai lầm lớn nhất là sửa xong rồi quên. Phải viết "Hậu chiến ký sự" — không để truy cứu lỗi lầm, mà để cả tông môn học và trưởng thành:
Post-Mortem — "Incident Pháo Hoa Giao Thừa 2026"
1
Tại sao Tâm Ma này qua mặt được Unit Test? — Query SELECT * không có test với volume lớn. Cần thêm load test với realistic data size vào pipeline.
2
Tại sao Trận Nhãn không cảnh báo sớm hơn? — Alert threshold cho slow query là 5 giây, query này tích lũy dần từ 2s → 47s trong 3 ngày. Cần alert theo trend, không chỉ threshold tuyệt đối.
3
Làm sao để rèn thêm lớp giáp (Circuit Breaker)? — Nếu DB quá tải, cần tự động trả về cached response thay vì để toàn bộ hệ thống sập. Implement Circuit Breaker pattern với Resilience4j.
4
Action Items: Thêm DB index review vào checklist code review. Set up query performance baseline. Implement connection pool monitoring alert. Chaos engineering test trước các ngày lễ lớn.
Circuit Breaker
Load Testing
Runbook
Chaos Engineering
Mỗi lần bị dựng dậy lúc 2 giờ sáng là một lần bạn được "tặng" thêm vài năm công lực thực chiến.
Thanh bản mệnh kiếm sứt mẻ sau những đêm như thế — nhưng ngày càng sắc bén và đáng tin cậy hơn.
Chúc các đồng đạo một năm Uptime 99.99% và quan trọng nhất là… được ngủ ngon giấc!
[ SRE · Incident Response · Post-mortem · On-call ]