一、项目概述

本项目将在昨天已经部署好的高可用 Web 集群基础上,搭建一套完整的 ELK(Elasticsearch+Logstash+Kibana+Filebeat)分布式日志分析系统,实现全链路日志的统一收集、存储、搜索、可视化和告警。

这是运维工程师必备的核心技能,几乎所有互联网公司都使用 ELK 栈来处理海量日志数据。

项目架构图

客户端
   |
   v
Keepalived(VIP)
   |         |
   v         v
HAProxy1  HAProxy2
   |         |
   v         v
Nginx1    Nginx2
   |         |
   v         v
Tomcat1   Tomcat2
   |         |
   v         v
Filebeat  Filebeat  # 所有节点都部署Filebeat
   |         |
   v         v
   Logstash         # 日志过滤和解析
       |
       v
   Elasticsearch    # 日志存储和搜索
       |
       v
     Kibana         # 可视化和告警

项目亮点

  • 与上一个高可用 Web 集群无缝对接
  • 全链路日志收集(HAProxy、Nginx、Tomcat、系统日志)
  • 结构化日志解析,支持多维度搜索
  • 自定义可视化仪表盘,实时监控系统状态
  • 日志告警功能,异常情况及时通知
  • 可横向扩展,支持 TB 级日志处理

二、虚拟机规划与硬件要求

在你昨天 6 台虚拟机的基础上,新增 3 台虚拟机

表格

主机名 IP 地址 操作系统 CPU 内存 硬盘 角色
es-master 192.168.176.140 CentOS 7.9 2 核 4GB 40GB Elasticsearch 主节点
es-data 192.168.176.141 CentOS 7.9 2 核 4GB 60GB Elasticsearch 数据节点
logstash-kibana 192.168.176.142 CentOS 7.9 2 核 3GB 20GB Logstash+Kibana

总硬件要求:物理机 CPU≥14 核,内存≥21GB,硬盘≥240GB。如果你的物理机资源不足,可以将 Elasticsearch 主节点和数据节点合并为 1 台(2 核 6GB 内存)。

三、环境准备(所有新增节点执行)

1. 关闭防火墙和 SELinux

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2. 配置主机名和 hosts 文件

# 以es-master为例,其他节点修改对应主机名
hostnamectl set-hostname es-master

# 配置hosts文件(所有节点都要执行,包括之前的6台)
cat >> /etc/hosts << EOF
192.168.176.140 es-master
192.168.176.141 es-data
192.168.176.142 logstash-kibana
EOF

3. 配置时间同步

yum install -y ntpdate
ntpdate ntp.aliyun.com
echo "*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com >> /var/log/ntpdate.log 2>&1" | crontab -

4. 安装 JDK 1.8(Elasticsearch 和 Logstash 需要)

wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_202 /usr/local/jdk

cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=\$JAVA_HOME/jre
export CLASSPATH=.:\$JAVA_HOME/lib:\$JRE_HOME/lib
export PATH=\$PATH:\$JAVA_HOME/bin
EOF

source /etc/profile
java -version

5. 优化内核参数(Elasticsearch 必须)

cat >> /etc/sysctl.conf << EOF
vm.max_map_count=655360
fs.file-max=655360
EOF

sysctl -p

cat >> /etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
EOF

四、详细部署步骤

第一部分:部署 Elasticsearch 集群(es-master 和 es-data 节点)

1. 下载并安装 Elasticsearch 
# 下载Elasticsearch(华为云镜像,速度快)
wget https://mirrors.huaweicloud.com/elasticsearch/7.15.1/elasticsearch-7.15.1-linux-x86_64.tar.gz

# 解压安装
tar -zxvf elasticsearch-7.15.1-linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/elasticsearch-7.15.1 /usr/local/elasticsearch

# 创建elasticsearch用户(ES不能用root运行)
useradd elasticsearch
chown -R elasticsearch:elasticsearch /usr/local/elasticsearch
2. 配置 Elasticsearch 主节点(es-master)
# 备份默认配置
mv /usr/local/elasticsearch/config/elasticsearch.yml /usr/local/elasticsearch/config/elasticsearch.yml.bak

# 创建主节点配置
cat > /usr/local/elasticsearch/config/elasticsearch.yml << EOF
# 集群名称,所有节点必须相同
cluster.name: web-cluster-logs

# 节点名称,每个节点必须不同
node.name: es-master

# 节点角色:master(主节点)
node.master: true
node.data: false
node.ingest: false

# 数据存储路径
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs

# 绑定的IP地址,0.0.0.0表示允许所有IP访问
network.host: 0.0.0.0

# HTTP端口
http.port: 9200

# 集群发现配置
discovery.seed_hosts: ["192.168.176.140", "192.168.176.141"] #注意ip
cluster.initial_master_nodes: ["es-master"]

# 关闭安全认证(测试环境)
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
EOF
3. 配置 Elasticsearch 数据节点(es-data)
# 备份默认配置
mv /usr/local/elasticsearch/config/elasticsearch.yml /usr/local/elasticsearch/config/elasticsearch.yml.bak

# 创建数据节点配置
cat > /usr/local/elasticsearch/config/elasticsearch.yml << EOF
cluster.name: web-cluster-logs
node.name: es-data

# 节点角色:data(数据节点)
node.master: false
node.data: true
node.ingest: true

path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs

network.host: 0.0.0.0
http.port: 9200

discovery.seed_hosts: ["192.168.176.140", "192.168.176.141"] #注意ip
cluster.initial_master_nodes: ["es-master"]

xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
EOF

完整的单节点兼容配置

# 备份默认配置
mv /usr/local/elasticsearch/config/elasticsearch.yml /usr/local/elasticsearch/config/elasticsearch.yml.bak

# 创建主节点配置
cat > /usr/local/elasticsearch/config/elasticsearch.yml << EOF
# 集群名称,所有节点必须相同
cluster.name: web-cluster-logs

# 节点名称,每个节点必须不同
node.name: es-master

# 节点角色:master(主节点)
node.master: true
node.data: true
node.ingest: true

# 数据存储路径
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs

# 绑定的IP地址,0.0.0.0表示允许所有IP访问
network.host: 0.0.0.0

# HTTP端口
http.port: 9200

# 集群发现配置
discovery.seed_hosts: ["192.168.176.140", "192.168.176.141"] #注意ip
cluster.initial_master_nodes: ["es-master"]

# 关闭安全认证(测试环境)
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
EOF
4. 启动 Elasticsearch(两个节点都执行)
# 切换到elasticsearch用户
su - elasticsearch

# 后台启动Elasticsearch
/usr/local/elasticsearch/bin/elasticsearch -d

# 等待30秒,验证启动
curl http://localhost:9200

预期输出

{
  "name" : "es-master",
  "cluster_name" : "web-cluster-logs",
  "cluster_uuid" : "xxxxxx",
  "version" : {
    "number" : "7.17.10",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "xxxxxx",
    "build_date" : "2023-05-23T22:03:24.915351436Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

5. 验证集群状态
curl -X GET "localhost:9200/_cluster/health?pretty"

预期输出status字段为green表示集群健康。

第二部分:部署 Kibana(logstash-kibana 节点)

1. 下载并安装 Kibana 7.15.1
wget https://mirrors.huaweicloud.com/kibana/7.15.1/kibana-7.15.1-linux-x86_64.tar.gz
tar -zxvf kibana-7.15.1-linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/kibana-7.15.1-linux-x86_64 /usr/local/kibana
2. 配置 Kibana
# 备份默认配置
mv /usr/local/kibana/config/kibana.yml /usr/local/kibana/config/kibana.yml.bak

# 创建新配置
cat > /usr/local/kibana/config/kibana.yml << EOF
# Kibana端口
server.port: 5601

# 允许所有IP访问
server.host: "0.0.0.0"

# Elasticsearch地址(注意ip)
elasticsearch.hosts: ["http://192.168.176.140:9200", "http://192.168.176.141:9200"]

# 中文界面
i18n.locale: "zh-CN"
EOF
3. 启动 Kibana
# 创建kibana用户
useradd kibana
chown -R kibana:kibana /usr/local/kibana

# 切换到kibana用户,后台启动
su - kibana
nohup /usr/local/kibana/bin/kibana &

# 等待1-2分钟,验证启动
curl http://localhost:5601

第三部分:部署 Logstash(logstash-kibana 节点)【注意用户】

1. 下载并安装 Logstash 7.15.1
wget https://mirrors.huaweicloud.com/logstash/7.15.1/logstash-7.15.1-linux-x86_64.tar.gz
tar -zxvf logstash-7.15.1-linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/logstash-7.15.1 /usr/local/logstash
2. 创建 Logstash 配置文件
# 创建日志收集配置文件
cat > /usr/local/logstash/config/web-logs.conf << EOF
# 输入:接收Filebeat发送的日志
input {
  beats {
    port => 5044
  }
}

# 过滤:解析和处理日志
filter {
  # 处理Nginx访问日志
  if [fields][log_type] == "nginx-access" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
  }

  # 处理Tomcat访问日志
  if [fields][log_type] == "tomcat-access" {
    grok {
      match => { "message" => "%{COMMONAPACHELOG}" }
    }
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
  }

  # 处理HAProxy日志
  if [fields][log_type] == "haproxy" {
    grok {
      match => { "message" => "%{HAPROXYHTTP}" }
    }
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss.SSS" ]
    }
  }
}

