搞懂 ELK 並不是一件特別難的事

架構師(JiaGouX)

我們都是架構師!
架構未來,你來不來?

本篇文章主要介紹 ELK 的一些框架組成,原理和實踐,採用的 ELK 本版爲 7.7.0 版本。

ELK 介紹

ELK 簡介

ELK 是 Elasticsearch、Logstash、Kibana 三大開源框架首字母大寫簡稱(但是後期出現的 Filebeat(beats 中的一種)可以用來替代 Logstash 的數據收集功能,比較輕量級)。市面上也被成爲 Elastic Stack。

Filebeat 是用於轉發和集中日誌數據的輕量級傳送工具。Filebeat 監視您指定的日誌文件或位置,收集日誌事件,並將它們轉發到 Elasticsearch 或 Logstash 進行索引。Filebeat 的工作方式如下:啓動 Filebeat 時,它將啓動一個或多個輸入,這些輸入將在爲日誌數據指定的位置中查找。對於 Filebeat 所找到的每個日誌,Filebeat 都會啓動收集器。每個收集器都讀取單個日誌以獲取新內容,並將新日誌數據發送到 libbeat,libbeat 將聚集事件,並將聚集的數據發送到爲 Filebeat 配置的輸出。

Logstash 是免費且開放的服務器端數據處理管道,能夠從多個來源採集數據,轉換數據,然後將數據發送到您最喜歡的 “存儲庫” 中。Logstash 能夠動態地採集、轉換和傳輸數據,不受格式或複雜度的影響。利用 Grok 從非結構化數據中派生出結構,從 IP 地址解碼出地理座標,匿名化或排除敏感字段,並簡化整體處理過程。

Elasticsearch 是 Elastic Stack 核心的分佈式搜索和分析引擎,是一個基於 Lucene、分佈式、通過 Restful 方式進行交互的近實時搜索平臺框架。Elasticsearch 爲所有類型的數據提供近乎實時的搜索和分析。無論您是結構化文本還是非結構化文本,數字數據或地理空間數據,Elasticsearch 都能以支持快速搜索的方式有效地對其進行存儲和索引。

Kibana 是一個針對 Elasticsearch 的開源分析及可視化平臺,用來搜索、查看交互存儲在 Elasticsearch 索引中的數據。使用 Kibana,可以通過各種圖表進行高級數據分析及展示。並且可以爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,可以彙總、分析和搜索重要數據日誌。還可以讓海量數據更容易理解。它操作簡單,基於瀏覽器的用戶界面可以快速創建儀表板(Dashboard)實時顯示 Elasticsearch 查詢動態。

爲什麼要使用 ELK

日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌瞭解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以瞭解服務器的負荷,性能安全性,從而及時採取措施糾正錯誤。

往往單臺機器的日誌我們使用 grep、awk 等工具就能基本實現簡單分析,但是當日志被分散的儲存不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日誌。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日誌管理,例如:開源的 Syslog,將所有服務器上的日誌收集彙總。集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,一般我們使用 grep、awk 和 wc 等 Linux 命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。

一般大型系統是一個分佈式部署的架構,不同的服務模塊部署在不同的服務器上,問題出現時,大部分情況需要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日誌系統,可以提高定位問題的效率。

完整日誌系統基本特徵

ELK 架構分析

Beats + Elasticsearch + Kibana 模式

如上圖所示,該 ELK 框架由 Beats(日誌分析我們通常使用 Filebeat)+ Elasticsearch + Kibana 構成,這個框架比較簡單,入門級的框架。其中 Filebeat 也能通過 module 對日誌進行簡單的解析和索引。並查看預建的 Kibana 儀表板。

該框架適合簡單的日誌數據,一般可以用來玩玩,生產環境建議接入 Logstash。

Beats + Logstash + Elasticsearch + Kibana 模式

該框架是在上面的框架的基礎上引入了 Logstash,引入 Logstash 帶來的好處如下:

Filebeat 結合 Logstash 帶來的優勢:

當然在該框架的基礎上還可以引入其他的輸入數據的方式:比如:TCP,UDP 和 HTTP 協議是將數據輸入 Logstash 的常用方法(如下圖所示):

Beats + 緩存 / 消息隊列 + Logstash + Elasticsearch + Kibana 模式

