Hướng Dẫn Triển Khai Cụm ELK Kết Hợp Redis Middleware cho Thu Thập Nhật ký

Cấu Hình Môi Trường & Chuẩn Bị Hạ Tầng

Dưới đây là sơ đồ phân bổ tài nguyên trên ba máy chủ vật lý/virtual:

  • nodemaster01 (192.168.1.10): Chạy Elasticsearch + Logstash
  • nocache01 (192.168.1.11): Chạy Elasticsearch + Logstash + Redis
  • nodeui01 (192.168.1.12): Chạy Elasticsearch + Kibana

Gán tên miền nội bộ tương ứng trong tệp_hosts_ để đảm bảo giao tiếp ổn định giữa các thành phần:

echo '192.168.1.10 nodemaster01
192.168.1.11 nocache01
192.168.1.12 nodeui01' | sudo tee -a /etc/hosts

Tối Ưu Kernel & Giới Hạn Tài Nguyên

Elasticsearch yêu cầu vùng nhớ ảo lớn để sắp xếp chỉ mục. Điều chỉnh tham số hệ thống ngay lập tức và ghi vĩnh viễn vào kernel params:

sudo sysctl -w vm.max_map_count=655360
echo "vm.max_map_count = 655360" | sudo tee -a /etc/sysctl.conf

Cấp quyền mở rộng file descriptor và tiến trình con cho người dùng chạy ứng dụng logging:

# Thêm vào /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

Sau khi lưu, đăng xuất rồi đăng nhập lại để áp dụng giới hạn. Kiểm tra bằng lệnh ulimit -n.

Cài Đặt Runtime Java

Phiên bản Logstash và ES 6.x yêu cầu JDK 8 trở lên. Sử dụng kho EPEL để triển khai nhanh:

sudo yum install -y java-1.8.0-openjdk-devel net-tools vim wget epel-release
sudo ln -sf $(which java) /usr/bin/java

Khoảng Cách Mạng & Tài Khoản Dịch Vụ

Tắt tường lửa mặc định của CentOS 7 để tránh chặn cổng giao tiếp nội bộ:

sudo systemctl disable --now firewalld

Tạo nhóm và người dùng chuyên biệt để chạy daemon, đảm bảo tuân thủ nguyên tắc least privilege:

sudo groupadd -r logging && sudo useradd -r -g logging -d /opt/logging logging

Nạp Gói Phần Mềm Nguồn

Tải trực tiếp gói nén từ kho chính thức của Elastic:

BASE_URL=https://artifacts.elastic.co/downloads
wget ${BASE_URL}/elasticsearch/elasticsearch-6.4.3.tar.gz
wget ${BASE_URL}/logstash/logstash-6.4.3.tar.gz
wget ${BASE_URL}/kibana/kibana-6.4.3-linux-x86_64.tar.gz

Thiết Lập Nhân Từ Elasticsearch

Giải nén và gán quyền sở hữu thư mục làm việc cho tài khoản logging:

sudo tar xf elasticsearch-6.4.3.tar.gz -C /opt/
sudo chown -R logging:logging /opt/elasticsearch-6.4.3/
sudo mkdir -p /var/data/es/{data,logs} && sudo chown -R logging:logging /var/data/es

Tệp cấu hình chính (elasticsearch.yml) cần được tối giản hóa tập trung vào tính năng cụm và phát hiện nút:

cluster.name: log_platform_v1
node.name: nodemaster01
node.master: true
node.data: true
path.data: /var/data/es/data
path.logs: /var/data/es/logs
network.host: nodemaster01
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["nodemaster01", "nocache01", "nodeui01"]
discovery.zen.minimum_master_nodes: 2
discovery.zen.fd.ping_timeout: 100s
action.destructive_requires_name: true
http.cors.enabled: true
http.cors.allow-origin: "*"
bootstrap.memory_lock: false

Lưu ý cấu hình: Tham số discovery.zen.minimum_master_nodes được đặt ở mức 2 để tránh chia cắt脑 (split-brain) khi một nút master ngoại tuyến. Đường dẫn dữ liệu và nhật ký đã tách rời khỏi thư mục cài đặt gốc để tiện backup. CORS được bật để cho phép giao diện web truy cập API trực tiếp.

