Vấn đề: Đừng biến database thành “kho chứa chết”
3 giờ sáng, điện thoại đổ chuông liên hồi. Server chạy ứng dụng production bỗng dưng “ngỏm” vì tràn ổ cứng. Sáng hôm sau kiểm tra log, mình mới nhận ra InfluxDB đã ghi nhận dung lượng đĩa tăng vọt từ 4 tiếng trước đó. Tuy nhiên, vì chỉ lo lưu trữ mà không có cơ chế giám sát chủ động, mình hoàn toàn mù tịt về sự cố đang âm ỉ xảy ra.
Trước khi biết đến Kapacitor, mình thường dùng script Python chạy cronjob 5 phút một lần để truy vấn InfluxDB và kiểm tra ngưỡng (threshold). Cách này cực kỳ tốn tài nguyên và luôn có độ trễ lớn. Kapacitor xuất hiện để chấm dứt tình trạng này. Nó giúp bạn xử lý dữ liệu ngay khi vừa đổ vào database và kích hoạt hành động phản ứng tức thì.
Kapacitor là gì?
Trong bộ tứ TICK Stack (Telegraf, InfluxDB, Chronograf, Kapacitor), Kapacitor đóng vai trò là “trạm xử lý trung tâm”. Nếu InfluxDB là nơi lưu trữ, Kapacitor chính là bộ não phân tích. Công cụ này vượt trội ở ba khả năng:
- Stream Processing: Theo dõi luồng dữ liệu thời gian thực và báo động ngay lập tức.
- Batch Processing: Chạy các truy vấn tính toán phức tạp trên khối lượng dữ liệu lịch sử lớn.
- Đa dạng đầu ra: Gửi cảnh báo qua Telegram, Slack, Email hoặc gọi Webhook để tự động scale-up server.
So với Alertmanager của Prometheus, Kapacitor linh hoạt hơn hẳn nhờ ngôn ngữ TICKscript, cho phép bạn viết logic cảnh báo phức tạp như một lập trình viên thực thụ.
Bước 1: Cài đặt InfluxDB và Kapacitor lên Ubuntu
Ở hướng dẫn này, mình sử dụng Ubuntu 22.04 và InfluxDB phiên bản 1.8 để đảm bảo tính ổn định cao nhất với TICKscript truyền thống.
# Thêm repository chính thức từ InfluxData
wget -q https://repos.influxdata.com/influxdata-archive_compat.key
echo '393e8779c8945d31955614b03973f3510af1022fe4440455b2395634179739a5 influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
# Cài đặt nhanh combo InfluxDB & Kapacitor
sudo apt update && sudo apt install influxdb kapacitor -y
# Kích hoạt dịch vụ hệ thống
sudo systemctl enable --now influxdb
sudo systemctl enable --now kapacitor
Gõ lệnh kapacitor version để kiểm tra. Nếu terminal trả về phiên bản (ví dụ 1.6.x), bạn đã cài đặt thành công.
Bước 2: Cấu hình kết nối
Mặc định Kapacitor sẽ tìm InfluxDB tại localhost:8086. Nếu bạn tách database sang server riêng, hãy chỉnh sửa file cấu hình sau:
sudo nano /etc/kapacitor/kapacitor.conf
Tìm đến block [[influxdb]] và cập nhật URL chính xác:
[[influxdb]]
enabled = true
urls = ["http://127.0.0.1:8086"]
timeout = "0s"
Sau khi lưu, hãy khởi động lại service: sudo systemctl restart kapacitor.
Bước 3: Viết TICKscript cảnh báo CPU
Hãy cùng tạo một script theo dõi chỉ số CPU. Chúng ta sẽ cấu hình để hệ thống ghi log nếu mức sử dụng CPU trung bình vượt quá 80% trong vòng 1 phút.
Tạo file cpu_alert.tick:
stream
|from()
.database('telegraf')
.retentionPolicy('autogen')
.measurement('cpu')
.where(lambda: "cpu" == 'cpu-total')
|window()
.period(1m)
.every(1m)
|mean('usage_user')
|alert()
.crit(lambda: "mean" > 80)
.log('/tmp/cpu_alerts.log')
Cơ chế hoạt động của script này khá đơn giản. Lệnh window() giúp gom nhóm dữ liệu trong 60 giây để tính trung bình. Điều này cực kỳ quan trọng vì nó giúp loại bỏ các trường hợp CPU “nhảy vọt” (spike) tức thời gây báo động giả.
Bước 4: Triển khai Task
Để script thực sự chạy, bạn cần nạp nó vào Kapacitor thông qua hai bước: định nghĩa (define) và kích hoạt (enable).
# Định nghĩa task mới
kapacitor define cpu_high_alert -tick cpu_alert.tick -dbrp telegraf.autogen
# Kích hoạt task
kapacitor enable cpu_high_alert
Kiểm tra trạng thái bằng lệnh kapacitor show cpu_high_alert. Bạn sẽ thấy một biểu đồ dạng text hiển thị số lượng điểm dữ liệu (points) đang được xử lý qua từng node.
Bước 5: Kết nối Telegram để nhận tin nhắn tức thì
Ghi log vào file là chưa đủ. Để nhận cảnh báo ngay trên điện thoại, hãy mở /etc/kapacitor/kapacitor.conf và tìm phần [telegram]:
[telegram]
enabled = true
url = "https://api.telegram.org/bot"
token = "123456789:ABCDefGhIJK..." # Token từ BotFather
chat-id = "987654321"
Cập nhật lại file TICKscript của bạn ở node alert:
|alert()
.crit(lambda: "mean" > 80)
.telegram()
Sau đó, chạy lại lệnh kapacitor define cpu_high_alert -tick cpu_alert.tick để Kapacitor cập nhật cấu hình mới.
Kinh nghiệm thực chiến từ hệ thống 500+ Nodes
Sau nhiều năm vận hành các hệ thống IoT và Monitoring quy mô lớn, mình rút ra 3 lưu ý quan trọng:
- Ưu tiên Batch cho dữ liệu lớn: Nếu bạn có hàng nghìn sensor gửi dữ liệu mỗi giây, việc dùng
streamsẽ ngốn sạch RAM. Hãy chuyển sangbatchđể truy vấn dữ liệu theo chu kỳ 5-10 phút/lần. - Deadman’s Switch: Đây là tính năng “cứu cánh”. Nếu một thiết bị bỗng dưng im lặng (mất mạng, hỏng nguồn), Kapacitor sẽ phát hiện sự thiếu hụt dữ liệu và báo động ngay cho bạn.
- Kiểm tra Retention Policy: Task sẽ không bao giờ chạy nếu bạn khai báo sai database hoặc retention policy trong TICKscript. Luôn kiểm tra kỹ thông số này với InfluxDB.
Lời kết
Kapacitor không đơn thuần là công cụ cảnh báo, nó là một engine xử lý dữ liệu mạnh mẽ. Việc kết hợp InfluxDB và Kapacitor giúp bạn chuyển dịch từ thế bị động sang chủ động hoàn toàn. Hệ thống giờ đây không chỉ biết lưu trữ mà còn biết tự tư duy và phản ứng với sự cố.