在如上的基礎上我們可以在 Beats 和 Logstash 中間添加一些組件 Redis、Kafka、RabbitMQ 等,添加中間件將會有如下好處:

ELK 部署

ELK 各個組件的網址可以在官網下載:https://www.elastic.co/cn/

或者在中文社區下載:https://elasticsearch.cn/download/

注:本次安裝都是採用壓縮包的方式安裝。

Filebeat 的安裝介紹

原理

Filebeat 的工作方式如下:啓動 Filebeat 時,它將啓動一個或多個輸入,這些輸入將在爲日誌數據指定的位置中查找。對於 Filebeat 所找到的每個日誌,Filebeat 都會啓動收集器。每個收集器都讀取單個日誌以獲取新內容,並將新日誌數據發送到 Libbeat,Libbeat 將聚集事件,並將聚集的數據發送到爲 Filebeat 配置的輸出。

Filebeat 結構:由兩個組件構成,分別是 inputs(輸入)和 harvesters(收集器),這些組件一起工作來跟蹤文件並將事件數據發送到您指定的輸出,harvester 負責讀取單個文件的內容。harvester 逐行讀取每個文件,並將內容發送到輸出。爲每個文件啓動一個 harvester。harvester 負責打開和關閉文件,這意味着文件描述符在 harvester 運行時保持打開狀態。如果在收集文件時刪除或重命名文件,Filebeat 將繼續讀取該文件。這樣做的副作用是,磁盤上的空間一直保留到 harvester 關閉。默認情況下,Filebeat 保持文件打開,直到達到 close_inactive。

簡單安裝

本文采用壓縮包的方式安裝,Linux 版本,Filebeat-7.7.0-linux-x86_64.tar.gz。

配置示例文件:filebeat.reference.yml(包含所有未過時的配置項)

配置文件:filebeat.yml

啓動命令:./filebeat -e

具體的原理、使用、實例見文:https://www.cnblogs.com/zsql/p/13137833.html

Logstash 的安裝介紹

基本原理

Logstash 分爲三個步驟:inputs(必須的)→ filters(可選的)→ outputs(必須的),inputs 生成時間,filters 對其事件進行過濾和處理,outputs 輸出到輸出端或者決定其存儲在哪些組件裏。inputs 和 outputs 支持編碼和解碼。

Logstash 管道中的每個 input 階段都在自己的線程中運行。將寫事件輸入到內存(默認)或磁盤上的中心隊列。每個管道工作線程從該隊列中取出一批事件,通過配置的 filter 處理該批事件,然後通過 output 輸出到指定的組件存儲。管道處理數據量的大小和管道工作線程的數量是可配置的。

簡單安裝

下載地址 1:https://www.elastic.co/cn/downloads/logstash

下載地址 2:https://elasticsearch.cn/download/

這裏需要安裝 JDK,我使用的是 Elasticsearch 7.7.0 自帶的 JDK:

解壓即安裝:

來個 Logstash 版本的 HelloWorld:

./bin/logstash -e 'input { stdin { } } output { stdout {} }'

具體的原理、使用、實例見文:https://www.cnblogs.com/zsql/p/13143445.html

Elasticsearch 的安裝介紹

基本介紹

Elasticsearch(ES)是一個基於 Lucene 構建的開源、分佈式、RESTful 接口的全文搜索引擎。Elasticsearch 還是一個分佈式文檔數據庫,其中每個字段均可被索引,而且每個字段的數據均可被搜索,ES 能夠橫向擴展至數以百計的服務器存儲以及處理 PB 級的數據。可以在極短的時間內存儲、搜索和分析大量的數據。

基本概念有:Cluster 集羣、Node 節點、Index 索引、Document 文檔、Shards & Replicas 分片與副本等。

Elasticsearch 的優勢:

Linux 系統參數設置

1、設置系統配置

ulimit #暫時修改,切換到該用戶es,ulimit -n 65535 
/etc/security/limits.conf #永久修改 es -  nofile  65535
ulimit -a #查看當前用戶的資源限制

2、禁用 sawpping

方式一:

swapoff -a #臨時禁用所有的swap文件
vim /etc/fstab #註釋掉所有的swap相關的行,永久禁用

方式二:

cat /proc/sys/vm/swappiness #查看該值
sysctl vm.swappiness=#臨時修改該值爲1
vim /etc/sysctl.conf #修改文件 永久生效
vm.swappiness = 1 #如果有該值,則修改該值,若沒有,則追加該選項,sysctl -p生效命令

