ElasticStack
一、引言
在当今数据驱动的时代,如何高效地收集、处理和分析日志及其他类型的数据,已成为企业构建可观测性和运维能力的重要课题。Elastic Stack(早期称为 ELK Stack)是一套由 Elastic 公司推出的开源技术栈,专为解决此类问题而设计。
二、ElasticStack 技术栈概述
1. 什么是 ElasticStack?
ElasticStack 是由 Elastic 公司开发的一系列开源工具组合,最初以 “ELK” 这个名称广为人知,代表了三个核心组件:
- Elasticsearch:一个分布式的 RESTful 搜索引擎,提供快速的数据检索与聚合能力。
- Logstash:用于采集、转换和传输各种来源的日志或事件数据。
- Kibana:基于 Web 的可视化平台,用于探索 Elasticsearch 中的数据并创建交互式仪表板。
随着 Elastic 生态的发展,越来越多的组件被集成进来,如 Beats、APM、X-Pack、Cloud 等,使得 ElasticStack 成为了一个涵盖日志分析、指标监控、应用性能管理、安全信息与事件管理(SIEM)等多领域的综合性数据平台。
2. EFK 架构解析
EFK 是 ElasticStack 中一种常见的架构模式,特别适用于 容器化环境(如 Kubernetes)下的日志采集与分析。
核心组件:
- Filebeat:轻量级日志采集器,负责从主机或容器中采集日志文件。
- Elasticsearch:分布式搜索引擎,用于存储、索引和查询数据。
- Kibana:可视化平台,用于浏览、搜索和展示 Elasticsearch 中的数据。
工作流程:
- Filebeat 收集本地或容器中的日志;
- 将日志发送至 Elasticsearch 进行索引与存储;
- 用户通过 Kibana 查询日志并创建可视化面板。
✅ 优点:部署简单、资源占用低,适合中小型日志采集与展示需求。
3. ELFK 架构
当需要对日志进行清洗、过滤、格式转换等预处理操作时,可以在 EFK 的基础上引入 Logstash,形成 ELFK 架构。
核心组件:
组件 | 作用 |
---|---|
Elasticsearch | 数据存储与检索 |
Logstash | 日志预处理引擎,支持输入、过滤、输出插件 |
Filebeat | 轻量级日志采集器 |
Kibana | 数据可视化界面 |
工作流程:
- Filebeat 收集原始日志并发送到 Logstash;
- Logstash 对日志进行结构化处理(如字段提取、时间戳解析、字段重命名等);
- 处理后的日志写入 Elasticsearch;
- 最终通过 Kibana 实现数据可视化与交互式分析。
✅ 优势:增强日志的结构化程度,提升后续查询与分析效率。
4. ELFK 架构升级 —— 引入 Kafka
📌 升级目标:
- 实现日志采集与处理之间的 异步解耦
- 提升系统 吞吐能力与容错性
- 支持 高并发日志写入
- 避免因 Logstash 或 Elasticsearch 故障导致的 日志丢失
✅ ELFKK 架构详解
核心组件:
组件 | 角色描述 |
---|---|
Filebeat | 负责采集日志文件,作为数据源 |
Kafka | 分布式消息队列,用于缓冲和传递日志数据 |
Logstash | 消费 Kafka 中的消息,执行日志解析与转换 |
Elasticsearch | 存储结构化后的日志数据 |
Kibana | 可视化平台,用于展示与分析日志 |
工作流程:
- Filebeat 采集主机或容器日志;
- 日志被发送至 Kafka 的指定 Topic;
- Logstash 订阅该 Topic 并消费日志;
- Logstash 对日志进行清洗、结构化处理后写入 Elasticsearch;
- Kibana 用于数据展示与可视化分析。
🔧 架构优势
特性 | 描述 |
---|---|
异步解耦 | Kafka 作为中间层,实现采集与处理的松耦合 |
削峰填谷 | 在流量高峰时缓存数据,避免下游服务崩溃 |
可扩展性强 | Kafka 和 Logstash 均支持横向扩展,适应大规模日志处理 |
容错能力强 | Kafka 支持持久化存储,即使处理节点宕机也不会丢失数据 |
数据复用灵活 | 同一份日志可以被多个消费者同时使用,满足多种业务需求 |
🚀 适用场景
- 日志量庞大的企业级系统(如电商平台、金融风控系统)
- 对日志丢失容忍度极低的业务场景
- 需要多系统共享日志流的场景(如日志分析 + 审计 + 告警)
- Kubernetes 等云原生环境中需要弹性扩容的场景
三、ElasticSearch集群部署
1.节点IP划分
IP | 主机名 |
---|---|
192.168.130.61 | es-node-01 |
192.168.130.62 | es-node-02 |
192.168.130.65 | es-node-03 |
2.配置主机hosts文件及实现免密
- 配置主机hosts
sudo sh -c 'cat <<EOF >> /etc/hostsEOF'cat >> /etc/hosts <<EOF
192.168.130.61 es-node-01
192.168.130.62 es-node-02
192.168.130.65 es-node-03
EOF
- 集群实现免密
ssh-copy-id root@192.168.130.61
ssh-copy-id root@192.168.130.62
ssh-copy-id root@192.168.130.65
两个步骤三台机器全部执行
3.下载Elasticsearch二进制软件包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.2.2-linux-x86_64.tar.gz
4.创建运行elasticsearch服务的普通用户和目录
- 所有主机执行
useradd -u 2025 elasticsearch
mkdir -p /data/elasticsearch/{data,logs,softwares}
chown -R elasticsearch:elasticsearch /data/elasticsearch/
5.解压软件包
tar xvf /root/elasticsearch-8.2.2-linux-x86_64.tar.gz -C /data/elasticsearch/softwares/
6.修改配置文件
[root@es-node-01 softwares]# egrep -v '^#|^$' elasticsearch/config/elasticsearch.yml
cluster.name: Elasticsearch
node.name: es-node-01
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200
transport.host: 0.0.0.0
transport.port: 9300
discovery.seed_hosts: ["192.168.130.61", "192.168.130.62", "192.168.130.65"]
cluster.initial_master_nodes: ["192.168.130.61", "192.168.130.62", "192.168.130.65"]
node.roles: ["master", "data", "ingest"]
xpack.security.enabled: false
7. 所有节点更改JDK环境
7.1.下载jdk
https://download.java.net/openjdk/jdk17.0.0.1/ri/openjdk-17.0.0.1+2_linux-x64_bin.tar.gz
7.2.解压jdk
tar xf openjdk-17.0.0.1+2_linux-x64_bin.tar.gz -C /usr/lib/jvm/jdk-17.0.0.1/
7.3.配置jdk文件变量
cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.0.1
export PATH=$JAVA_HOME/bin:$PATH
8. 所有节点编写systemctl管理
[root@es-node-01 softwares]# systemctl cat es
# /usr/lib/systemd/system/es.service
[Unit]
Description=Elasticsearch 8.x Daemon
Documentation=https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
After=network.target
[Service]
Type=forking
User=elasticsearch
Group=elasticsearch# 指定使用哪个 JDK(根据你实际安装路径修改)
Environment="JAVA_HOME=/usr/lib/jvm/jdk-17.0.0.1"# Elasticsearch 安装目录
WorkingDirectory=/data/elasticsearch/softwares/elasticsearch# 启动命令
ExecStart=/data/elasticsearch/softwares/elasticsearch/bin/elasticsearch -d# 停止命令(可选)
ExecStop=/bin/kill -SIGTERM # 重启策略
Restart=always# 系统资源限制
LimitNOFILE=131072
LimitNPROC=8192
LimitMEMLOCK=infinity[Install]
WantedBy=multi-user.target
9.同步只其他节点并修改
9.1将二进制包同步到其他节点
rsync -avz /data/elasticsearch root@192.168.130.62:/datarsync -avz /data/elasticsearch root@192.168.130.65:/data
9.2.修改配置
- es-node-02
sed 's/es-node-01/es-node-02/' /data/elasticsearch/softwares/elasticsearch/config/elasticsearch.yml
- es-node-03
sed 's/es-node-01/es-node-03/' /data/elasticsearch/softwares/elasticsearch/config/elasticsearch.yml
10.更换 Elasticsearch 集群中的 JDK 版本
10.1.修改elasticsearch-env文件
cd /data/elasticsearch/softwares/elasticsearch/bin/
vim elasticsearch-env
##在第二行插入
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.0.1
##将ES_JAVA_HOM修改为JAVA_HOM,JAVA_TYPE="system JAVA_HOM"
:%s/ES_JAVA_HOM/JAVA_HOM/g
11.启动集群并检查
- 所有节点执行
systemctl daemon-reload
systemctl enable --now es.service
systemctl status es.service
- 查看集群状态
[root@es-node-01 bin]# curl 192.168.130.61:9200/_cluster/health 2>/dev/null |jq
{"cluster_name": "Elasticsearch","status": "green","timed_out": false,"number_of_nodes": 3,"number_of_data_nodes": 3,"active_primary_shards": 2,"active_shards": 4,"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
}
[root@es-node-01 bin]# curl 192.168.130.61:9200/_cat/nodes
192.168.130.65 18 31 0 0.00 0.00 0.00 dim - es-node-03
192.168.130.62 57 36 1 0.11 0.11 0.08 dim - es-node-02
192.168.130.61 56 89 0 0.00 0.01 0.05 dim * es-node-01
[root@es-node-01 bin]#