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]#