目錄
#1.1ELK平臺介紹
? 1.1.1ELK概述
? 1.1.2Elasticsearch
? 1.1.3Logstash
? 1.1.4Kibana
#2.1部署ES群集
? ?2.1.1基本配置
? ?2.1.2安裝Elasticsearch
? ?2.1.3安裝Logstash
? ?2.1.4Filebeat
? ?2.1.5安裝Kibana
1.1ELK平臺介紹
1.1.1ELK概述
? ?ELK 是三個開源工具的縮寫,分別是Elasticsearch、Logstash和Kibana,三者組合形成了一套完整的日志收集、存儲、分析與可視化解決方案,廣泛應用于日志管理、數據分析、監控告警等場景。
1.1.2Elasticsearch
?(1)Elasticsearch概述
? ? ? ? ?Elasticsearch(簡稱 ES)是一款基于 Lucene 構建的分布式、高擴展、實時的全文搜索引擎和數據分析引擎,主要用于海量數據的存儲、檢索、聚合與分析,廣泛應用于日志分析、全文檢索、實時監控等場景。
(2)Elasticsearch核心概念
1.?索引(Index)
-
定義:類似關系型數據庫中的 “數據庫” 或 “表”,是一組具有相似結構的文檔集合(例如 “用戶日志索引”“商品信息索引”)。
-
特點:
-
索引名稱需小寫,且不能包含特殊字符;
-
每個索引對應多個分片(分布式存儲的基礎);
-
可通過 “索引模板” 預先定義字段映射規則(如字段類型、分詞器等)。
-
2.?文檔(Document)
-
定義:索引中的單條數據,是 ES 的最小數據單元,以JSON 格式表示(類似數據庫中的 “行”)。
-
特點:
-
每個文檔有唯一的
_id
(可手動指定或自動生成),用于標識文檔; -
文檔字段支持動態映射(無需預先定義結構,ES 會自動推斷字段類型,如字符串、數字等)。
-
3.?類型(Type)
-
定義:早期版本中用于區分索引內不同結構的文檔(類似數據庫中 “表” 里的 “子表”),但在 ES 7.x 后被移除。
-
原因:類型的存在會導致同一索引內不同類型文檔的字段映射沖突,不符合分布式存儲的設計邏輯,目前推薦一個索引只存儲一種類型的文檔。
4.?映射(Mapping)
-
定義:類似數據庫中的 “表結構”,用于定義文檔中字段的類型(如
text
、keyword
、date
)、分詞器、是否索引等元數據。 -
分類:
-
動態映射:ES 自動推斷字段類型(如輸入數字則映射為
long
); -
靜態映射:手動定義字段規則(更精準,避免自動映射出錯,如將 “手機號” 指定為
keyword
類型以支持精確匹配)。
-
5.?分片(Shard)
-
定義:索引的細分存儲單元,一個索引會被拆分為多個分片(默認 5 個),分布式存儲在不同節點上。
-
作用:
-
實現水平擴展:通過增加分片(或節點)提升存儲容量和查詢并發能力;
-
并行處理:查詢時多個分片同時工作,提高檢索效率。
-
-
類型:
-
主分片(Primary Shard):數據的原始存儲位置,不可修改數量(創建索引后固定);
-
副本分片(Replica Shard):主分片的備份,用于故障恢復和分擔查詢壓力,數量可動態調整。
-
6.?節點(Node)
-
定義:運行 ES 實例的服務器,一個集群由多個節點組成,節點通過集群名稱(默認
elasticsearch
)加入集群。 -
角色分類:
-
主節點(Master Node):管理集群元數據(如索引創建、分片分配),不處理數據請求,建議單獨部署以保證穩定性;
-
數據節點(Data Node):存儲數據(分片),負責數據的 CRUD(增刪改查)和聚合分析,消耗 CPU、內存和磁盤資源;
-
協調節點(Coordinating Node):接收客戶端請求,分發任務到其他節點,匯總結果后返回(所有節點默認具備此功能);
-
ingest 節點:預處理數據(如日志清洗),類似 Logstash 的輕量版功能。
-
7.?集群(Cluster)
-
定義:由多個節點組成的集合,共同管理全量數據,提供分布式服務。
-
特點:
-
集群有唯一名稱(默認
elasticsearch
),節點通過名稱加入集群; -
集群會自動選舉主節點,保證高可用;
-
數據通過分片分布式存儲,副本機制確保數據不丟失(如主分片故障,副本分片會升級為主分片)。
-
1.1.3Logstash
(1)Logstash介紹
? ? ??Logstash 是 Elastic Stack(ELK Stack)中的數據收集與處理引擎,主要用于對分散的、多源的日志或數據進行采集、轉換、過濾,再輸出到目標存儲(如 Elasticsearch、數據庫、文件等),是數據鏈路中的 “管道” 角色。
(2)Logstash工作的三個階段
1.?輸入階段(Input)
-
作用:從外部數據源收集數據,是 Logstash 的數據入口。
-
支持的數據源:通過輸入插件(Input Plugins)實現,覆蓋多種場景:
-
文件(如
file
插件讀取服務器日志文件); -
網絡流(如
tcp
/udp
插件接收實時數據、kafka
插件消費消息隊列); -
數據庫(如
jdbc
插件定時同步數據庫數據); -
云服務、API 接口等。
-
-
特點:可同時配置多個輸入源,實現多渠道數據的集中采集。
2.?過濾階段(Filter)
-
作用:對輸入的數據進行清洗、轉換、 enrichment(補充信息),是數據處理的核心環節。
-
常見操作:通過過濾插件(Filter Plugins)實現:
-
解析格式(如
json
插件解析 JSON 字符串為結構化字段); -
字段處理(如
mutate
插件添加 / 刪除 / 重命名字段、修改字段類型); -
過濾篩選(如
grok
插件從非結構化日志中提取關鍵信息,drop
插件丟棄無效數據); -
補充信息(如
geoip
插件通過 IP 地址獲取地理位置信息)。
-
-
特點:可選階段(若無需處理,數據可直接從輸入流向輸出),但通常是提升數據質量的關鍵。
3.?輸出階段(Output)
-
作用:將處理后的結構化數據發送到目標存儲或系統,是 Logstash 的數據出口。
-
支持的目標:通過輸出插件(Output Plugins)實現:
-
Elasticsearch(最常用,用于后續檢索分析);
-
存儲系統(如
file
插件寫入文件、s3
插件上傳至云存儲); -
消息隊列(如
kafka
插件轉發數據); -
數據庫(如
jdbc
插件寫入 MySQL)等。
-
-
特點:可配置多個輸出目標,實現 “一次處理,多端分發”。
總結
三個階段通過 “輸入→過濾→輸出” 的流水線模式,實現了從原始數據到高質量結構化數據的轉化。例如:
? ?1.輸入階段:file
插件讀取服務器的 Nginx 日志文件;
? ?2.過濾階段:grok
插件提取日志中的 IP、URL、響應時間等字段,? ? ????geoip
插件補充 IP 對應的地區;
? ?3.輸出階段:將處理后的結構化日志發送到 Elasticsearch,供后續? ? ? ? ? 可視化分析。
? ? 這種架構讓 Logstash 能夠靈活適配各種數據場景,成為數據鏈路中 “預處理中樞” 的核心工具。
1.1.4Kibana
(1)Kibana介紹
? ? ?Kibana 是 Elastic Stack(ELK Stack)中用于數據可視化與交互分析的開源平臺,與 Elasticsearch 無縫集成,主要功能是將存儲在 Elasticsearch 中的數據通過直觀的圖表、儀表盤等形式展示,幫助用戶快速挖掘數據價值、監控業務狀態或排查問題。
(2)Kibana主要功能
? ? 1.數據檢索與探索:通過 Elasticsearch 查詢語法快速檢索數據,實時瀏覽、篩選、導出數據,支持全文檢索、字段過濾等操作,方便臨時分析或故障排查。
? ? 2.可視化與儀表盤:提供豐富圖表(柱狀圖、折線圖、地圖等),可將數據轉化為直觀可視化效果;支持組合多圖表為自定義儀表盤,集中展示核心指標(如系統性能、業務數據)。
? ? 3.監控與告警:對關鍵指標(如錯誤率、響應時間)設置告警規則,觸發閾值時通過郵件、Slack 等渠道通知,實現實時業務或系統監控。
? ?4.數據管理:管理 Elasticsearch 索引模式、字段映射等元數據,支持導入導出可視化成果,便于團隊協作。
? ? 5.進階分析:集成機器學習功能檢測異常數據,聯動 APM 工具分析應用性能,深度挖掘數據價值。
2.1部署ES群集
主機名 | ip 地址 | 操作系統 | 軟件包 |
---|---|---|---|
elk1 | 192.168.10.101 | Openeuler24 | Elasticsearch、logstash、kibana |
elk2 | 192.168.10.102 | Openeuler24 | Elasticsearch、filebeat、httpd |
elk3 | 192.168.10.103 | Openeuler24 | Elasticsearch |
?2.1.1基本配置
? 在兩臺ES主機上設置hosts文件
192.168.10.101? ? ? ? elk1?
192.168.10.102? ? ? ? elk2
192.168.10.103 ???????elk3
?關閉所有節點的防火墻
systemctl stop firewalld
setenforce 0?
?創建es運行用戶
[root@elk1 ~]#useradd es
?安裝java環境
[root@elkl ~]# dnf -y install java-11 [root@elkl ~]# java -version openjdk version "11.0.9.1" 2020-11-04 LTS OpenJDK Runtime Environment 18.9 (build 11.0.9.1+1-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.9.1+1-LTS, mixed mode, sharing)
?為用戶設置資源訪問限制
[root@elkl ~]# vim /etc/security/limits.conf es soft nofile 65535 es hard nofile 65535 es soft nproc 65535 es hard nproc 65535 es soft memlock unlimited es hard memlock unlimited
[root@elkl ~]#vim /etc/sysctl.conf 添加下面配置: vm.max_map_count=655360 [root@elkl ~]#sysctl -p
2.1.2 安裝Elasticsearch
[root@elkl ~]#tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz [root@elkl ~]# mv elasticsearch-7.10.0 /usr/local/elasticsearch [root@elkl ~]# vim /etc/elasticsearch/config/jvm.options -Xms2g -Xmx2g
?更改Elasticsearch主配置文件
[root@elkl ~]# vim /usr/local/elasticsearch/config/elasticsearch.yml cluster.name: kgc-elk-cluster ##17 行,群集名稱 node.name: elk1 ##23 行,本節點主機名,以 elk1 節點為例,其它節點請改成相對應的節點名稱 path.data: /elk/data ##33 行,數據文件路徑 path.logs: /elk/logs ##37 行,日志文件路徑 bootstrap.memory_lock: false ##43 行,鎖定物理內存 network.host: 0.0.0.0 ##55 行,監聽地址 http.port: 9200 ##59 行,監聽端口 discovery.seed_hosts: ["elk1", "elk2", "elk3"] ##68 行,群集中的主機列表 cluster.initial_master_nodes: ["elk1"] ##72,master 主機名稱,群集的初始化會將此節點選舉為 master
?創建數據存放路徑并授權
[root@elkl ~]# mkdir -p/elk/data [root@elkl ~]#mkdir -p /elk/logs [root@elkl ~]#chown -R es:es /elk/ [root@elkl ~]#chown -R es:es /usr/local/elasticsearch/
?啟動es
[root@elkl ~]#su - es #es 限制使用 root 啟動,需要切換至 es [es@elkl ~]$ nohup /usr/local/elasticsearch/bin/elasticsearch &[es@elkl ~]$ sudo netstat -anpt | grep 9200 tcp6 0 0 :::9200 :::* LISTEN
?查看節點信息
[root@localhost ~]# curl http://192.168.10.103:9200/_cat/nodes 192.168.10.101 12 65 0 0.03 0.01 0.00 cdhilmrstw * elk1 192.168.10.102 22 97 0 0.12 0.05 0.01 cdhilmrstw - elk2 192.168.10.103 20 91 0 0.01 0.02 0.00 cdhilmrstw - elk3
2.1.3 安裝logstash
在logstash服務器上安裝logstas
[root@losstash ~]# systemctl stop firewalld [root@losstash ~]# setenforce 0[root@losstash ~]# yum -y install java-11 [root@losstash ~]# tar zxvf logstash-7.10.0-linux-x86_64.tar.gz [root@losstash ~]# mv logstash-7.10.0 /usr/local/logstash [root@losstash ~]# chmod -R 777 /usr/local/logstash/data/
?測試安裝結果
[root@losstash ~]# /usr/local/logstash/bin/logstash -e 'input { stdin {} } output { stdout {codec => rubydebug} }' nihao {"@timestamp" => 2020-03-14T03:20:24.229Z,"@version" => "1","host" => "elk1","message" => "nihao " }
[root@losstash ~]# /usr/local/logstash/bin/logstash -e 'input { stdin {} } output { stdout {codec => rubydebug} } output { elasticsearch { hosts => ["192.168.10.103:9200"] } }'
[root@nodel src]# chmod o+r /var/log/messages //讓 Logstash 可以讀取日志 [root@nodel src]# ll /var/log/messages -rw----r--. 1 root root 2730043 Sep 11 14:21 /var/log/messages [root@nodel src]# touch /usr/local/logstash/system.conf [root@nodel src]# vim /usr/local/logstash/system.conf input {file{path =>"/var/log/messages"type =>"system"start_position =>"beginning"} } output {elasticsearch { 192.168.10.103hosts => ["192.168.10.101:9200"]index =>"system-%{+YYYY.MM.dd}"} }
運行logstash
[root@elk1 ~]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/system.conf
?2.1.4Filebeat
在產生日志的客戶端服務器上安裝filebeat(本案例為elk2主機)
[root@elk2 ~]# yum -y install httpd [root@elk2 ~]# systemctl start httpd [root@elk2 ~]# echo 'www.kgc.com' > /var/www/html/index.html [root@elk2 ~]# curl 192.168.10.102 www.kgc.com [root@elk2 ~]# cat /var/log/httpd/access_log 192.168.10.102 - - [28/Apr/2025:20:31:02 +0800] "GET / HTTP/1.1" 20012 "-" "curl/8.4.0" [root@elk2 ~]# cat /var/log/httpd/error_log
安裝filebeat
[root@elk2 ~]# tar zxvf filebeat-7.10.0-linux-x86_64.tar.gz [root@elk2 ~]# mv filebeat-7.10.0-linux-x86_64 /usr/local/filebeat
?配置web01服務器filebeat的輸出
[root@elk2 ~]# cd /usr/local/filebeat/ [root@elk2 filebeat]# mv filebeat.yml filebeat.yml.bak [root@elk2 filebeat]# vim filebeat.ymlfilebeat.inputs: - type: logpaths:- /var/log/httpd/access_log:set paste output.logstash:hosts: ["192.168.10.102:5044"](2)啟動 filebeat 服務 [root@elk2 ~]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml &
修改logstash的配置文件,使日志輸出到elasticsearch?
[root@elkl ~]# vim /usr/local/logstash/config/beats.confinput {beats {port => "5044"codec => "json"} }output{elasticsearch {hosts => ["192.168.10.103:9200"]index => "weblog-beat-%{+YYYY.MM.dd}"} }
?運行logstash
[root@elk1 ~]#/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/beats.conf --path.data=/usr/local/logstash/config.d/web01 &
?2.1.5安裝Kibana
在elk上安裝Kibana
[root@elk1 ~]# tar zxvf kibana-7.10.0-linux-x86_64.tar.gz [root@elk1 ~]# mv kibana-7.10.0-linux-x86_64 /usr/local/kibana
?修改Kibana主配置文件
[root@elkl opt]$ vim /usr/local/kibana/config/kibana.yml server.port: 5601 ##2 行,監聽端口 server.host: "0.0.0.0" ##7 行,監聽地址 elasticsearch.hosts: "http://192.168.10.103:9200" ##28 行,ES 主機的 IP 地址 kibana.index: ".kibana" ##32 行 [root@elkl ~]# chown -R es:es /usr/local/kibana/
?啟動Kibana服務
[root@localhost ~]# su - es[es@elk1 ~]$ nohup /usr/local/kibana/bin/kibana &