Khởi chạy daemon dưới dạng nền để kiểm thử nhanh:

su - logging -c "/opt/elasticsearch-6.4.3/bin/elasticsearch"

Xác nhận trạng thái cụm bằng công cụ curl:

curl -s http://nodemaster01:9200/_cat/health?v
epoch      timestamp cluster        status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1709312455 08:14:30    log_platform_v1 green           3         3      0   0    0    0        0             0                  -                100.0%

Triển Khai Redis làm Trung Gian Lưu Thông

Redis sẽ đóng vai trò hàng chờ (buffer) giúp giải耦 Logstash input/output. Cài đặt và tinh chỉnh tệp tinstruct:

sudo yum install -y redis
sudo sed -i 's/^bind .*/bind nocache01/' /etc/redis.conf
sudo sed -i 's/^maxmemory .*/maxmemory 2gb/' /etc/redis.conf
sudo systemctl enable --now redis

Bảo mật kết nối Redis thông qua protected-mode yes và cấu hình persistence cơ bản. Cổng mặc định 6379 sẽ lắng nghe trên interface nội bộ.

Xây Dựng Pipeline Xử Lý Logstash

Logstash trên nodemaster01 sẽ thu thập file nhật ký hệ thống và đẩy về Redis. Tệp cấu hình pipeline (pipelines.yml hoặc logstash.conf) được thiết kế theo mô hình hai bước:

Bước 1: Nhập (Input → Redis)

input {
  file {
    path => "/var/log/messages"
    start_position => "beginning"
    type => "os_syslog"
    sincedb_path => "/dev/null"
  }
}
filter {
  grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } }
  date { match => [ "syslog_timestamp", "MMM dd HH:mm:ss" ] }
}
output {
  redis {
    host => "nocache01"
    port => 6379
    data_type => "list"
    key => "queue:raw_logs_b64"
    codec => json
  }
}

Bước 2: Xuất (Redis → Elasticsearch)

Cùng máy hoặc máy khác có thể chạy consumer pipeline để lọc và ghi chỉ mục:

input {
  redis {
    host => "nocache01"
    port => 6379
    data_type => "list"
    key => "queue:raw_logs_b64"
    codec => json
  }
}
filter {
  mutate { remove_field => [ "@version", "host", "path" ] }
  if [type] == "os_syslog" {
    geoip { source => "client_ip" target => "[@metadata][geo]" }
  }
}
output {
  elasticsearch {
    hosts => ["nodemaster01:9200","nocache01:9200","nodeui01:9200"]
    index => "app-os-log-%{+yyyy.MM.dd}"
    document_type => "_doc"
  }
}

Cập nhật biến môi trường cơ sở cho Logstash:

# logstash.yml
node.name: processing-worker-01
path.data: /var/data/lst/data
path.logs: /var/data/lst/logs
http.host: "nodemaster01"
pipeline.workers: 4

Kích Hoạt Dashboard Trực Quan

Giải nén Kibana và tạo tệp PID placeholder để quản lý quy trình khởi động:

sudo tar xf kibana-6.4.3-linux-x86_64.tar.gz -C /opt/
sudo chown -R logging:logging /opt/kibana-6.4.3-linux-x86_64
touch /var/run/kibana.pid && sudo chown logging /var/run/kibana.pid

Khởi chạy service và verify cổng lắng nghe:

cd /opt/kibana-6.4.3-linux-x86_64 && su - logging -c "nohup bin/kibana > /dev/null 2>&1 &"
ss -lnt | grep 5601
LISTEN  0  128  192.168.1.12:5601  *

Giao diện web sẽ hiển thị dashboard mặc định. Người dùng có thể truy cập http://nodeui01:5601/app/kibana để tạo pattern chỉ mục app-os-log-* và bắt đầu phân tích luồng dữ liệu thực tế.

Thẻ: Elasticsearch Logstash kibana Redis middleware

Đăng vào ngày 20 tháng 9 lúc 17:15