ElasticStack技术栈概述及Elasticsearch8.2.2集群部署并更换JDK版本为openjdk-17

发布于:2025-08-03 ⋅ 阅读:(9) ⋅ 点赞:(0)

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 中的数据。
工作流程:
  1. Filebeat 收集本地或容器中的日志;
  2. 将日志发送至 Elasticsearch 进行索引与存储;
  3. 用户通过 Kibana 查询日志并创建可视化面板。

✅ 优点:部署简单、资源占用低,适合中小型日志采集与展示需求。


3. ELFK 架构

当需要对日志进行清洗、过滤、格式转换等预处理操作时,可以在 EFK 的基础上引入 Logstash,形成 ELFK 架构

核心组件:
组件 作用
Elasticsearch 数据存储与检索
Logstash 日志预处理引擎,支持输入、过滤、输出插件
Filebeat 轻量级日志采集器
Kibana 数据可视化界面
工作流程:
  1. Filebeat 收集原始日志并发送到 Logstash;
  2. Logstash 对日志进行结构化处理(如字段提取、时间戳解析、字段重命名等);
  3. 处理后的日志写入 Elasticsearch;
  4. 最终通过 Kibana 实现数据可视化与交互式分析。

✅ 优势:增强日志的结构化程度,提升后续查询与分析效率。


4. ELFK 架构升级 —— 引入 Kafka

📌 升级目标:
  • 实现日志采集与处理之间的 异步解耦
  • 提升系统 吞吐能力与容错性
  • 支持 高并发日志写入
  • 避免因 Logstash 或 Elasticsearch 故障导致的 日志丢失

✅ ELFKK 架构详解
核心组件:
组件 角色描述
Filebeat 负责采集日志文件,作为数据源
Kafka 分布式消息队列,用于缓冲和传递日志数据
Logstash 消费 Kafka 中的消息,执行日志解析与转换
Elasticsearch 存储结构化后的日志数据
Kibana 可视化平台,用于展示与分析日志
工作流程:
  1. Filebeat 采集主机或容器日志;
  2. 日志被发送至 Kafka 的指定 Topic;
  3. Logstash 订阅该 Topic 并消费日志;
  4. Logstash 对日志进行清洗、结构化处理后写入 Elasticsearch;
  5. 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/hosts

EOF'

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:/data
 rsync -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]#