Ác mộng SSH từng server để grep log giữa đêm
Hệ thống bên mình chạm mốc 15 node Fedora Server vào khoảng nửa năm trước. Cơn ác mộng bắt đầu từ đó. Cứ mỗi lần app ném mã lỗi 500 giữa đêm, quy trình debug quen thuộc lại diễn ra: bật terminal, SSH vào từng node, rồi chạy journalctl -u app.service -f hoặc căng mắt grep từng dòng trong /var/log/nginx/access.log.
Quản lý 1–2 máy thì cách này vẫn ổn. Nhưng khi chạm ngưỡng hàng chục server, debug thủ công rất dễ bỏ lọt tương quan lỗi giữa các dịch vụ. Đội mình từng cân nhắc ELK stack (Elasticsearch, Logstash, Kibana). Tuy nhiên, riêng Elasticsearch đã chiếm đứt 4GB đến 8GB RAM JVM chỉ để chờ index log. Với dàn VPS nhỏ lẻ, con số này quá xa xỉ.
Sau 6 tháng chạy thực tế trên production, bộ ba Loki + Promtail + Grafana giải quyết trọn vẹn bài toán này: cấu hình gọn nhẹ, tốn ít RAM và tra cứu log tức thì.
Loki và Promtail vận hành như thế nào?
Grafana Loki chia sẻ tư duy thiết kế cốt lõi từ Prometheus. Thay vì đánh chỉ mục (index) toàn bộ nội dung text như Elasticsearch, Loki chỉ đánh index siêu dữ liệu (metadata/labels). Phần nội dung log thô được nén thành từng chunk dạng gzip/snappy rồi lưu thẳng xuống ổ đĩa cục bộ hoặc object storage.
Ba mắt xích trong mô hình
- Promtail: Agent chạy ngầm trên từng node Fedora. Nó theo dõi file trong
/var/log/hoặc đọc trực tiếp từ systemd journal, gắn nhãn (nhưhost=fedora-node-01,job=systemd-journal) rồi đẩy log qua HTTP POST tới Loki. - Loki: Node trung tâm tiếp nhận stream dữ liệu từ Promtail, nén chunks, lưu trữ và xử lý truy vấn bằng ngôn ngữ LogQL.
- Grafana: Dashboard trực quan, kết nối tới Loki như một data source để tìm kiếm, lọc vết lỗi và dựng đồ thị tần suất.
Nhờ cơ chế chỉ index label, Loki tiêu thụ tài nguyên cực kỳ khiêm tốn. Hệ thống của mình nuốt đều đặn 4 đến 5 triệu dòng log mỗi ngày nhưng Loki chỉ ăn loanh quanh 320MB đến 380MB RAM.
Thực hành: Triển khai cụm log trên Fedora Server
Fedora Server hỗ trợ kernel mới, systemd hoàn chỉnh và hệ thống package rất cập nhật. Dưới đây là các bước dựng hoàn chỉnh từ zero.
Bước 1: Cài đặt Grafana
Thêm repository chính thức của Grafana vào Fedora:
sudo tee /etc/yum.repos.d/grafana.repo << 'EOF'
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgkey=https://rpm.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF
sudo dnf install -y grafana
sudo systemctl daemon-reload
sudo systemctl enable --now grafana-server
Kiểm tra trạng thái lắng nghe trên cổng 3000:
sudo ss -tulpn | grep 3000
Bước 2: Cài đặt binary Loki và Promtail
Grafana cung cấp bản build binary Linux độc lập trên GitHub. Mình tải trực tiếp binary về /usr/local/bin/ để quản lý tập trung bằng systemd:
LOKI_VERSION="v3.0.0"
sudo dnf install -y unzip curl
# Tải và giải nén Loki binary
curl -fsSL -o /tmp/loki.zip "https://github.com/grafana/loki/releases/download/${LOKI_VERSION}/loki-linux-amd64.zip"
sudo unzip -q -o -d /usr/local/bin/ /tmp/loki.zip
sudo chmod 755 /usr/local/bin/loki-linux-amd64
sudo ln -sf /usr/local/bin/loki-linux-amd64 /usr/local/bin/loki
# Tải và giải nén Promtail binary
curl -fsSL -o /tmp/promtail.zip "https://github.com/grafana/loki/releases/download/${LOKI_VERSION}/promtail-linux-amd64.zip"
sudo unzip -q -o -d /usr/local/bin/ /tmp/promtail.zip
sudo chmod 755 /usr/local/bin/promtail-linux-amd64
sudo ln -sf /usr/local/bin/promtail-linux-amd64 /usr/local/bin/promtail
Bước 3: Cấu hình Loki Server
Tạo riêng người dùng hệ thống loki để tăng tính bảo mật, tránh chạy tiến trình dưới quyền root:
sudo useradd --system --no-create-home --shell /sbin/nologin loki || true
sudo mkdir -p /etc/loki /var/lib/loki
sudo chown -R loki:loki /var/lib/loki
Tạo file cấu hình /etc/loki/loki-config.yaml:
sudo tee /etc/loki/loki-config.yaml << 'EOF'
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
instance_addr: 127.0.0.1
path_prefix: /var/lib/loki
storage:
filesystem:
chunks_directory: /var/lib/loki/chunks
rules_directory: /var/lib/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h
EOF
Khởi tạo systemd service cho Loki:
sudo tee /etc/systemd/system/loki.service << 'EOF'
[Unit]
Description=Loki service
After=network.target
[Service]
Type=simple
User=loki
Group=loki
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-config.yaml
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now loki
Bước 4: Cấu hình Promtail đọc systemd journal và log file
Promtail trên Fedora hỗ trợ hook trực tiếp vào journald mà không cần cấu hình rsyslog trung gian.
Để Promtail có quyền đọc journal và file log, thêm user promtail vào nhóm systemd-journal và adm:
sudo useradd --system --no-create-home --shell /sbin/nologin promtail || true
sudo usermod -aG systemd-journal,adm promtail
sudo mkdir -p /etc/promtail /var/lib/promtail
sudo chown -R promtail:promtail /var/lib/promtail
Tạo cấu hình thu thập /etc/promtail/promtail-config.yaml:
sudo tee /etc/promtail/promtail-config.yaml << 'EOF'
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /var/lib/promtail/positions.yaml
clients:
- url: http://127.0.0.1:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
host: fedora-server
__path__: /var/log/*.log
- job_name: journal
journal:
max_age: 12h
labels:
job: systemd-journal
host: fedora-server
relabel_configs:
- source_labels: ['__journal__systemd_unit']
target_label: 'unit'
- source_labels: ['__journal_priority_keyword']
target_label: 'level'
EOF
Khởi chạy service Promtail:
sudo tee /etc/systemd/system/promtail.service << 'EOF'
[Unit]
Description=Promtail service
After=network.target
[Service]
Type=simple
User=promtail
Group=promtail
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/promtail-config.yaml
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now promtail
Bước 5: Cấu hình Firewalld
Fedora Server kích hoạt firewalld theo mặc định. Mở port 3000 cho Grafana và port 3100 cho Loki (nếu bạn cần nhận log từ các server khác):
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --permanent --add-port=3100/tcp
sudo firewall-cmd --reload
Bước 6: Truy vấn log trên Grafana bằng LogQL
Truy cập http://<IP-Fedora-Server>:3000 từ trình duyệt. Đăng nhập bằng tài khoản mặc định admin / admin và đổi mật khẩu mới.
- Vào Connections > Data sources > chọn Add data source > click Loki.
- Tại ô URL, điền
http://127.0.0.1:3100rồi nhấn Save & test (Grafana sẽ báo xanh nếu kết nối thông suốt). - Mở menu Explore, chọn Data source là Loki để bắt đầu viết truy vấn.
Một số câu lệnh LogQL thực tế hữu ích khi vận hành:
# Lọc toàn bộ log từ systemd-journal có chứa chuỗi "error" (không phân biệt hoa thường)
{job="systemd-journal"} |=? "error"
# Lọc riêng lỗi của dịch vụ SSH
{unit="sshd.service", level="err"}
# Tính tốc độ lỗi HTTP 500 từ Nginx log theo block 5 phút
sum(rate({job="varlogs"} |= " 500 " [5m])) by (host)
Nhẹ, ổn định và đủ dùng cho production vừa và nhỏ
Bỏ cách SSH thủ công sang dùng Loki + Promtail giúp đội mình cắt giảm thời gian truy vết sự cố từ hơn 20 phút xuống còn chưa đầy 2 phút. Chỉ với một con VPS Fedora 2 vCPU và 2GB RAM (giá tầm 5–6$/tháng), cả cụm Grafana lẫn Loki vẫn chạy mượt mà mà không lo nghẽn bộ nhớ.

