目錄
一、ELK相關介紹
1.1 什么是ELK Stack
1.2?ELK核心組件與功能
1.3 ELK優勢
1.4?ES數據庫結構對比SqlServer
二、安裝ELK
2.1?window安裝
2.2?Docker下環境搭建
2.2.1 安裝7.16.3版本ElasticSearch
2.2.2 安裝7.16.3版本Kibana :
2.2.3?安裝8.0.0版本ElasticSearch
2.2.4?配置支持跨域
2.2.5 安裝插件
2.3?集群構建
2.3.1?環境準備
2.3.2?集群構建思路
2.3.3?docker-Compose集群配置
三、文章總結
一、ELK相關介紹
1.1 什么是ELK Stack
?????????ELK Stack是由Elasticsearch、Logstash和Kibana三個核心組件構成的日志管理與分析解決方案,支持日志的收集、存儲、檢索及可視化。Java開發的高性能分布式日志系統,支持億級的查詢。
????????官網:ELK Stack:Elasticsearch、Kibana、Beats 和 Logstash | Elastic
1.2?ELK核心組件與功能
-
?Elasticsearch(ES)?高性能的數據庫引擎
- 分布式搜索與分析引擎,負責海量數據的實時存儲、索引與檢索,基于Lucene構建,支持水平擴展與高可用架構。??
- 特點:自動分片、副本機制、RESTful API接口,適用于全文搜索和結構化數據分析。??
-
?Logstash? 收集和保存數據的工具
- 數據收集與處理管道,分為輸入(Input)、過濾(Filter)、輸出(Output)三個階段,支持200+插件,可解析非結構化數據(如日志文件)并進行格式轉換。??
- 資源消耗較高,常與輕量級工具(如Filebeat)配合使用。??
-
?Kibana?。操作使用管理 ES數據庫的客戶端
- 數據可視化平臺,提供交互式儀表盤、圖表及DevTools工具,便于用戶查詢和分析Elasticsearch中的數據。??
4.Beats: 高性能是數據工具.(可選組件)
????????Beats 不是一個單獨的軟件,而是一系列的數據采集器.每一個 Beat 都是一個獨立的組件,負責采集特定類型的數據,并將這些數據發送到 Elasticsearch 或者 Logstash 進行后續處理。例如,Filebeat 專門用于收集和轉發日志文件,Metricbeat 用于收集系統和服務的運行指標,Packetbeat 用于收集網絡流量數據等。
1.3 ELK優勢
- 支持分布式,支持集群部署,便于橫向擴展和高可用。
- 大數據量支持,PB級數據查詢---關系型數據庫沒法比
- 毫秒級響應
- 添加索引時性能穩定
- 支持頻繁更新(數據)(不推薦)
- 添加索引,支持近時搜索(1秒延遲)
- 支持結構化查詢:支持RESTful API,支持JSON數據結構通過?HTTP查詢數據,關系型數據庫中支持的各種操作,基本上都可以在這里完成;
1.4?ES數據庫結構對比SqlServer
SqlServer數據庫 | ES數據庫 |
數據庫 | Index索引庫:以索引為單位,內存保存,提高性能 |
數據庫表 | type類型: ES在8.0版本去掉類型,但是默認有類型:_doc |
表-行 | document 文檔: 一個文檔就類似于一行數據 |
表-列 | field 字段 (非分詞字段和分詞字段) |
二、安裝ELK
2.1?window安裝
? ? ? ? PS:ES是java開發,所以需要安裝jdk,建議安裝jdk --version 11 +
????????1.檢查本地是否安裝jdk
java -version ?
????????2.Jdk下載地址和安裝:
https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe ( sha256)
2.2?Docker下環境搭建
環境準備:
Linux-CentOS7
Docker version: Docker version 23.0.3,
elasticsearch官網:
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
2.2.1 安裝7.16.3版本ElasticSearch
#拉取鏡像
docker pull elasticsearch:7.16.3
#如果沒有可用的鏡像源,可以用官網自帶的下載
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.16.3
#使用docker鏡像啟動容器 ? ElasticSearch單節點集群
docker run -p 9200:9200 -p 9300:9300 -d -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -
Xmx512m" elasticsearch:7.16.3
#下面是通過鏡像ID啟動容器
docker run -p 9200:9200 -p 9300:9300 -d -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -
Xmx512m" 鏡像id
#支持跨域的啟動
docker run -p 9200:9200 -p 9300:9300 -d -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -
Xmx512m" -e"http.cors.enabled=true" -e "http.cors.allow-origin="*"" elasticsearch:7.16.3
?????????ElasticSearch 啟動都是集群 無論是一個還是多個,一個就是單節點集群。瀏覽器訪問 ip:9200 ?如果出現以下界面就是安裝成功。
ps:在使用docker命令啟動時,注意相關參數的正確寫入,否則會出現如下異常“Unrecognized option: - ”
2.2.2 安裝7.16.3版本Kibana :
#創建網絡(兩種都可以,一種是默認一種使用橋接網絡)
#保證kibana可以訪問es
docker network create elastic#拉取鏡像
docker pull docker.elastic.co/kibana/kibana:7.16.3
#運行kibana
docker run --name kib01-test --net elastic -p 5601:5601 -e
"ELASTICSEARCH_HOSTS=http://ip:9200" kibana:7.16.3
????????Kibana默認的端口監聽: 5601
2.2.3?安裝8.0.0版本ElasticSearch
? ? ? ? 8.0后的ES安裝和以前版本會有不同。
# 拉取鏡像
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.0.0
docker pull docker.elastic.co/kibana/kibana:8.0.0
# 創建網絡
docker network create elastic
# 啟動 Elastic Search 8.0.0
docker run -it --name elasticsearch --net elastic --restart=always -p 9200:9200 -p 9300:9300 -e
"discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.0.0
# 第一次的日志中會打印出默認用戶elastic的初始密碼,以及用于Kibana啟動的enrollment token(半小時有效)注意保存
????????密碼記錄:
Elasticsearch安全功能已自動配置!
身份驗證已啟用,群集連接已加密。
-> Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
aV3Fl5SeEk6TttXnMiSB
-> HTTP CA certificate SHA-256 fingerprint:
f8577d958c7845dd88edbfd1bc140e6618dc19c755607671e8330074de9ec36e
-> Configure Kibana to use this cluster:
* Run Kibana and click the configuration link in the terminal when Kibana starts.
* Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30
minutes):
eyJ2ZXIiOiI4LjAuMCIsImFkciI6WyIxNzIuMjAuMC4yOjkyMDAiXSwiZmdyIjoiZjg1NzdkOTU4Yzc4NDVkZDg4ZWRiZmQxYmMxNDB
lNjYxOGRjMTljNzU1NjA3NjcxZTgzMzAwNzRkZTllYzM2ZSIsImtleSI6Im9VZVdSWDhCMUw2ZFBhOGJ6SE81OjYyNDF1SVZSUWd5dk
s5ZDdXU1hZZlEifQ==
-> Configure other nodes to join this cluster:
* Copy the following enrollment token and start new Elasticsearch nodes with `bin/elasticsearch --
enrollment-token <token>` (valid for the next 30 minutes):
eyJ2ZXIiOiI4LjAuMCIsImFkciI6WyIxNzIuMjAuMC4yOjkyMDAiXSwiZmdyIjoiZjg1NzdkOTU4Yzc4NDVkZDg4ZWRiZmQxYmMxNDB
lNjYxOGRjMTljNzU1NjA3NjcxZTgzMzAwNzRkZTllYzM2ZSIsImtleSI6Im8wZVdSWDhCMUw2ZFBhOGJ6SFByOnU2RkR6cG5TUjVTS3
NmZzJVMUhrdncifQ==
If you're running in Docker, copy the enrollment token and run:
`docker run -e "ENROLLMENT_TOKEN=<token>" docker.elastic.co/elasticsearch/elasticsearch:8.0.0`
------------------------------------------------------------------------------------------------------
? ? ? ? 運行8.0.0Kibana
# 啟動 Kibana 8.0.0
docker run --name kibana --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.0.0
# 第一次的日志中會打印出啟動配置網址,在瀏覽器打開并輸入enrollment token,等待完成配置
# 使用用戶名elastic和之前保存的密碼登錄
2.2.4?配置支持跨域
? ? ? ? 1、修改docker中elasticsearch的elasticsearch.yml文件--支持跨域
? ? ? ? ps:修改了網絡配置,重啟網卡后,如果docker 容器鏈接不上,重啟docker引擎
#進入到容器
docker exec -it elasticsearch /bin/bash
修改
vi config/elasticsearch.ym
增加配置信息
http.cors.enabled: true
http.cors.allow-origin:"*"
#重啟容器
? ? ? ? 2、在啟動容器時寫入環境變量
docker run -p 9200:9200 -p 9300:9300 -d -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e"http.cors.enabled=true" -e "http.cors.allow-origin="*"" elasticsearch:7.16.3
2.2.5 安裝插件
? ? ? ? 1、安裝ik分詞器
# 安裝ik分詞器
# 下載 https://github.com/medcl/elasticsearch-analysis-ik/releases
4、配置支持跨域
修改docker中elasticsearch的elasticsearch.yml文件--支持跨域
docker cp elasticsearch-analysis-ik-8.0.0.zip elasticsearch:/usr/share/elasticsearch/plugins
# 進入elasticsearch命令行
cd plugins/
mkdir ik
mv elasticsearch-analysis-ik-8.0.0.zip ik/
cd ik/
unzip elasticsearch-analysis-ik-8.0.0.zip
rm elasticsearch-analysis-ik-8.0.0.zip
# 重啟es和kibana
docker restart elasticsearch
docker restart kibana
# 在kibana中測試ik分詞器
GET _analyze
{
"text" : "測試一下分詞器",
"analyzer": "ik_max_word"
}
????????2、支持Sql查詢:
1.獲取elasticsearch容器的ID
docker ps ?
2.進入elasticsearch的docker容器
docker exec -it 容器ID /bin/bash
3.安裝elasticsearch對應的elasticsearch-sql插件
./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-
sql/releases/download/7.16.3.0/elasticsearch-sql-7.16.3.0.zip
4.Elasticsearch-sql默認支持查詢最大記錄數10000,更改最大查詢值100000000
curl -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' ? ? ? ?
http://192.168.1.131:9200/logs*/_settings -d '{"index":{ "max_result_window":1000000000}}'
備注:http://192.168.1.131:9200替換成對應的elasticsearch服務器地址
5.退出容器
? ? ? ? 3、瀏覽器插件
- Multi Elasticsearch Head
- Elasticsearch Tools
- 國人開發的瀏覽器插件:es-client
2.3?集群構建
????????官方提供的ElasticSearch 只會有32個G,ElasticSearch 號稱百億數據庫,所以必須的支持擴容,支持集群.
????????一個ElasticSearch 服務器支持32個G,那么10個ElasticSearch 服務器就可以支持320個G。。。。。
????????ElasticSearch 生來就是集群的,前面Docker的啟動的其實也是集群,叫單節點集群。
2.3.1?環境準備
Linux系統:CentOS7
Docker version: 26.1.4
2.3.2?集群構建思路
????????啟動多個Docker,每一個Docker就是一個獨立的系統,每個Dokcer中獨立的有ElasticSearch的進
程;其實就是多個Docker 容器集群。每一個啟動的Docker配置好配置文件即可;如果使用Docker
Compose來做,可以做到一鍵啟動集群;
????????集群前環境準備:
1.掛載的目錄必須設置完全權限: chmod 777 /root/elk/data01
2.調高vm線程數限制 (解決Elasticsearch啟動時出現的vm.max_map_count不足問題,需要調整Linux系統的內核參數)
? ? ? ? 若集群時出現如下問題:
#進入配置文件
vim /etc/sysctl.conf
#調整vm線程數
vm.max_map_count=655360
#執行生效
sysctl –p
? ? ?3、或者直接執行下面代碼 sysctl -w vm.max_map_count=655360
????????臨時修改,重啟后失效:
sudo sysctl -w vm.max_map_count=262144
2.3.3?docker-Compose集群配置
1、配置ES集群所在文件夾結構
? ?
2、yml文件內容
version: '3.4'services:es01:image: "docker.elastic.co/elasticsearch/elasticsearch:7.16.3"container_name: es01ports:- "9200:9200"- "9300:9300"environment:node.name: es01discovery.seed_hosts: es01,es02,es03cluster.initial_master_nodes: es01,es02,es03cluster.name: myclusterES_JAVA_OPTS: -Xms512m -Xmx512mvolumes:- "./data01:/usr/share/elasticsearch/data"- "./plugins/ik:/usr/share/elasticsearch/plugins/ik" - "./plugins/sql:/usr/share/elasticsearch/plugins/sql"ulimits:memlock:soft: -1hard: -1es02:image: "docker.elastic.co/elasticsearch/elasticsearch:7.16.3"container_name: es02ports:- "9201:9200"- "9301:9300"environment:node.name: es02discovery.seed_hosts: es01,es02,es03cluster.initial_master_nodes: es01,es02,es03cluster.name: myclusterES_JAVA_OPTS: -Xms512m -Xmx512mvolumes:- "./data02:/usr/share/elasticsearch/data"- "./plugins/ik:/usr/share/elasticsearch/plugins/ik" - "./plugins/sql:/usr/share/elasticsearch/plugins/sql"ulimits:memlock:soft: -1hard: -1es03:image: "docker.elastic.co/elasticsearch/elasticsearch:7.16.3"container_name: es03ports:- "9202:9200"- "9302:9300"environment:node.name: es03discovery.seed_hosts: es01,es02,es03cluster.initial_master_nodes: es01,es02,es03cluster.name: myclusterES_JAVA_OPTS: -Xms512m -Xmx512mvolumes:- "./data03:/usr/share/elasticsearch/data"- "./plugins/ik:/usr/share/elasticsearch/plugins/ik" - "./plugins/sql:/usr/share/elasticsearch/plugins/sql"ulimits:memlock:soft: -1hard: -1kibana:image: docker.elastic.co/kibana/kibana:7.16.3container_name: kibanadepends_on:- es01- es02- es03ports:- "5601:5601"- "9600:9600"environment:SERVERNAME: kibanaELASTICSEARCH_HOSTS: '["http://es01:9200","http://es02:9200","http://es03:9200"]'ES_JAVA_OPTS: -Xmx512m -Xms512m
三、文章總結
????????Elasticsearch (ES)是一個基于 Lucene 的開源搜索引擎,它不但穩定、可靠、快速,而且也具有良好的水平擴展能力,是專門為分布式環境設計的,Elasticsearch是面向文檔型數據庫。很多商城項目中會把商品訂單信息存儲到ES中。沒有最好的技術只有最適合項目。