方式三:

配置elasticsearch.yml文件,添加如下配置:
bootstrap.memory_lock: true
GET _nodes?filter_path=**.mlockall  #檢查如上配置是否成功

注意:如果試圖分配比可用內存更多的內存,mlockall 可能會導致 JVM 或 shell 會話退出!

3、配置文件描述符

ulimit -n 65535  #臨時修改
vim /etc/security/limits.conf #永久修改
es         soft    nproc     65535
es         hard    nproc     65535

4、配置虛擬內存

sysctl -w vm.max_map_count=262144 #臨時修改該值
vim /etc/sysctl.conf #永久修改
vm.max_map_count=262144

5、配置線程數

ulimit -u 4096 #臨時修改
vim /etc/security/limits.conf #永久修改

Elasticsearch 安裝

Elasticsearch 是需要其他用戶啓動的,所以需要先創建一個新的用戶 ELK:

groupadd  elastic
useradd elk -d /data/hd05/elk -g elastic
echo '2edseoir@' | passwd elk --stdin

下載:https://elasticsearch.cn/download/

也可以去官網下載 wget:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-linux-x86_64.tar.gz

解壓:tar -zxvf elasticsearch-7.7.0-linux-x86_64.tar.gz

建立軟鏈接:ln –s elasticsearch-7.7.0 es

目錄介紹:

$ES_HOME:/data/hd05/elk/elasticsearch-7.7.0
bin: $ES_HOME/bin  #ES啓動命令和插件安裝命令
conf:$ES_HOME/conf #elasticsearch.yml配置文件目錄
data:$ES_HOME/data  #對應的參數path.data,用於存放索引分片數據文件
logs:$ES_HOME/logs  #對應的參數path.logs,用於存放日誌
jdk:$ES_HOME/jdk  #自帶支持該ES版本的JDK
plugins: $ES_HOME/jplugins #插件存放目錄
lib: $ES_HOME/lib #存放依賴包,比如Java類庫
modules: $ES_HOME/modules #包含所有的ES模塊

配置自帶的 Java 環境:

Vim ~/.bashrc
############往後面添加如下內容######################
export JAVA_HOME=/data/hd05/elk/es/jdk
export PATH=JAVAHOME/bin:PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar\:/lib/tools.jar

jvm.options 文件說明:

配置Java參數
一種是通過修改/data/hd05/elk/elasticsearch-7.7.0/config/jvm.options文件修改JVM參數,一個使用過一個變量ES_JAVA_OPTS來聲明JVM參數
/data/hd05/elk/elasticsearch-7.7.0/config/jvm.options介紹:
8:-Xmx2g  #表示只適合Java 8
8-:-Xmx2g  #表示適合高於Java 8的版本
8-9:-Xmx2g #表示適合Java 8,和Java 9
其他配置,都是JVM的相關參數,如果要想明白,得去看Java虛擬機

通過變量ES_JAVA_OPTS來聲明JVM參數:
例如:export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch

配置 config/jvm.options:

[elk@lgh config]$ cat  jvm.options  | egrep -v '^$|#'                 
-Xms2g
-Xmx2g
8-13:-XX:+UseConcMarkSweepGC
8-13:-XX:CMSInitiatingOccupancyFraction=75
8-13:-XX:+UseCMSInitiatingOccupancyOnly
14-:-XX:+UseG1GC
14-:-XX:G1ReservePercent=25
14-:-XX:InitiatingHeapOccupancyPercent=30
-Djava.io.tmpdir=${ES_TMPDIR}
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=data
-XX:ErrorFile=logs/hs_err_pid%p.log
8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
8:-Xloggc:logs/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m
9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m

配置加密通信證書:

生成證書:

方法一:

./bin/elasticsearch-certutil ca -out config/elastic-certificates.p12 -pass "password"

查看 config 目錄,有 elastic-certificates.p12 文件生成:

方法二:

./bin/elasticsearch-certutil ca  #創建集羣認證機構,需要交互輸入密碼
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12  #爲節點頒發證書,與上面密碼一樣
執行./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password 並輸入第一步輸入的密碼 
執行./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 並輸入第一步輸入的密碼 
將生成的elastic-certificates.p12、elastic-stack-ca.p12文件移動到config目錄下

配置 config/elasticsearch.yml:

[elk@lgh config]$ cat  elasticsearch.yml  | egrep -v '^$|#'
cluster.name: my_cluster
node.name: lgh01
node.data: true
node.master: true
path.data: /data/hd05/elk/elasticsearch-7.7.0/data
path.logs: /data/hd05/elk/elasticsearch-7.7.0/logs
network.host: 192.168.110.130
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["192.168.110.130","192.168.110.131","192.168.110.132","192.168.110.133"]
cluster.initial_master_nodes: ["lgh01","lgh02","lgh03"]
cluster.routing.allocation.cluster_concurrent_rebalance: 32
cluster.routing.allocation.node_concurrent_recoveries: 32
cluster.routing.allocation.node_initial_primaries_recoveries: 32
http.cors.enabled: true
http.cors.allow-origin: '*'

#下面的是配置x-pack和tsl/ssl加密通信的
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

bootstrap.memory_lock: false   #CentOS 6需要配置
bootstrap.system_call_filter: false #CentOS 6需要配置

然後通過 scp 到其他的節點,修改上面的 node.name 和 node.master 參數,然後要刪除 data 目標,不然會存在報錯。

然後使用./bin/elasticsearch -d 後臺啓動 elasticsearch,去掉 - d 則是前端啓動 Elasticsearch。

然後./bin/elasticsearch-setup-passwords interactive 配置默認用戶的密碼:(有如下的交互),可以使用 auto 自動生成。

[elk@lgh elasticsearch-7.7.0]$ ./bin/elasticsearch-setup-passwords interactive
Enter password for the elasticsearch keystore : 
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]: 
Reenter password for [elastic]: 
Enter password for [apm_system]: 
Reenter password for [apm_system]: 
Enter password for [kibana]: 
Reenter password for [kibana]: 
Enter password for [logstash_system]: 
Reenter password for [logstash_system]: 
Enter password for [beats_system]: 
Reenter password for [beats_system]: 
Enter password for [remote_monitoring_user]: 
Reenter password for [remote_monitoring_user]: 
1qaz@WSXChanged password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]

然後可以登錄 http://192.168.110.130:9200 / 需要輸入密碼,輸入 elastic/passwd 即可登錄。

head 插件安裝

Head 官網:https://github.com/mobz/elasticsearch-head

Nodejs 下載:https://nodejs.org/zh-cn/download/

官方說明,Elasticsearch 7 有三種方式使用 head 插件,這裏我只試過兩種:

第一種:使用谷歌瀏覽器 head 插件,這個直接在谷歌瀏覽器上面安裝插件就可以使用了。

第二種:使用 head 服務(把 head 當做一個服務來使用),安裝如下:

#Running with built in server
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
open http://localhost:9100/

如果在如上的安裝過程中報錯,可以嘗試下這個命令再繼續安裝 npm install phantomjs-prebuilt@2.1.16 --ignore-scripts。

Kibana 的安裝介紹

下載地址:https://elasticsearch.cn/download/

也可以去官網下載。

解壓後修改 kibana.yml 文件:

[elk@lgh config]$ cat kibana.yml  | egrep -v "^$|#"
server.port: 5601
server.host: "0.0.0.0"
server.name: "my-kibana"
elasticsearch.hosts: ["http://192.168.110.130:9200","http://192.168.110.131:9200","http://192.168.110.132:9200"]
elasticsearch.preserveHost: true
kibana.index: ".kibana"
elasticsearch.username: "elastic"
elasticsearch.password: "password"   #或者使用keystore的保存的密碼"${ES_PWD}"

./bin/kibana 啓動。

訪問網址:http://192.168.110.130:5601/,並使用 elastic/password 登錄。

實例分析

一篇文章搞懂 Filebeat(ELK)》,該文章中有 Beats + Elasticsearch + Kibana 的實例。

