目录
ELK日志分析系统概述
核心组件
-
Elasticsearch(ES)
- 功能:一个分布式、RESTful风格的搜索和数据分析引擎,用于存储、检索和分析日志数据。它支持全文搜索、结构化搜索、数据分析等多种功能,能够快速处理海量日志数据。
- 特点:
- 分布式架构:能够水平扩展,处理大规模数据。
- 实时搜索:支持实时数据索引和搜索,响应速度快。
- 高可用性:通过副本机制保证数据的高可用性。
-
Logstash
- 功能:一个开源的服务器端数据处理管道,负责从各种数据源(如日志文件、网络流、数据库等)收集数据,进行转换和处理,然后将数据发送到Elasticsearch进行存储和分析。
- 特点:
- 数据丰富:支持多种数据输入和输出插件,能够处理各种格式的数据。
- 灵活转换:通过过滤器插件对数据进行清洗、转换和丰富。
- 高可靠性:支持数据持久化和重试机制,确保数据不丢失。
-
Kibana
- 功能:一个开源的数据可视化和探索平台,用于对Elasticsearch中的数据进行可视化展示和分析。它提供了丰富的图表和仪表板功能,帮助用户直观地理解日志数据。
- 特点:
- 直观界面:用户友好的Web界面,方便用户进行数据查询和可视化。
- 灵活定制:支持自定义仪表板和图表,满足不同用户的分析需求。
- 实时监控:能够实时监控日志数据的变化,及时发现潜在问题。
工作原理
ELK日志分析系统的工作流程通常包括以下几个步骤:
- 数据采集:使用Logstash或Beats等工具从各种数据源收集日志数据。
- 数据处理:Logstash对收集到的数据进行清洗、转换和丰富,然后发送到Elasticsearch。
- 数据存储:Elasticsearch将处理后的数据存储在分布式索引中,支持快速搜索和分析。
- 数据可视化:Kibana从Elasticsearch中检索数据,并通过图表和仪表板进行可视化展示。
应用场景
ELK日志分析系统广泛应用于各种需要日志管理和分析的场景,包括但不限于:
- IT运维监控:实时监控服务器、网络设备和应用程序的日志,及时发现和解决潜在问题。
- 安全审计:收集和分析安全日志,检测异常行为和潜在的安全威胁。
- 业务分析:分析业务系统的日志数据,了解用户行为、系统性能和业务趋势。
- 合规性检查:确保企业的日志管理符合相关法规和标准的要求。
优势
- 开源免费:ELK组件均为开源软件,用户可以免费使用并根据需要进行定制和扩展。
- 高度可扩展:支持水平扩展,能够处理大规模日志数据。
- 功能丰富:提供了强大的日志收集、处理、存储和可视化功能,满足各种日志分析需求。
- 社区支持:拥有庞大的用户社区和丰富的文档资源,方便用户获取帮助和支持。
三大核心解析
Elastucsearch
核心特性
- 分布式架构:Elasticsearch天然支持分布式,数据可分散存储在多个节点上,每个节点都能处理部分数据和请求。通过自动分片与副本机制,数据被分割成多个分片,并为每个分片创建多个副本,确保数据的高可用性和系统的稳定性。分片机制还有助于提高查询性能,多个分片可并行处理查询请求。
- 高性能搜索:采用倒排索引结构,能快速定位包含特定关键词的文档,无需遍历整个文档集合,即使面对海量数据也能在短时间内返回查询结果。同时,Elasticsearch支持复杂的查询操作,如精确匹配、模糊匹配、范围查询等,能迅速返回结果。
- 实时数据处理:支持近实时搜索(NRT),数据写入后几乎可以立即进行搜索,这对于需要及时获取最新数据的应用场景非常重要。
- 强大的聚合能力:聚合是Elasticsearch的一项核心功能,允许用户对搜索结果进行统计分析。例如,可以按时间、地理位置、分类等维度进行数据聚合,帮助用户获取有价值的洞察。
- 易于扩展:提供了RESTful API,支持与其他系统进行集成,易于横向扩展。它能够处理不同的数据格式(如JSON、XML等)并支持多种编程语言(如Java、Python、.NET、Go、Node.js等)。
- 高可用性与容错:自动管理数据的副本,确保数据不会丢失。即使某些节点发生故障,也能继续提供服务。分片和副本的配置允许Elasticsearch在集群内进行负载均衡。
应用场景
- 全文搜索:Elasticsearch凭借其强大、可扩展和快速的搜索功能,在全文搜索场景中表现出色。它允许用户以近乎实时的响应执行复杂的查询,常用于大型网站和应用程序的搜索功能。
- 实时分析:能够实时执行分析,适用于跟踪实时数据(如用户活动、交易或传感器输出)的仪表板。可以对结构化和非结构化数据进行索引和分析,支持聚合操作和复杂的数据可视化。
- 日志和事件数据分析:Elasticsearch常用于聚合、监控和分析来自各种来源的日志和事件数据。它是ELK堆栈(Elasticsearch、Logstash、Kibana)的关键组件,用于管理系统和应用程序日志,以识别问题和监控系统运行状况。
- 安全信息和事件管理(SIEM):可用作SIEM工具,帮助企业实时分析安全事件,提高网络安全防护能力。
- 电子商务:可用于构建电子商务网站的产品搜索功能。它可以根据用户的查询实时地返回相关的产品结果,并支持过滤、排序和推荐等功能。基于用户的行为和兴趣,Elasticsearch可以构建推荐系统,推荐相关的内容和产品,提升用户体验和转化率。
- 地理空间数据分析:通过地理空间索引和搜索功能支持地理数据,这对于需要管理和可视化地理信息的应用程序(如地图和基于位置的服务)非常有用。它使得执行邻近搜索和基于位置的数据可视化成为可能。
- 业务数据分析:Elasticsearch还可用于企业数据分析、市场调研等业务分析场景。它可以对海量数据进行搜索、聚合和分析,支持多种数据格式和数据源,帮助用户了解业务情况、市场趋势等。
Logstash
Logstash的核心概念主要围绕其数据处理流程展开,包括输入(Input)、过滤器(Filter)、输出(Output)三大核心组件,以及管道(Pipeline)和插件(Plugin)等重要概念。
输入(Input)
定义:负责从各种数据源收集数据,是Logstash处理流程的起点。
特点:
- 支持多种数据源:如日志文件、网络流、数据库、消息队列(Kafka、RabbitMQ)、系统指标(CPU、内存)等。
- 插件化设计:通过输入插件(如
file
、syslog
、jdbc
、beats
等)实现灵活扩展。
示例:
input { | |
file { | |
path => "/var/log/nginx/*.log" # 监控Nginx日志文件 | |
start_position => "beginning" # 从文件开头读取 | |
} | |
} |
过滤器(Filter)
定义:对输入数据进行清洗、转换和丰富,是Logstash的核心处理环节。
特点:
- 数据转换:支持解析、字段提取、格式转换、条件过滤等操作。
- 常用插件:
grok
:解析非结构化日志(如Apache日志)为结构化字段。mutate
:重命名、删除、替换字段。date
:解析时间戳并统一格式。json
:解析JSON格式数据。geoip
:根据IP地址添加地理位置信息。
示例:
filter { | |
grok { | |
match => { "message" => "%{COMBINEDAPACHELOG}" } # 解析Apache日志 | |
} | |
date { | |
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"] # 解析时间字段 | |
target => "@timestamp" # 覆盖默认时间戳 | |
} | |
mutate { | |
remove_field => ["message"] # 删除原始日志字段 | |
} | |
} |
输出(Output)
定义:将处理后的数据发送到目标存储或服务,是Logstash处理流程的终点。
特点:
- 支持多种目标:如Elasticsearch、数据库、文件、消息队列、监控系统等。
- 插件化设计:通过输出插件(如
elasticsearch
、file
、kafka
、statsd
等)实现灵活扩展。
示例:
output { | |
elasticsearch { | |
hosts => ["http://localhost:9200"] # 输出到Elasticsearch | |
index => "nginx-logs-%{+YYYY.MM.dd}" # 按日期创建索引 | |
} | |
stdout { codec => rubydebug } # 同时输出到控制台(调试用) | |
} |
管道(Pipeline)
定义:Logstash的数据处理流程由一个或多个管道组成,每个管道包含输入、过滤器和输出三个阶段。
特点:
- 独立运行:每个管道独立处理数据,互不干扰。
- 配置文件:通常通过
.conf
文件定义管道配置,如logstash.conf
。
示例:
# 完整管道配置示例 | |
input { ... } | |
filter { ... } | |
output { ... } |
插件(Plugin)
定义:Logstash通过插件扩展功能,包括输入、过滤器和输出插件。
特点:
- 丰富生态:官方和社区提供了大量插件,覆盖常见数据源和目标。
- 自定义开发:支持用户基于Ruby开发自定义插件。
常用插件类型: - 输入插件:
file
、syslog
、jdbc
、kafka
、beats
等。 - 过滤器插件:
grok
、mutate
、date
、json
、geoip
等。 - 输出插件:
elasticsearch
、file
、kafka
、statsd
、http
等。
事件(Event)
定义:Logstash处理的基本单位是事件(Event),代表一条数据记录。
特点:
- 结构化数据:事件包含字段(Field)和值(Value),如
{ "message": "error", "status": 500 }
。 - 生命周期:事件在管道中依次经过输入、过滤器和输出阶段,可能被修改或丢弃。
Kibana核心概念
核心定位与功能
Kibana是ELK技术栈(Elasticsearch、Logstash、Kibana)的核心组件,专为Elasticsearch设计,提供交互式仪表盘、实时搜索、数据探索及可视化功能。它支持安全分析、运维监控、业务智能等多场景需求,通过直观界面降低数据分析门槛。
关键技术组件
- 查询语言
- KQL(Kibana Query Language):简化查询语法,支持字段匹配、逻辑组合(如
status:200 AND user.name:"John Doe"
),隐藏底层复杂性,适合初学者。 - Lucene语法:支持复杂查询(如通配符、正则表达式),满足高级分析需求。
- KQL(Kibana Query Language):简化查询语法,支持字段匹配、逻辑组合(如
- 可视化工具
- 基础图表:柱状图、折线图、饼图、表格等,支持快速数据展示。
- 高级图表:热力图、桑基图、标记地图(集成GeoIP),满足复杂场景需求。
- 时序分析:Timelion功能支持时间序列表达式语言,可分析时序数据。
- 交互与定制
- 动态交互:支持图表联动过滤,用户可通过拖拽布局调整仪表盘。
- 自定义指标:通过脚本字段扩展数据维度,增强分析灵活性。
架构与集成
- 前后端架构
- 前端:基于React框架,提供直观的用户界面。
- 后端:基于Node.js,通过REST API与Elasticsearch交互。
- 深度集成
- 数据交互:Kibana与Elasticsearch无缝集成,支持实时数据查询与分析。
- 插件扩展:支持前后端插件(如UI组件、数据处理逻辑),可通过插件增强功能。
核心功能模块
- Discover:原始数据探索工具,支持字段过滤、高亮显示。
- Visualize:图表创作模块,支持多种图表类型与自定义样式。
- Dashboard:仪表盘整合工具,可将多个图表组合为动态监控面板。
- Canvas:自由画布式数据展示,适合生成动态报告。
- Machine Learning:集成Elasticsearch机器学习,提供异常检测与预测面板。
- Maps:地理空间数据可视化,支持热力图层与轨迹绘制。
- Lens:快速拖拽式可视化生成器,降低使用门槛。
部署ELK日志分析
环境准备
在开始部署前,需要确保所有服务器满足以下要求:
所有服务器已安装CentOS 8系统
关闭防火墙或开放必要端口:
sudo dnf install elasticsearch -y
安装Java 11(Elasticsearch 7.x+需要)
配置主机名解析(/etc/hosts)
# 安装Java 11
sudo dnf install java-11 -y
# 配置主机名解析
cat << EOF | sudo tee -a /etc/hosts
192.168.10.101 web-server
192.168.10.102 logstash-server
192.168.10.103 es-node1
192.168.10.104 es-node2
Elasticsearch集群部署(192.168.10.103/104)
添加Elastic官方仓库
# 创建仓库文件
cat << EOF | sudo tee /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
安装Elasticsearch
sudo dnf install elasticsearch -y
配置Elasticsearch集群
仓库配置:添加Elastic官方YUM源
安装命令:sudo dnf install elasticsearch -y
配置文件(/etc/elasticsearch/elasticsearch.yml):
cluster.name: elk-cluster
node.name: es-node1/es-node2
network.host: 192.168.10.103/104
discovery.seed_hosts: ["103", "104"]
cluster.initial_master_nodes: ["es-node1"]
系统优化:调整内核参数(vm.max_map_count=262144)、用户限制
启动服务:sudo systemctl start elasticsearch
系统优化
# 调整系统参数
cat << EOF | sudo tee /etc/sysctl.d/elasticsearch.conf
vm.max_map_count=262144
fs.file-max=65536
EOF
sudo sysctl -p /etc/sysctl.d/elasticsearch.conf
# 调整用户限制
cat << EOF | sudo tee /etc/security/limits.d/elasticsearch.conf
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
EOF
# 设置JVM堆内存大小(根据实际内存调整,建议不超过物理内存的50%)
sudo sed -i 's/-Xms1g/-Xms1g/g' /etc/elasticsearch/jvm.options
sudo sed -i 's/-Xmx1g/-Xmx1g/g' /etc/elasticsearch/jvm.options
启动Elasticsearch并设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
验证集群状态
curl -X GET "localhost:9200/_cluster/health?pretty"
Logstash部署(192.168.10.102)
sudo dnf install logstash -y
配置Logstash
安装命令:sudo dnf install logstash -y
配置文件(/etc/logstash/conf.d/apache_logs.conf):
input { beats { port => 5044 } }
filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } }
output { elasticsearch { hosts => ["103:9200", "104:9200"] } }
启动Logstash并设置开机自启
sudo systemctl enable logstash
sudo systemctl start logstash
Kibana部署(在Elasticsearch节点1上:192.168.10.103)
安装Kibana
sudo dnf install kibana -y
配置Kibana
安装命令:sudo dnf install kibana -y
配置文件(/etc/kibana/kibana.yml):
server.host: "192.168.10.103"
elasticsearch.hosts: ["http://103:9200", "http://104:9200"]
启动Kibana并设置开机自启
sudo systemctl enable kibana
sudo systemctl start kibana
Filebeat部署(Apache服务器:192.168.10.101)
安装Filebeat
sudo dnf install filebeat -y
配置Filebeat
安装命令:sudo dnf install filebeat -y
配置文件(/etc/filebeat/filebeat.yml):
filebeat.inputs:
- type: log
paths: /var/log/httpd/access_log
fields: { type: "apache_access" }
output.logstash: { hosts: ["102:5044"] }
加载Kibana仪表盘
sudo filebeat setup --dashboards
启动Filebeat并设置开机自启
sudo systemctl enable filebeat
sudo systemctl start filebeat
测试与验证
层级 | 核心组件 | 功能描述 |
数据采集层 | Logstash | 收集日志数据,初步清洗格式化 |
数据处理层 | Logstash Filter | 过滤、转换、丰富日志数据(如脱敏、提取字段) |
数据存储层 | Elasticsearch | 分布式存储与检索日志数据 |
数据可视化层 | Kibana | 交互式可视化展示分析结果 |
管理层 | Elasticsearch | 集群管理、节点监控、分片策略配置 |
- ES集群状态:curl http://103:9200/_cluster/health?pretty
- Logstash日志:tail -f /var/log/logstash/logstash-plain.log
- Kibana界面:访问 http://103:5601,创建索引模式 filebeat-*
验证Elasticsearch集群状态
curl -X GET "192.168.10.103:9200/_cluster/health?pretty"
输出示例:
{
"cluster_name" : "elk-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
验证Logstash接收数据
sudo tail -f /var/log/logstash/logstash-plain.log
验证Kibana界面
在浏览器中访问:http://192.168.10.103:5601
创建索引模式
- 登录Kibana后,导航到"Management" > "Index Patterns"
- 点击"Create index pattern"
- 输入filebeat-*作为索引模式名称
- 选择@timestamp作为时间过滤字段
- 点击"Create index pattern"
查看日志数据
- 导航到"Discover"
- 选择刚创建的索引模式
- 调整时间范围,查看Apache访问日志