Elastic 技術棧之快速入門
概念
ELK 是什麼
ELK 是 elastic 公司旗下三款産品
ElasticSearch、
Logstash Kibana的首字母組合。
是一個基于
Lucene建構的開源,分布式,RESTful 搜尋引擎。
傳輸和處理你的日志、事務或其他資料。
将 Elasticsearch 的資料分析并渲染為可視化的報表。
為什麼使用 ELK ?
對于有一定規模的公司來說,通常會很多個應用,并部署在大量的伺服器上。運維和開發人員常常需要通過檢視日志來定位問題。如果應用是叢集化部署,試想如果登入一台台伺服器去檢視日志,是多麼費時費力。
而通過 ELK 這套解決方案,可以同時實作日志收集、日志搜尋和日志分析的功能。
ELK 架構

說明
以上是 ELK 技術棧的一個架構圖。從圖中可以清楚的看到資料流向。
Beats 是單一用途的資料傳輸平台,它可以将多台機器的資料發送到 Logstash 或 ElasticSearch。但 Beats 并不是不可或缺的一環,是以本文中暫不介紹。 是一個動态資料收集管道。支援以 TCP/UDP/HTTP 多種方式收集資料(也可以接受 Beats 傳輸來的資料),并對資料做進一步豐富或提取字段處理。 是一個基于 JSON 的分布式的搜尋和分析引擎。作為 ELK 的核心,它集中存儲資料。 是 ELK 的使用者界面。它将收集的資料進行可視化展示(各種報表、圖形化資料),并提供配置、管理 ELK 的界面。
安裝
準備
ELK 要求本地環境中安裝了 JDK 。如果不确定是否已安裝,可使用下面的指令檢查:
java -version
注意
本文使用的 ELK 是 6.0.0,要求 jdk 版本不低于 JDK8。
友情提示:安裝 ELK 時,三個應用請選擇統一的版本,避免出現一些莫名其妙的問題。例如:由于版本不統一,導緻三個應用間的通訊異常。
Elasticsearch
安裝步驟如下:
- elasticsearch 官方下載下傳位址 下載下傳所需版本包并解壓到本地。
- 運作
(Windows 上運作bin/elasticsearch
)bin\elasticsearch.bat
- 驗證運作成功:linux 上可以執行
;windows 上可以用通路 REST 接口的方式來通路 http://localhost:9200/curl http://localhost:9200/
Linux 上可以執行下面的指令來下載下傳壓縮包:Mac 上可以執行以下指令來進行安裝:curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.tar.gz
Windows 上可以選擇 MSI 可執行安裝程式,将應用安裝到本地。brew install elasticsearch
- 在 logstash 官方下載下傳位址
- 添加一個
檔案,指定要使用的插件以及每個插件的設定。舉個簡單的例子:logstash.conf
input { stdin { } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } }
-
bin/logstash -f logstash.conf
bin/logstash.bat -f logstash.conf
- kibana 官方下載下傳位址
- 修改
配置檔案,設定config/kibana.yml
指向 Elasticsearch 執行個體。elasticsearch.url
-
bin/kibana
bin\kibana.bat
- 在浏覽器上通路 http://localhost:5601
安裝 FAQ
elasticsearch 不允許以 root 權限來運作
問題:在 Linux 環境中,elasticsearch 不允許以 root 權限來運作。
如果以 root 身份運作 elasticsearch,會提示這樣的錯誤:
can not run elasticsearch as root
解決方法:使用非 root 權限賬号運作 elasticsearch
# 建立使用者組
groupadd elk
# 建立新使用者,-g elk 設定其使用者組為 elk,-p elk 設定其密碼為 elk
useradd elk -g elk -p elk
# 更改 /opt 檔案夾及内部檔案的所屬使用者及組為 elk:elk
chown -R elk:elk /opt # 假設你的 elasticsearch 安裝在 opt 目錄下
# 切換賬号
su elk
vm.max_map_count 不低于 262144
問題:
vm.max_map_count
表示虛拟記憶體大小,它是一個核心參數。elasticsearch 預設要求
vm.max_map_count
不低于 262144。
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決方法:
你可以執行以下指令,設定
vm.max_map_count
,但是重新開機後又會恢複為原值。
sysctl -w vm.max_map_count=262144
持久性的做法是在
/etc/sysctl.conf
檔案中修改
vm.max_map_count
參數:
echo "vm.max_map_count=262144" > /etc/sysctl.conf
sysctl -p
如果運作環境為 docker 容器,可能會限制執行 sysctl 來修改核心參數。
這種情況下,你隻能選擇直接修改主控端上的參數了。
nofile 不低于 65536
nofile
表示程序允許打開的最大檔案數。elasticsearch 程序要求可以打開的最大檔案數不低于 65536。
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
/etc/security/limits.conf
nofile
echo "* soft nofile 65536" > /etc/security/limits.conf
echo "* hard nofile 131072" > /etc/security/limits.conf
nproc 不低于 2048
nproc
表示最大線程數。elasticsearch 要求最大線程數不低于 2048。
max number of threads [1024] for user [user] is too low, increase to at least [2048]
/etc/security/limits.conf
nproc
echo "* soft nproc 2048" > /etc/security/limits.conf
echo "* hard nproc 4096" > /etc/security/limits.conf
Kibana No Default Index Pattern Warning
問題:安裝 ELK 後,通路 kibana 頁面時,提示以下錯誤資訊:
Warning No default index pattern. You must select or create one to continue.
...
Unable to fetch mapping. Do you have indices matching the pattern?
這就說明 logstash 沒有把日志寫入到 elasticsearch。
檢查 logstash 與 elasticsearch 之間的通訊是否有問題,一般問題就出在這。
使用
本人使用的 Java 日志方案為 slf4j + logback,是以這裡以 logback 來講解。
Java 應用輸出日志到 ELK
修改 logstash.conf 配置
首先,我們需要修改一下 logstash 服務端 logstash.conf 中的配置
input {
# stdin { }
tcp {
# host:port就是上面appender中的 destination,
# 這裡其實把logstash作為服務,開啟9250端口接收logback發出的消息
host => "127.0.0.1" port => 9250 mode => "server" tags => ["tags"] codec => json_lines
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
這個 input 中的配置其實是 logstash 服務端監聽 9250 端口,接收傳遞來的日志資料。
然後,在 Java 應用的 pom.xml 中引入 jar 包:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
</dependency>
接着,在 logback.xml 中添加 appender
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--
destination 是 logstash 服務的 host:port,
相當于和 logstash 建立了管道,将日志資料定向傳輸到 logstash
-->
<destination>127.0.0.1:9250</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<logger name="io.github.dunwu.spring" level="TRACE" additivity="false">
<appender-ref ref="LOGSTASH" />
</logger>
大功告成,此後,
io.github.dunwu.spring
包中的 TRACE 及以上級别的日志資訊都會被定向輸出到 logstash 服務。