Hướng dẫn cài đặt ELK Stack: Quản lý Log tập trung từ A-Z cho dân SysAdmin

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Tại sao bạn nên ngừng đọc log theo cách thủ công?

Đang quản lý cụm 10-20 server mà vẫn SSH vào từng con để tail -f thì thực sự là một cơn ác mộng. Khi hệ thống gặp lỗi vào lúc 2 giờ sáng, việc grep mỏi mắt qua hàng chục file log Nginx hay Application chỉ khiến bạn thêm stress. Đặc biệt với kiến trúc microservices, một request đi qua 5-7 dịch vụ khác nhau. Nếu không có log tập trung, việc trace lỗi gần như là nhiệm vụ bất khả thi.

Đó là lý do ELK Stack trở thành tiêu chuẩn vàng. Trước đây mình từng ưu tiên Graylog vì nó nhẹ, nhưng khi cần search full-text tốc độ cao và dashboard chuyên sâu, ELK vẫn là tượng đài khó lật đổ. Tuy nhiên, Elasticsearch nổi tiếng là “máy hút RAM”. Mình từng cài thử nó trên VPS 2GB và kết quả là Kernel OOM Killer “trảm” nó trong chưa đầy 60 giây. Bài viết này sẽ giúp bạn cài đặt đúng cách và né sạch những cú lừa về tài nguyên.

Bộ ba nguyên tử ELK: Chúng làm nhiệm vụ gì?

Hiểu rõ luồng dữ liệu sẽ giúp bạn debug nhanh hơn khi hệ thống “hắt hơi sổ mũi”:

  • Elasticsearch (The Brain): Trái tim lưu trữ dữ liệu. Nó đánh chỉ mục (index) log giúp bạn tìm kiếm kết quả trong hàng triệu dòng log chỉ mất vài miligiây.
  • Logstash (The Pipe): Bộ lọc đa năng. Nó tiếp nhận log thô, bóc tách dữ liệu (như tách IP, User-Agent) rồi đẩy về kho lưu trữ.
  • Kibana (The Face): Giao diện trực quan. Đây là nơi bạn vẽ biểu đồ traffic, theo dõi tỷ lệ lỗi 5xx hoặc tạo dashboard giám sát thời gian thực.

Trong thực tế, người ta thường dùng thêm Filebeat (một thành phần của Beats family) để đẩy log từ server client về. Nó cực nhẹ, chỉ tốn khoảng 10-20MB RAM, thay vì cài cả Logstash nặng nề lên từng node.

Chuẩn bị hạ tầng trước khi triển khai

Đừng cố chạy ELK trên cấu hình yếu nếu không muốn server treo liên tục. Cấu hình khuyến nghị của mình:

  • Hệ điều hành: Ubuntu 22.04 LTS (ổn định nhất hiện nay).
  • RAM: Tối thiểu 4GB cho môi trường Lab, 16GB-32GB cho Production.
  • CPU: 2 Cores trở lên.
  • Disk: SSD là bắt buộc. Tốc độ ghi log của ELK rất lớn, dùng HDD sẽ gây nghẽn I/O ngay lập tức.

Bước 1: Cài đặt Elasticsearch – Thiết lập kho lưu trữ

Đầu tiên, hãy import GPG key và thêm repository chính thức từ Elastic:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
sudo apt-get install apt-transport-https
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt-get update && sudo apt-get install elasticsearch

Cảnh báo: Ở phiên bản 8.x, bảo mật được bật mặc định. Khi cài xong, terminal sẽ hiển thị mật khẩu cho user elastic. Hãy copy nó ra Notepad ngay. Nếu lỡ tay xóa màn hình terminal, bạn sẽ phải reset mật khẩu rất phiền phức.

Mở file /etc/elasticsearch/elasticsearch.yml và chỉnh sửa các thông số cơ bản cho node đơn lẻ:

network.host: 0.0.0.0
discovery.type: single-node
xpack.security.enabled: true

Kích hoạt dịch vụ để tự chạy khi reboot:

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

Bước 2: Cài đặt Kibana – Cửa sổ quan sát dữ liệu

Việc cài đặt Kibana khá nhàn hạ vì nó không yêu cầu cấu hình phức tạp ban đầu:

sudo apt-get install kibana
sudo systemctl enable kibana
sudo systemctl start kibana

Để truy cập giao diện qua trình duyệt, bạn cần sửa server.host trong file /etc/kibana/kibana.yml thành "0.0.0.0". Sau đó, truy cập http://IP_CUA_BAN:5601. Kibana sẽ yêu cầu mã xác thực (enrollment token). Bạn tạo mã này bằng lệnh:

sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

Bước 3: Cấu hình Logstash – Xử lý pipeline thông minh

Logstash giúp biến đống log hỗn độn thành dữ liệu có cấu trúc. Cài đặt bằng lệnh sudo apt-get install logstash. Sau đó, tạo file cấu hình pipeline tại /etc/logstash/conf.d/nginx-log.conf:

input {
  beats { port => 5044 }
}

filter {
  if [type] == "nginx_access" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
}

output {
  elasticsearch {
    hosts => ["https://localhost:9200"]
    user => "elastic"
    password => "MAT_KHAU_BUOC_1"
    ssl_certificate_verification => false
  }
}

Lưu ý: Grok filter là con dao hai lưỡi. Nếu viết Regex sai, Logstash sẽ tốn rất nhiều CPU để xử lý. Hãy luôn dùng Grok Debugger trong mục Dev Tools của Kibana để test trước khi apply vào thực tế.

Kinh nghiệm xương máu: Để ELK không trở thành gánh nặng

Sau nhiều lần “ăn hành” vì hệ thống crash, mình rút ra 3 bài học lớn:

  1. Kiểm soát JVM Heap Size: Đừng bao giờ để Elasticsearch tự quyết định lượng RAM sử dụng. Hãy giới hạn trong file jvm.options. Công thức chuẩn: Set bằng 50% tổng RAM hệ thống nhưng không vượt quá 32GB.
  2. Quản lý vòng đời Log (ILM): Đã có lúc server mình đầy sạch 500GB SSD chỉ sau 2 tuần vì log debug quá nhiều. Hãy cấu hình Policy để tự động xóa hoặc nén log cũ sau 15-30 ngày.
  3. Tránh Alert Fatigue: Đừng set cảnh báo Telegram cho mọi lỗi 404. Bạn sẽ sớm bị “loạn” thông báo. Chỉ nên alert khi tỷ lệ lỗi 5xx tăng đột biến 15% trong vòng 5 phút.

Lời kết

Cài đặt ELK Stack chỉ là bước khởi đầu. Sức mạnh thực sự nằm ở cách bạn lọc dữ liệu và xây dựng dashboard để nhìn thấy những thứ mà mắt thường không thấy được. Ở bài tới, mình sẽ hướng dẫn cách setup Filebeat để thu thập log từ các cụm Docker Swarm/K8s về ELK. Nếu gặp lỗi Connection Refused hay Authentication Failed, hãy để lại comment phía dưới nhé!

Share: