ELK 分布式日志分析系统(对接高可用 Web 集群)
·
一、项目概述
本项目将在昨天已经部署好的高可用 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. 验证日志是否正常收集
- 访问 Web 集群:
http://192.168.176.100/test/index.jsp,多刷新几次 - 打开 Kibana:
http://192.168.176.142:5601 - 进入 "Stack Management" -> "索引管理",应该能看到
haproxy-YYYY.MM.dd、nginx-access-YYYY.MM.dd、tomcat-access-YYYY.MM.dd这三个索引 - 进入 "Discover",选择对应的索引模式,应该能看到刚刚产生的访问日志
2. 创建可视化仪表盘
- 进入 "Dashboard" -> "创建仪表盘"
- 添加以下可视化图表:
- 访问量趋势图(折线图)
- 状态码分布饼图
- 访问量 TOP10 的 IP 地址
- 访问量 TOP10 的 URL
- 保存仪表盘,命名为 "Web 集群访问监控"
3. 测试日志搜索
在 Kibana 的 Discover 页面,搜索以下内容:
status:404:查看所有 404 错误host_ip:192.168.176.133:查看 haproxy1 节点的所有日志request:/test/index.jsp:查看所有访问测试页面的日志
更多推荐



所有评论(0)