Cài đặt Grafana Loki và Promtail trên Fedora Server: Gom log tập trung, nhẹ hơn ELK

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Á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.

  1. Vào Connections > Data sources > chọn Add data source > click Loki.
  2. Tại ô URL, điền http://127.0.0.1:3100 rồi nhấn Save & test (Grafana sẽ báo xanh nếu kết nối thông suốt).
  3. 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ớ.

Share: