本篇文章主要介紹ELK的一些框架組成,原理和實踐,採用的ELK本版爲7.7.0版本。css
ELK是Elasticsearch、Logstash、Kibana三大開源框架首字母大寫簡稱(可是後期出現的Filebeat(beats中的一種)能夠用來替代Logstash的數據收集功能,比較輕量級)。市面上也被成爲Elastic Stack。html
Filebeat是用於轉發和集中日誌數據的輕量級傳送工具。Filebeat監視您指定的日誌文件或位置,收集日誌事件,並將它們轉發到Elasticsearch或 Logstash進行索引。Filebeat的工做方式以下:啓動Filebeat時,它將啓動一個或多個輸入,這些輸入將在爲日誌數據指定的位置中查找。對於Filebeat所找到的每一個日誌,Filebeat都會啓動收集器。每一個收集器都讀取單個日誌以獲取新內容,並將新日誌數據發送到libbeat,libbeat將彙集事件,並將彙集的數據發送到爲Filebeat配置的輸出。前端
Logstash是免費且開放的服務器端數據處理管道,可以從多個來源採集數據,轉換數據,而後將數據發送到您最喜歡的「存儲庫」中。Logstash可以動態地採集、轉換和傳輸數據,不受格式或複雜度的影響。利用Grok從非結構化數據中派生出結構,從IP地址解碼出地理座標,匿名化或排除敏感字段,並簡化總體處理過程。java
Elasticsearch是Elastic Stack核心的分佈式搜索和分析引擎,是一個基於Lucene、分佈式、經過Restful方式進行交互的近實時搜索平臺框架。Elasticsearch爲全部類型的數據提供近乎實時的搜索和分析。不管您是結構化文本仍是非結構化文本,數字數據或地理空間數據,Elasticsearch都能以支持快速搜索的方式有效地對其進行存儲和索引。node
Kibana是一個針對Elasticsearch的開源分析及可視化平臺,用來搜索、查看交互存儲在Elasticsearch索引中的數據。使用Kibana,能夠經過各類圖表進行高級數據分析及展現。而且能夠爲Logstash和ElasticSearch提供的日誌分析友好的 Web 界面,能夠彙總、分析和搜索重要數據日誌。還可讓海量數據更容易理解。它操做簡單,基於瀏覽器的用戶界面能夠快速建立儀表板(Dashboard)實時顯示Elasticsearch查詢動態。linux
日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員能夠經過日誌瞭解服務器軟硬件信息、檢查配置過程當中的錯誤及錯誤發生的緣由。常常分析日誌能夠了解服務器的負荷,性能安全性,從而及時採起措施糾正錯誤。git
每每單臺機器的日誌咱們使用grep、awk等工具就能基本實現簡單分析,可是當日志被分散的儲存不一樣的設備上。若是你管理數十上百臺服務器,你還在使用依次登陸每臺機器的傳統方法查閱日誌。這樣是否是感受很繁瑣和效率低下。當務之急咱們使用集中化的日誌管理,例如:開源的Syslog,將全部服務器上的日誌收集彙總。集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,通常咱們使用grep、awk和wc等Linux命令能實現檢索和統計,可是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法不免有點力不從心。github
通常大型系統是一個分佈式部署的架構,不一樣的服務模塊部署在不一樣的服務器上,問題出現時,大部分狀況須要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日誌系統,能夠提升定位問題的效率。sql
Beats + Elasticsearch + Kibana模式shell
如上圖所示,該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各個組件的網址能夠在官網下載:https://www.elastic.co/cn/
或者在中文社區下載:https://elasticsearch.cn/down...
注:本次安裝都是採用壓縮包的方式安裝。
原理
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。
curl-L-Ohttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.0-linux-x86_64.tar.gz tar -xzvf filebeat-7.7.0-linux-x86_64.tar.gz
配置示例文件:filebeat.reference.yml(包含全部未過期的配置項)
配置文件:filebeat.yml
啓動命令:./filebeat -e
具體的原理、使用、實例見文:https://www.cnblogs.com/zsql/...
基本原理
Logstash分爲三個步驟:inputs(必須的)→ filters(可選的)→ outputs(必須的),inputs生成時間,filters對其事件進行過濾和處理,outputs輸出到輸出端或者決定其存儲在哪些組件裏。inputs和outputs支持編碼和解碼。
Logstash管道中的每一個input階段都在本身的線程中運行。將寫事件輸入到內存(默認)或磁盤上的中心隊列。每一個管道工做線程從該隊列中取出一批事件,經過配置的filter處理該批事件,而後經過output輸出到指定的組件存儲。管道處理數據量的大小和管道工做線程的數量是可配置的。
簡單安裝
下載地址1:https://www.elastic.co/cn/dow...
下載地址2:https://elasticsearch.cn/down...
這裏須要安裝JDK,我使用的是Elasticsearch 7.7.0自帶的JDK:
解壓即安裝:
tar -zxvf logstash-7.7.0.tar.gz
來個Logstash版本的HelloWorld:
./bin/logstash -e 'input { stdin { } } output { stdout {} }'
基本介紹
Elasticsearch(ES)是一個基於Lucene構建的開源、分佈式、RESTful接口的全文搜索引擎。Elasticsearch仍是一個分佈式文檔數據庫,其中每一個字段都可被索引,並且每一個字段的數據都可被搜索,ES可以橫向擴展至數以百計的服務器存儲以及處理PB級的數據。能夠在極短的時間內存儲、搜索和分析大量的數據。
基本概念有:Cluster 集羣、Node節點、Index索引、Document文檔、Shards & Replicas分片與副本等。
Elasticsearch的優點:
一、設置系統配置
ulimit #暫時修改,切換到該用戶es,ulimit -n 65535 /etc/security/limits.conf #永久修改 es - nofile 65535 ulimit -a #查看當前用戶的資源限制
二、禁用sawpping
方式一:
swapoff -a #臨時禁用全部的swap文件 vim /etc/fstab #註釋掉全部的swap相關的行,永久禁用
方式二:
cat /proc/sys/vm/swappiness #查看該值 sysctl vm.swappiness=1 #臨時修改該值爲1 vim /etc/sysctl.conf #修改文件 永久生效 vm.swappiness = 1 #若是有該值,則修改該值,若沒有,則追加該選項,sysctl -p生效命令
方式三:
配置elasticsearch.yml文件,添加以下配置: bootstrap.memory_lock: true GET _nodes?filter_path=**.mlockall #檢查如上配置是否成功
注意:若是試圖分配比可用內存更多的內存,mlockall可能會致使JVM或shell會話退出!
三、配置文件描述符
ulimit -n 65535 #臨時修改 vim /etc/security/limits.conf #永久修改 es soft nproc 65535 es hard nproc 65535
四、配置虛擬內存
sysctl -w vm.max_map_count=262144 #臨時修改該值 vim /etc/sysctl.conf #永久修改 vm.max_map_count=262144
五、配置線程數
ulimit -u 4096 #臨時修改 vim /etc/security/limits.conf #永久修改
Elasticsearch是須要其餘用戶啓動的,因此須要先建立一個新的用戶ELK:
groupadd elastic useradd elk -d /data/hd05/elk -g elastic echo '2edseoir@' | passwd elk --stdin
下載:https://elasticsearch.cn/down...
也能夠去官網下載wget:https://artifacts.elastic.co/...
解壓: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
經過變量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.p十二、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官網:https://github.com/mobz/elast...
Nodejs下載:https://nodejs.org/zh-cn/down...
官方說明,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。
下載地址:https://elasticsearch.cn/down...
也能夠去官網下載。
解壓後修改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登陸。
如今咱們弄一個Beats+緩存/消息隊列+ Logstash + Elasticsearch + Kibana的實例:
中間組件咱們使用Kafka,咱們看下Filebeat把Kafka做爲output的官網:https://www.elastic.co/guide/...
這裏要注意Kafka的版本,我試過兩個都是極端的版本,坑了本身一把。假如你已經有kafka集羣了,我這裏安裝的是一個單機版本(1.1.1):
數據集咱們採用Apache的日誌格式,下載地址:https://download.elastic.co/d...
日誌格式以下:
[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:programdataelasticsearchlogs* # 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查看該索引的分析。
原文連接:https://www.cnblogs.com/zsql/...