1. Vấn đề thực tế: Server sập lúc 2h sáng và sự bất lực khi thiếu metrics
2 giờ sáng thứ Bảy, hệ thống API báo lỗi 504 Gateway Timeout hàng loạt. Khách hàng réo, sếp gọi, mình vội bật laptop SSH vào server gõ top, free -m, df -h. Trớ trêu thay, CPU lúc này chỉ 3%, RAM trống hơn 10GB và ổ cứng còn hơn 40% dung lượng. Sự cố diễn ra trong khoảng 5 phút rồi tự hết, để lại một hiện trường sạch trơn.
Không có dữ liệu lịch sử (historical metrics), mình hoàn toàn đoán mò. CPU spike do cronjob chạy ngầm? Memory leak khiến OOM-killer kích hoạt? Hay ổ cứng bị nghẽn I/O do database flush dữ liệu? Câu trả lời là: không ai biết.
2. Phân tích nguyên nhân: Vì sao các lệnh CLI truyền thống là chưa đủ?
Các lệnh kinh điển như top, vmstat hay iostat chỉ cho bạn biết trạng thái tại đúng giây bạn ấn Enter. Chúng là ảnh chụp tức thời (snapshot). Khi sự cố trôi qua, mọi dấu vết đều biến mất.
Mặt khác, log ứng dụng chỉ ghi nhận lỗi ở tầng code (như timeout kết nối DB), chứ không nói cho bạn biết lúc đó disk write latency vọt lên 500ms. Khi hạ tầng tăng từ 1 lên 10 hay 50 server, việc SSH vào từng máy để kiểm tra thủ công là bất khả thi. Bạn cần một hệ thống tự động gom chỉ số định kỳ và lưu vào cơ sở dữ liệu chuyên dụng (Time-series DB).
3. So sánh các phương án giám sát hạ tầng
- SaaS (Datadog, New Relic): Cài đặt bằng một dòng lệnh, giao diện rất đẹp. Tuy nhiên, chi phí khoảng $15 – $23/host/tháng. Khi cụm server phình to kèm hàng triệu custom metrics, hóa đơn cuối tháng sẽ trở thành gánh nặng lớn.
- Zabbix / Nagios: Rất mạnh trong việc check trạng thái sống/chết (up/down). Điểm trừ là cấu hình agent khá cồng kềnh, tiêu tốn tài nguyên và khả năng xử lý dữ liệu chuỗi thời gian không linh hoạt bằng Prometheus.
- Tự viết Bash script đẩy vào MySQL/InfluxDB: Dễ viết lúc đầu nhưng khó scale, dễ lỗi format và tốn công bảo trì hạ tầng lưu trữ.
4. Giải pháp: Bộ ba Prometheus, Node Exporter và Grafana
Đây là tiêu chuẩn thực tế (de-facto standard) trong giới DevOps nhờ tính gọn nhẹ, miễn phí và khả năng mở rộng tốt:
- Node Exporter: Agent thu thập số liệu phần cứng (CPU, RAM, Disk, Network) trên từng server và mở endpoint HTTP
:9100/metrics. - Prometheus: Server trung tâm, định kỳ 15 giây chủ động kéo (pull) metrics về lưu trữ dạng chuỗi thời gian.
- Grafana: Giao diện trực quan hóa, truy vấn dữ liệu từ Prometheus để vẽ dashboard và thiết lập cảnh báo (Alerting).
Bước 1: Tạo System User và phân quyền thư mục
Chạy các tiến trình giám sát bằng user root là rủi ro bảo mật không cần thiết. Hãy tạo các service user riêng biệt:
sudo useradd --no-create-home --shell /bin/false prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
Bước 2: Cài đặt và cấu hình Node Exporter
Tải bản phát hành ổn định (ví dụ v1.8.2) từ GitHub:
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar -xvf node_exporter-1.8.2.linux-amd64.tar.gz
sudo mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
rm -rf node_exporter-1.8.2.*
Tạo systemd service để quản lý tiến trình:
sudo nano /etc/systemd/system/node_exporter.service
Nội dung file:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Khởi chạy và bật tự động bật khi reboot:
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
Kiểm tra dữ liệu mẫu trả về:
curl -s http://localhost:9100/metrics | head -n 10
Bước 3: Cài đặt và cấu hình Prometheus Server
Tải gói binary Prometheus (bản 2.54.1):
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
tar -xvf prometheus-2.54.1.linux-amd64.tar.gz
cd prometheus-2.54.1.linux-amd64
sudo mv prometheus promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool
sudo mv consoles console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus/consoles /etc/prometheus/console_libraries
Tạo file cấu hình quét metrics:
sudo nano /etc/prometheus/prometheus.yml
Cấu hình Prometheus định kỳ lấy số liệu từ chính nó và Node Exporter:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
Phân quyền lại file cấu hình:
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
Tạo systemd service cho Prometheus:
sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/ \
--storage.tsdb.retention.time=30d \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Khởi chạy service:
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
Kiểm tra trên trình duyệt qua cổng 9090: http://IP_SERVER:9090. Vào mục Status > Targets, nếu cả 2 endpoint đều báo trạng thái UP màu xanh lá là thành công.
Bước 4: Cài đặt Grafana
Cài đặt Grafana từ repository chính thức của Grafana Labs để luôn nhận được các bản vá bảo mật:
sudo apt update
sudo apt install -y apt-transport-https software-properties-common wget
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install -y grafana
sudo systemctl enable --now grafana-server
Mở trình duyệt truy cập: http://IP_SERVER:3000. Tài khoản ban đầu là admin / admin (Grafana sẽ yêu cầu đặt mật khẩu mới ngay khi vào).
Bước 5: Kết nối Prometheus và import Dashboard chuẩn
- Trong giao diện Grafana, chọn Connections > Data sources > nhấn Add data source.
- Chọn Prometheus.
- Tại trường Prometheus server URL, nhập
http://localhost:9090. - Kéo xuống cuối trang, nhấn Save & test để xác nhận kết nối.
- Để dựng giao diện theo dõi mà không cần vẽ thủ công từng chart: vào Dashboards > New > Import.
- Nhập ID Dashboard cộng đồng phổ biến nhất cho Node Exporter:
1860(Node Exporter Full) rồi nhấn Load. - Chọn Data source Prometheus vừa kết nối ở bước trên và bấm Import.
Toàn bộ tài nguyên server sẽ hiển thị trực quan: % CPU sử dụng theo từng core, RAM cache/available thực tế, I/O read/write latency và lưu lượng network throughput theo thời gian thực.