# 输出:将日志发送到Elasticsearch(注意ip)
output {
  elasticsearch {
    hosts => ["http://192.168.176.140:9200", "http://192.168.176.141:9200"]
    index => "%{[fields][log_type]}-%{+YYYY.MM.dd}"
  }
}
EOF
3. 启动 Logstash
# 后台启动Logstash
nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/web-logs.conf &

# 验证启动
netstat -tlnp | grep 5044

第四部分:部署 Filebeat(所有之前的 6 台节点都执行)

1. 下载并安装 Filebeat 7.15.1
wget https://mirrors.huaweicloud.com/filebeat/7.15.1/filebeat-7.15.1-linux-x86_64.tar.gz
tar -zxvf filebeat-7.15.1-linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/filebeat-7.15.1-linux-x86_64 /usr/local/filebeat

【注意一下配置文件的ip都换成你自己的真实ip】

2. 配置 Filebeat(以 haproxy1 节点为例)
# 备份默认配置
mv /usr/local/filebeat/filebeat.yml /usr/local/filebeat/filebeat.yml.bak

# 创建HAProxy节点的Filebeat配置
cat > /usr/local/filebeat/filebeat.yml << EOF
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/haproxy.log
  fields:
    log_type: haproxy
    host_ip: 192.168.176.133

output.logstash:
  hosts: ["192.168.176.142:5044"]
EOF
3. 配置 Nginx 节点的 Filebeat(nginx1 和 nginx2)
cat > /usr/local/filebeat/filebeat.yml << EOF
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  fields:
    log_type: nginx-access
    host_ip: 192.168.176.135  # nginx1用这个,nginx2改成192.168.176.136

output.logstash:
  hosts: ["192.168.176.142:5044"]
EOF
4. 配置 Tomcat 节点的 Filebeat(tomcat1 和 tomcat2)
cat > /usr/local/filebeat/filebeat.yml << EOF
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/tomcat/logs/localhost_access_log.*.txt
  fields:
    log_type: tomcat-access
    host_ip: 192.168.176.137  # tomcat1用这个,tomcat2改成192.168.176.138

output.logstash:
  hosts: ["192.168.176.142:5044"]
EOF
5. 启动 Filebeat(所有节点都执行)
# 后台启动Filebeat
nohup /usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml &

五、测试验证

1. 验证日志是否正常收集

  1. 访问 Web 集群:http://192.168.176.100/test/index.jsp,多刷新几次
  2. 打开 Kibana:http://192.168.176.142:5601
  3. 进入 "Stack Management" -> "索引管理",应该能看到haproxy-YYYY.MM.ddnginx-access-YYYY.MM.ddtomcat-access-YYYY.MM.dd这三个索引
  4. 进入 "Discover",选择对应的索引模式,应该能看到刚刚产生的访问日志

2. 创建可视化仪表盘

  1. 进入 "Dashboard" -> "创建仪表盘"
  2. 添加以下可视化图表:
    • 访问量趋势图(折线图)
    • 状态码分布饼图
    • 访问量 TOP10 的 IP 地址
    • 访问量 TOP10 的 URL
  3. 保存仪表盘,命名为 "Web 集群访问监控"

3. 测试日志搜索

在 Kibana 的 Discover 页面,搜索以下内容:

  • status:404:查看所有 404 错误
  • host_ip:192.168.176.133:查看 haproxy1 节点的所有日志
  • request:/test/index.jsp:查看所有访问测试页面的日志
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