一、Elasticsearch 集群(海量存储、索引、文档)
1. 核心概念定义
- 文档(Document):ES 中最小的数据单元,类似数据库的 "行",以 JSON 格式存储,包含多个字段(如日志中的时间、IP、消息内容)。
- 索引(Index) :文档的集合,类似数据库的 "表",用于归类相同结构的文档(如
apache_access-2025.12.12索引存储某一天的 Apache 访问日志)。 - 集群(Cluster):由多个 ES 节点(Node)组成的分布式集群,统一管理索引和数据,实现海量存储与高可用。
2. 核心能力与实现
(1)海量存储
- 通过分片(Shard) 实现水平扩展:将单个索引拆分多个分片(默认 5 个),分散存储在不同节点,支持 PB 级数据存储。
- 通过副本(Replica) 保障高可用:每个分片对应多个副本(默认 1 个),节点故障时自动切换副本,避免数据丢失。
(2)高效索引
- 采用倒排索引技术:将文档字段拆分为关键词,建立 "关键词→文档" 的映射,查询速度远超传统逐行扫描,支持毫秒级检索。
- 支持动态索引:无需预定义字段结构,文档写入时自动识别字段类型,适配非结构化 / 半结构化数据(如日志、JSON)。
(3)集群关键特性
- 自动发现与协同:通过单播机制(
discovery.zen.ping.unicast.hosts)实现节点自动加入集群,无需手动配置。 - 健康状态监控:通过
_cluster/health接口查看状态(绿色 = 正常、黄色 = 副本缺失、红色 = 主分片缺失)。 - 分布式协同:节点间平等(非主从关系),共同承担数据存储与查询压力,负载均衡。
3. 实操核心配置(文档示例)
yaml
yaml
# elasticsearch.yml 核心配置
cluster.name: my-elk-cluster # 集群名称(所有节点需一致)
node.name: node1 # 节点名称(每个节点唯一)
path.data: /data/elk_data # 数据存储路径
path.logs: /var/log/elasticsearch/ # 日志路径
network.host: 0.0.0.0 # 监听所有IP
http.port: 9200 # 对外服务端口
discovery.zen.ping.unicast.hosts: ["node1", "node2"] # 集群节点列表
http.cors.enabled: true # 开启跨域(支持Head插件访问)
http.cors.allow-origin: "*" # 允许所有跨域请求
二、Logstash:数据采集与预处理管道
1. 核心定位与工作流程
Logstash 是服务器端数据处理引擎,核心作用是 "采集→过滤→输出",相当于 ELK 的 "数据搬运工 + 预处理车间",连接数据源与 Elasticsearch。
2. 三阶段核心功能
(1)Input(数据采集)
-
支持多源输入:文件(日志文件
*.log)、系统日志(Syslog)、消息队列(Kafka/Redis)、数据库(MySQL)、网络协议(TCP/UDP)等。 -
文档实操示例:采集 Apache 访问日志和系统日志
yaml
yamlinput { file{ path => "/etc/httpd/logs/access_log" # Apache访问日志路径 type => "access" # 标记日志类型 start_position => "beginning" # 从文件开头读取 } file{ path => "/var/log/messages" # 系统日志路径 type => "system" start_position => "beginning" } }
(2)Filter(数据转换 / 预处理)
- 核心作用:将非结构化数据(如一行文本日志)解析为结构化字段,便于 ES 索引和查询。
- 常用 Filter 插件(文档重点提及):
- Grok:通过正则解析文本(如从日志中提取 IP、时间、请求方法)。
- Mutate:修改字段(重命名、删除、转换数据类型)。
- Date:解析时间戳,统一格式为
@timestamp。 - GeoIP:根据 IP 解析国家 / 城市信息。
(3)Output(数据输出)
-
默认输出到 Elasticsearch,支持按日志类型分索引存储,也可输出到文件、消息队列、数据库等。
-
文档实操示例:输出到 ES 并按类型分索引
yaml
yamloutput { if [type] == "access" { # 访问日志索引 elasticsearch { hosts => ["192.168.108.41:9200"] # ES集群地址 index => "apache_access-%{+YYYY.MM.dd}" # 按日期命名索引 } } if [type] == "system" { # 系统日志索引 elasticsearch { hosts => ["192.168.108.41:9200"] index => "system-%{+YYYY.MM.dd}" } } }
3. 核心优势与适用场景
- 功能全面:支持复杂数据清洗与转换,适配各类非结构化数据。
- 灵活扩展:通过插件生态扩展输入 / 输出源与处理逻辑。
- 适用场景:日志集中采集、数据标准化处理、跨系统数据同步。
三、Java 开发:数据转换与定制化扩展
1. 核心应用场景
ELK 生态中 Java 开发主要聚焦 "数据转换" 与 "定制化扩展",补充 Logstash 默认 Filter 的局限性,适配复杂业务需求。
2. 关键开发方向
(1)Logstash 自定义 Filter 插件
- 适用场景:默认 Grok、Mutate 等插件无法满足特殊数据格式解析(如自定义协议日志)。
- 开发逻辑:基于 Logstash 的 Java SDK,实现
Filter接口,编写字段提取、格式转换、数据校验逻辑,编译为 JAR 包部署到 Logstash 插件目录。
(2)Elasticsearch Java 客户端数据操作
- 数据转换场景:通过 Java High Level REST Client 直接与 ES 交互,实现批量数据清洗(如字段格式转换、重复数据去重)、自定义索引策略(如动态创建索引)。
- 核心 API 示例:
- 文档写入:将 Java 对象序列化为 JSON 文档,批量写入 ES 索引。
- 数据更新:根据条件更新文档字段(如日志级别映射转换)。
- 索引管理:动态创建按业务分区的索引,优化查询性能。
(3)数据预处理工具开发
- 针对海量离线数据:开发 Java 工具实现数据格式转换(如 CSV→JSON)、数据过滤(剔除无效日志),再通过 Logstash 或 ES 客户端导入集群。
四、Kibana:数据可视化与交互平台
1. 核心定位
Kibana 是 ELK 的 "前端门面",基于 Web 界面连接 Elasticsearch,将海量数据转化为直观的图表、仪表盘,支持数据探索与实时监控。
2. 核心可视化功能(文档实操重点)
(1)Discover(数据探索)
- 功能:交互式查询 ES 中的原始数据,支持 Lucene/KQL 查询语法,可添加过滤器缩小数据范围。
- 实操:创建索引模式(如
apache_access-*),快速检索某 IP 的访问记录、某时间段的错误日志。
(2)Visualize(图表制作)
- 支持多种图表类型:柱状图(日志数量统计)、折线图(访问趋势)、饼图(日志类型占比)、热力图、坐标地图(GeoIP 可视化)等。
- 实操示例:制作 "每小时 Apache 访问量" 折线图,以
@timestamp为 X 轴,日志条数为 Y 轴聚合。
(3)Dashboard(仪表盘)
- 功能:将多个 Visualize 图表组合为统一仪表盘,实现全局监控(如 "系统健康监控大屏" 包含 CPU 使用率、日志错误率、访问量趋势)。
- 优势:支持实时刷新,可自定义布局,适配运维、开发、业务等不同角色需求。
(4)索引模式管理
- 前提:使用 Kibana 前需创建索引模式,关联 ES 中的索引(如
system-*匹配所有系统日志索引),指定时间字段(默认@timestamp)用于时间范围筛选。
3. 核心配置(文档示例)
yaml
yaml
# kibana.yml 核心配置
server.port: 5601 # 访问端口
server.host: "0.0.0.0" # 监听所有IP
elasticsearch.url: "http://192.168.108.41:9200" # 对接ES集群
kibana.index: ".kibana" # 在ES中存储自身配置的索引
核心总结
- 组件协同逻辑:Logstash 采集→过滤→输出数据到 ES 集群(文档→索引→分片存储),Java 开发负责定制化数据转换,Kibana 将 ES 中的数据可视化呈现,形成 "数据采集 - 存储 - 处理 - 可视化" 闭环。
- 核心优势:
- ES 集群:分布式架构保障海量存储与高可用,倒排索引实现高效检索。
- Logstash:适配多源数据,标准化处理非结构化数据。
- Java 开发:灵活扩展数据转换能力,满足复杂业务需求。
- Kibana:低代码可视化,降低数据洞察门槛。
- 典型应用场景:日志集中分析、应用性能监控(APM)、安全事件分析(SIEM)、业务指标统计等。