ELK 快速指南

ELK 快速指南

概念

ELK 是什麼

ELK 是 elastic 公司旗下三款產品 ElasticSearch 、Logstash 、Kibana 的首字母組合。html

ElasticSearch 是一個基於 Lucene 構建的開源,分佈式,RESTful 搜索引擎。java

Logstash 傳輸和處理你的日誌、事務或其餘數據。linux

Kibana 將 Elasticsearch 的數據分析並渲染爲可視化的報表。git

爲何使用 ELK ?

對於有必定規模的公司來講,一般會不少個應用,並部署在大量的服務器上。運維和開發人員經常須要經過查看日誌來定位問題。若是應用是集羣化部署,試想若是登陸一臺臺服務器去查看日誌,是多麼費時費力。github

而經過 ELK 這套解決方案,能夠同時實現日誌收集、日誌搜索和日誌分析的功能。spring

ELK 架構

static/images/deploy3.png

以上是 ELK 技術棧的一個架構圖。從圖中能夠清楚的看到數據流向。docker

Beats 是單一用途的數據傳輸平臺,它能夠將多臺機器的數據發送到 Logstash 或 ElasticSearch。但 Beats 並非不可或缺的一環,因此本文中暫不介紹。apache

Logstash 是一個動態數據收集管道。支持以 TCP/UDP/HTTP 多種方式收集數據(也能夠接受 Beats 傳輸來的數據),並對數據作進一步豐富或提取字段處理。json

ElasticSearch 是一個基於 JSON 的分佈式的搜索和分析引擎。做爲 ELK 的核心,它集中存儲數據。windows

Kibana 是 ELK 的用戶界面。它將收集的數據進行可視化展現(各類報表、圖形化數據),並提供配置、管理 ELK 的界面。

安裝

準備

ELK 要求本地環境中安裝了 JDK 。若是不肯定是否已安裝,可以使用下面的命令檢查:

java -version

本文使用的 ELK 是 6.0.0,要求 jdk 版本不低於 JDK8。

友情提示:安裝 ELK 時,三個應用請選擇統一的版本,避免出現一些莫名其妙的問題。例如:因爲版本不統一,致使三個應用間的通信異常。

Elasticsearch

安裝步驟以下:

  1. elasticsearch 官方下載地址下載所需版本包並解壓到本地。
  2. 運行 bin/elasticsearch (Windows 上運行 bin\elasticsearch.bat
  3. 驗證運行成功:linux 上能夠執行 curl http://localhost:9200/ ;windows 上能夠用訪問 REST 接口的方式來訪問 http://localhost:9200/

Logstash

安裝步驟以下:

  1. 在 logstash 官方下載地址下載所需版本包並解壓到本地。
  2. 添加一個 logstash.conf 文件,指定要使用的插件以及每一個插件的設置。舉個簡單的例子:
input { stdin { } }
   output {
     elasticsearch { hosts => \["localhost:9200"\] }
     stdout { codec => rubydebug }
   }
  1. 運行 bin/logstash -f logstash.conf (Windows 上運行bin/logstash.bat -f logstash.conf

Kibana

安裝步驟以下:

  1. 在 kibana 官方下載地址下載所需版本包並解壓到本地。
  2. 修改 config/kibana.yml 配置文件,設置 elasticsearch.url 指向 Elasticsearch 實例。
  3. 運行 bin/kibana (Windows 上運行 bin\kibana.bat
  4. 在瀏覽器上訪問 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.LogstashTcpSocketAppende>
  <!--
  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 服務。

[image.png

資料

相關文章
相關標籤/搜索