《從 0 到 1 學會 Logstash 的玩法(ELK)》(https://www.cnblogs.com/zsql/p/13143445.html), 該文章中有 Beats + Logstash + Elasticsearch + Kibana 實例。

現在我們弄一個 Beats + 緩存 / 消息隊列 + Logstash + Elasticsearch + Kibana 的實例:

中間組件我們使用 Kafka,我們看下 Filebeat 把 Kafka 作爲 output 的官網:https://www.elastic.co/guide/en/beats/filebeat/7.7/kafka-output.html

這裏要注意 Kafka 的版本,我試過兩個都是極端的版本,坑了自己一把。假如你已經有 kafka 集羣了,我這裏安裝的是一個單機版本(1.1.1):

數據集我們採用 Apache 的日誌格式,下載地址:https://download.elastic.co/demos/logstash/gettingstarted/logstash-tutorial.log.gz

日誌格式如下:

[elk@lgh ~]$ tail -3 logstash-tutorial.log 
86.1.76.62 - - [04/Jan/2015:05:30:37 +0000] "GET /projects/xdotool/ HTTP/1.1" 200 12292 "http://www.haskell.org/haskellwiki/Xmonad/Frequently_asked_questions" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140205 Firefox/24.0 Iceweasel/24.3.0"
86.1.76.62 - - [04/Jan/2015:05:30:37 +0000] "GET /reset.css HTTP/1.1" 200 1015 "http://www.semicomplete.com/projects/xdotool/" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140205 Firefox/24.0 Iceweasel/24.3.0"
86.1.76.62 - - [04/Jan/2015:05:30:37 +0000] "GET /style2.css HTTP/1.1" 200 4877 "http://www.semicomplete.com/projects/xdotool/" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140205 Firefox/24.0 Iceweasel/24.3.0"

首先我們配置 Filebeat 的配置文件 filebeat.yml:

#=========================== Filebeat inputs =============================

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /data/elk/logstash-tutorial.log  #這裏使用的是apache的日誌格式
    #- c:\programdata\elasticsearch\logs\*

  # Exclude lines. A list of regular expressions to match. It drops the lines that are
  # matching any regular expression from the list.
  #exclude_lines: ['^DBG']

  # Include lines. A list of regular expressions to match. It exports the lines that are
  # matching any regular expression from the list.
  #include_lines: ['^ERR', '^WARN']

  # Exclude files. A list of regular expressions to match. Filebeat drops the files that
  # are matching any regular expression from the list. By default, no files are dropped.
  #exclude_files: ['.gz$']

  # Optional additional fields. These fields can be freely picked
  # to add additional information to the crawled log files for filtering
  #fields:
  #  level: debug
  #  review: 1

  ### Multiline options

  # Multiline can be used for log messages spanning multiple lines. This is common
  # for Java Stack Traces or C-Line Continuation

  # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
  #multiline.pattern: ^\[

  # Defines if the pattern set under pattern should be negated or not. Default is false.
  #multiline.negate: false

  # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
  # that was (not) matched before or after or as long as a pattern is not matched based on negate.
  # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
  #multiline.match: after
#================================ Outputs =====================================
output.kafka:
  hosts: ["192.168.110.130:9092"]   #配置kafka的broker
  topic: 'filebeat_test'   #配置topic 名字
  partition.round_robin:
    reachable_only: false
  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000

然後使用命令後臺啓動:

cd filebeat-7.7.0-linux-x86_64 && nohup ./filebeat -e &

接下來我們配置 Logstash 的配置文件:

cd logstash-7.7.0/ && mkidr conf.d
cd conf.d
vim apache.conf 
################apache.conf文件中填入如下內容##############################
input {
        kafka{
                bootstrap_servers ="192.168.110.130:9092"
                topics =["filebeat_test"]
                group_id ="test123"
                auto_offset_reset ="earliest"
        }
    }
filter {
json
        {
                source ="message"
        }
        grok {
        match ={ "message" ="%{COMBINEDAPACHELOG}"}
        remove_field ="message"
    }
}
output {
    stdout { codec => rubydebug }
    elasticsearch {
                    hosts =["192.168.110.130:9200","192.168.110.131:9200","10.18.126.224:9200","192.168.110.132:9200"]
                    index ="test_kakfa"
                    user ="elastic"
                    password ="${ES_PWD}"
                }
}

然後後臺啓動 Logstash 命令:

cd logstash-7.7.0/ && nohup ./bin/logstash -f conf.d/apache.conf &

然後我們查看 Elasticsearch 集羣查看該索引。

接下來我們登錄到 Kibana 查看該索引的分析。

作者:一寸 HUI

來源:https://www.cnblogs.com/zsql/p/13164414.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/QFjZqnbwJdUqm8EaFc9qrQ