ELKR分佈式搭建nginx日誌分析系統html
一.名詞介紹前端
一、什麼是elkjava
ELK 其實並非一款軟件,而是一整套解決方案,是三個軟件產品的首字母縮寫,Elasticsearch,Logstash 和 Kibana。這三款軟件都是開源軟件,一般是配合使用。nginx
二、Elasticsearchredis
2.1.Elasticsearch介紹數據庫
Elasticsearch 是一個實時的分佈式搜索和分析引擎,它能夠用於全文搜索,結構化搜索以及分析。它是一個創建在全文搜索引擎 Apache Lucene 基礎上的搜索引擎,使用 Java 語言編寫。apache
2.2Elasticsearch特色ubuntu
(1)實時分析vim
(2)分佈式實時文件存儲,並將每個字段都編入索引瀏覽器
(3)文檔導向,全部的對象所有是文檔
(4)高可用性,易擴展,支持集羣(Cluster)、分片和複製(Shards和 Replicas)
(5)接口友好,支持 JSON
三、Logstash
3.1Logstash介紹
Logstash 是一個具備實時渠道能力的數據收集引擎。
3.2Logstash特色
(1)幾乎能夠訪問任何數據
(2)能夠和多種外部應用結合
(3)支持彈性擴展
3.3Logstash它組件
(1)Shipper-發送日誌數據
(2)Broker-收集數據,缺省內置 Redis
(3)Indexer-數據寫入
四、Kibana
4.1Kibana介紹
Kibana 是一款基於 Apache 開源協議,使用JavaScript 語言編寫,爲 Elasticsearch 提供分析和可視化的 Web 平臺。它能夠在 Elasticsearch 的索引中查找,交互數據,並生成各類維度的表圖。
二.環境介紹
環境介紹:Ubuntu 14.04
elasticsearch-5.2.2.deb kibana-5.2.2-amd64.deb logstash_2.1.3-1_all.deb java1.8 redis2.8.4
2.1ELK 組件的做用
Elasticsearch 抓取日誌分析
Logstash 日誌格式處理
Kibana 前端數據可視化展現
ELK(R) = Elasticsearch + Logstash + Kibana (+ Redis) 是一套完整的工業級日誌分析工具。
拓撲圖:
三.ELK安裝
要安裝 ELK(R),首先須要檢查自身系統環境:
檢查當前系統的版本。
root@6ae60c614623:/home/hao# cat /etc/issue
Ubuntu 14.04.5 LTS \n \l
其次,Elasticsearch 還依賴 Java 的環境,所以還須要確保 Java 環境:
root@6ae60c614623:/home/hao# java -version java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
此外,正如前面所說,Redis 自身並不屬於 ELK 技術棧,而是 Logstash 具有的一個插件,屬於 Logstash 的依賴。因此咱們還要檢查 Redis 環境。
root@6ae60c614623:/home/hao# redis-server -v Redis server v=2.8.4 sha=00000000:0 malloc=jemalloc-3.4.1 bits=64 build=a44a05d76f06a5d9 若是沒有啓動,則能夠 root@6ae60c614623:/home/hao# netstat -antulp | grep 6379 root@6ae60c614623:/home/hao# service redis-server start Starting redis-server: redis-server.
關閉 redis,最好的辦法就是直接殺掉 redis 的所在進程:
root@6ae60c614623:/home/hao# ps -u root -o pid,rss,command | grep redis 363 648 grep --color=auto redisThen kill -9 the_pid
可使用wget命令下載,這些包能夠官網去下載,可是很是的慢,dpkg -i安裝,就能夠不用管下面的安裝方法了
#下載 wget http://labfile.oss.aliyuncs.com/courses/562/elasticsearch-5.2.2.deb wget http://labfile.oss.aliyuncs.com/courses/562/kibana-5.2.2-amd64.deb wget http://labfile.oss.aliyuncs.com/courses/562/logstash_2.1.3-1_all.deb #安裝 dpkg -i elasticsearch-5.2.2.deb dpkg -i kibana-5.2.2-amd64.deb dpkg -i logstash_2.1.3-1_all.deb
1.安裝 Elasticsearch
不管是 ELK 中的哪一個部分,他們都還在快速迭代當中,因此咱們要竟可能的選擇最新的版本。
安裝有不少方式讓咱們選擇,好比自行下載源碼安裝,好比向軟件包源中添加軟件源使用 apt-get 來安裝。
不管如何,咱們都推薦使用 apt-get 進行安裝,由於這種方式的安裝便於管理和維護。
首先咱們須要添加 Key:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
而後添加官方的安裝源:
echo "deb https://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
root@6ae60c614623:/home/hao# sudo apt-get update Ign http://mirrors.aliyuncs.com trusty InRelease Get:1 http://mirrors.aliyuncs.com trusty-updates InRelease [65.9 kB] Get:2 http://mirrors.aliyuncs.com trusty-security InRelease [65.9 kB] Hit http://mirrors.aliyuncs.com trusty Release.gpg Hit http://mirrors.aliyuncs.com trusty Release Get:3 http://mirrors.aliyuncs.com trusty-updates/main Sources [496 kB] Get:4 http://mirrors.aliyuncs.com trusty-updates/restricted Sources [6470 B] Get:5 http://mirrors.aliyuncs.com trusty-updates/universe Sources [235 kB] Get:6 http://mirrors.aliyuncs.com trusty-updates/main amd64 Packages [1249 kB] Get:7 https://packages.elastic.co stable InRelease Ign https://packages.elastic.co stable InRelease Get:8 http://mirrors.aliyuncs.com trusty-updates/restricted amd64 Packages [21.2 kB] Get:9 http://mirrors.aliyuncs.com trusty-updates/universe amd64 Packages [541 kB] Get:10 https://packages.elastic.co stable Release Get:11 http://mirrors.aliyuncs.com trusty-security/main Sources [176 kB] Get:12 http://mirrors.aliyuncs.com trusty-security/restricted Sources [5068 B] Get:13 http://mirrors.aliyuncs.com trusty-security/universe Sources [72.1 kB] Get:14 https://packages.elastic.co stable/main amd64 Packages Get:15 http://mirrors.aliyuncs.com trusty-security/main amd64 Packages [799 kB] Get:16 http://mirrors.aliyuncs.com trusty-security/restricted amd64 Packages [17.9 kB] Get:17 http://mirrors.aliyuncs.com trusty-security/universe amd64 Packages [228 kB] Hit http://mirrors.aliyuncs.com trusty/main Sources Hit http://mirrors.aliyuncs.com trusty/restricted Sources Hit http://mirrors.aliyuncs.com trusty/universe Sources Hit http://mirrors.aliyuncs.com trusty/multiverse Sources Hit http://mirrors.aliyuncs.com trusty/main amd64 Packages Hit http://mirrors.aliyuncs.com trusty/restricted amd64 Packages Hit http://mirrors.aliyuncs.com trusty/universe amd64 Packages Hit http://mirrors.aliyuncs.com trusty/multiverse amd64 Packages Fetched 3985 kB in 15s (265 kB/s) Reading package lists... Done W: Size of file /var/lib/apt/lists/mirrors.aliyuncs.com_ubuntu_dists_trusty-updates_restricted_binary-amd64_Packages.gz is not what the server reported 21216 23469 W: Size of file /var/lib/apt/lists/mirrors.aliyuncs.com_ubuntu_dists_trusty-security_restricted_binary-amd64_Packages.gz is not what the server reported 17859 20228
接下來就能夠開始安裝了:
sudo apt-get install elasticsearch
安裝完成後,咱們就能夠運行 Elasticsearch 服務了:
sudo service elasticsearch start
2.安裝 logstash
echo "deb https://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
一樣的方法:
sudo apt-get update
安裝:
sudo apt-get install logstash
運行服務:
sudo service logstash start
3.安裝 Kibana
同理,在 /etc/apt/sources.list 中添加 Kibana 的安裝源:
echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list
更新:
sudo apt-get update
安裝:
sud apt-get install kibana
運行服務:
sudo service kibana start
報錯:
root@6ae60c614623:/home/hao# sudo service kibana start
kibana started
root@6ae60c614623:/home/hao# sudo service logstash start
/etc/init.d/logstash: 68: ulimit: error setting limit (Operation not permitted)
logstash started.
root@6ae60c614623:/home/hao# sudo service elasticsearch start
* Starting Elasticsearch Server /etc/init.d/elasticsearch: line 139: ulimit: open files: cannot modify limit: Operation not permitted
sysctl: setting key "vm.max_map_count": Read-only file system
在啓動Logstash 和 Elasticsearch 的時候,有這樣幾個警告:
Elasticsearch,『ulimit和只讀文件系統錯誤』
Logstash,『ulimit 錯誤』
第一步:解決 Elasticsearch:
sudo vim /etc/init.d/elasticsearch
在 vim 中使用 :set nu 來開啓行號,註釋掉 138行至 148行:
其實只須要註釋掉報錯的部分就行了,可能版本有些不一樣,因此行號不必定同樣,主要看註釋掉的內容
重啓服務:
sudo service elasticsearch stop
sudo service elasticsearch start
第二步:解決 Logstash:
同理,註釋掉 /etc/init.d/logstash 中 68 行 和 69 行的內容:
並重啓服務:
sudo service logstash stop
sudo service logstash start
這時候訪問 localhost:5601 就可以看到 Kibana 已經在運行,但如今還不能正式使用:
四.部署日誌
既然咱們要構建日誌分析系統,日誌是必不可少的,咱們所熟知的提供 Web 服務的工具,有 apache 和 nginx。咱們這裏以 nginx 爲例來部署產生日誌的環境。
首先咱們須要安裝 nginx 環境,一樣只須要使用 apt-get 便可。
sudo service nginx start
咱們須要配置 nginx 來得到用戶訪問的日誌:
而nginx 的配置文件位於:
vi /etc/nginx/sites-available/default
下面修改將nginx 的配置添加:
access_log /home/hao/Code/elk/access.log;
注意, 若是這個路徑不存在,Nginx 服務會啓動失敗,這是權限緣由形成的,最好的解決方法就是:root@6ae60c614623:/etc/nginx/sites-available# mkdir -p /home/hao/Code/elk/
root@6ae60c614623:/etc/nginx/sites-available# touch /home/hao/Code/elk/access.log
這時候重啓 nginx 服務:
sudo service nginx stop
sudo service nginx start
而後在瀏覽器中訪問:
http://localhost/
這時候咱們能夠看到剛纔配置的 nginx 日誌有新紀錄了。每次訪問這裏就會多一條記錄出來
# 檢查服務狀態
sudo service redis-server status sudo service elasticsearch status sudo service logstash status sudo service kibana status
五.logstash和elasticsearch配置
Logstash 配置基礎
要確保每一個服務都開啓狀態
Logstash 是打通日誌文件和 Elasticsearch 之間的一個樞紐。和各類服務同樣,Logstash 也有着本身的一套配置規則。
Logstash 的配置主要分爲三大部分:input, filter, output。
Logstash 的主要命令都安裝在了 /opt/logstash/bin 目錄下,在這個目錄下中,咱們先執行:
sudo ./logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
Logstash 的 -e 參數爲當即執行的意思
這時,終端會等待輸入,咱們能夠簡單的輸入 Hello Logstash! 這時會看到有以下輸出:
這說明 Logstash 已經順利工做了。
這裏可能等待的比較久,但願你們可以耐心一點,使用 ctrl+c 關閉當前 Logstash 執行的配置。
配置語法
咱們先來觀察剛纔命令中的字符串:
'input{stdin{}}output{stdout{codec=>rubydebug}}'
將其格式化後:
input {
stdin {}
}
output {
stdout {
codec => rubydebug
}
}
stdin {} 就是從標準輸入
stdout {} 就是從標準輸出
在這個字符串中,其實定義了 Logstash 的兩個行爲input和output。
在 input 中,咱們定義了一個標準輸入,因爲什麼都沒有,因此 Logstash 會從終端的標準輸入中讀取字符串,這也是爲何剛纔在輸入完命令後會出現等待輸入的狀況。
在 output 中,咱們定義了一個標準輸出,也就是說 Logstash 在處理完後會將結果從標準輸出(終端)中輸出,而 codec 字段,則說明了輸出會遵循什麼樣的格式,這裏定義的 codec 爲 rubydebug,因此咱們剛纔看到了一套標準的輸出格式。
有了對 Logstash 配置語法的基本認識,咱們能夠開始配置 從 Log 到 Logstash 到 Elasticsearch 的配置文件了。
配置 Log->Logstash->Elasticsearch
因爲 Logstash 的配置很長,因此咱們不太可能在一行命令中吧整個配置寫好,因此咱們先在 /etc/logstash/conf.d/logstash-shipper.conf 建立 Logstash 的配置文件:
咱們如今要將日誌文件做爲輸入,將日誌分析系統elasticsearch做爲輸出
input { stdin {} file { path => "/home/hao/Code/elk/access.log" start_position => beginning codec => multiline { 'negate' => true 'pattern' => '^\d' 'what' => 'previous' } } } output { stdout { codec => rubydebug } elasticsearch { hosts=>["localhost:9200"] index=>"logstash-%{+YYYY.MM.dd}" } }
在這份配置中,咱們加入了文件輸入的配置,加入了elaticsearch分析系統的輸入。
咱們將 input 定義加入 file (文件)輸入,並設置 start_position 從第一行開始,保證可以導入舊數據。
輸出,此種舉動一方面能夠方便咱們往後進行調試,另外一方面能夠將其做爲 Logstash 的日誌進行輸出。
而 elasticsearch 則給出了向 elasticsearch 輸入數據的申明。
配置完成後,咱們可使用 -t 參數來測試配置腳本是否配置正確:
/opt/logstash/bin/logstash -t -f /etc/logstash/conf.d/logstash-shipper.conf
可是一旦咱們 ctrl+c 便會中止執行,Logstash 不會再向 elasticsearch 傳送數據。
這時,咱們須要將其掛在後臺執行:
nohup /opt/logstash/bin/logstash -t -f /etc/logstash/conf.d/logstash-shipper.conf &
六.Kibana 可視化工具
咱們成功的將日誌數據寫入了 Elasticsearch,配置Kibana 使得咱們可以在前端頁面上查看並分析這些數據。
建立 Kibana 索引模式
咱們已經將 Logstash 進程跑在了後臺,如今咱們打開瀏覽器,訪問 localhost:5601 便能看到 Kibana 的界面和以往有所不一樣,Kibana 提示咱們能夠建立索引模式,這裏咱們不作過多幹涉,直接以時間戳建立索引模式:
看到 Kibana 爲咱們建立了 18 個字段(Fields)
咱們點擊頂部的 Discover ,便能來到 Kibana 的全局搜索界面,並可以看到在選定的時段內有多少記錄被寫入 Elasticsearch:
在Kibana 中若是要進行更加精確的查詢,則須要使用 Lucene。
例如,咱們要在某個字段中搜索某個字符串是否存在。首先咱們在終端中構造數據,在 一個 sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-shipper.conf 進程下,依次輸入 hello world、how do you do、what's wrong with you,chenhao。
這時候 Logstash 會輸出四條記錄:
下面咱們準備搜索在全部的記錄中,出現單詞 you 的記錄。
這時咱們能夠輸入:message: *you*。這裏的 message:是指明要搜索的字段,you是要搜索的字符,* 是通配符。
這時咱們能夠看到,剛纔插入的 what's worng with you 和 how do you do 這兩個知足條件的結果均已被高亮在了下方:
咱們搞定了 Kibana 的可視化部分。
將啓用 Redis 做爲緩存,搭建的分佈式 ELK+Redis 日誌環境
七.用redis部署分佈式ELK
署環境簡化爲了 nginx Log->Logstash->Elasticsearch->Kibana
5.1 Logstash Redis 插件及其配置
Redis 自己並不屬於 ELK 技術棧裏的一份子,而是做爲一個插件存在於 ELK 技術棧中。Redis 提供了一個很好的緩衝區,它可以很好的幫助咱們在主節點上屏蔽掉多個從節點之間不一樣日誌文件的差別,負責管理日誌端(從節點)的人能夠專一於向 Redis 裏生產數據,而負責數據分析聚合端的人則能夠專一於從 Redis 內消費數據,達到分層目的。
幸運的是 Redis 插件在最新版的 Logstash 中已經被集成,咱們只須要簡單的配置 Logstash 的相關文件便可。
首先咱們要配置具有日誌節點的 Logstash Shipper 的配置文件:
input { stdin { } file { path => "/home/hao/Code/elk/access.log" start_position => beginning codec => multiline { 'negate' => true 'pattern' => '^\d' 'what' => 'previous' } } } output { stdout { codec => rubydebug } redis { host => "localhost" data_type => "list" key => "logstash" } }
這裏配置了 output 的相關邏輯,將 output 指定到 redis 中,輸出的數據類型爲 list, redis 數據庫中的 key 爲 logstash。
3.2 配置Logstash Indexer
新建一個配置文件,它的輸入是redis數據庫,輸出是elasticsearch分析系統
而後咱們再配置 Logstash Indexer:
input { redis { host => "localhost" type => "redis" data_type => "list" key => "logstash" } } output { stdout { codec => rubydebug } elasticsearch { hosts=>["localhost:9200"] index=>"logstash-%{+YYYY.MM.dd}" } }
當 Shipper 產生新的數據時候(輸入hello chenhao),能夠看到 Indexer 也會產生新的數據:
sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-shipper.conf
sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-indexer.conf
當這兩個配置文件運行在不一樣服務器上時,便能作到真正的分佈式了,惟一須要修改的地方就是 redis 的 host 字段值,其中 Logstash Shipper 中的地址應該填寫 Logstash Indexer 所在地址,而 Logstash Indexer 中的 redis host 字段不須要修改,由於 redis 和 Loststash Indexer 運行在同一臺機器上。
八.總結
收集nginx日誌,集中展現。
很多人對 ELK 的第一印象,容易以爲它這個工具組合彷佛挺難上手的,錯!只需動手試試就知道啦!
目標分解:
1)熟悉 logstash 的安裝和基本操做
2)熟悉 elasticsearch 的安裝和基本操做,而後結合 logstash 使用
3)熟悉 kibana 的安裝和基本操做,而後結合 elasticsearch 使用
Elasticsearch 是整個日誌分析系統的核心,它負責對日誌數據進行分析、索引等重要工做;Logstash 則主要用於對日誌數據進行初步的過濾和篩選,例如,Logstash 能夠將擁有日誌數據的從節點(Slave Node)服務器內的日誌數據發送到 Elasticsearch 的主服務器。
Kibana 則是爲了讓 Elasticsearch 更好的與用戶進行交互而設計的一個 Web 前端工具,具有強大的數據可視化功能。Redis 自己並不屬於 ELK 技術棧裏的一份子,而是做爲一個插件存在於 ELK 技術棧中。
Redis 提供了一個很好的緩衝區,它可以很好的幫助咱們在主節點上屏蔽掉多個從節點之間不一樣日誌文件的差別,負責管理日誌端(從節點)的人能夠專一於向 Redis 裏生產數據,而負責數據分析聚合端的人則能夠專一於從 Redis 內消費數據,達到分層目的。
九.報錯解析
1.Kibana Unable to connect to Elasticsearch
如果此處顯示的是警告沒有看到上圖所示的畫面的話,注意看下方警告中訪問的 elasticsearch 的地址與端口是否正確,由於 elasticsearch 默認是綁定在本地 localhost 端口上,因此地址應該是 localhost:9200 或者是 127.0.0.1。若不是能夠修改一下 /etc/kibana/kibana.yml 中 elasticsearch 對應的地址與端口,而後重啓試試。
2.max virtual memory areas vm.max_map_count[65530]is too low
vi /etc/security/limits.conf
添加以下內容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
vi /etc/sysctl.conf #添加一條
vm.max_map_count=655360
sysctl -p #執行
3. logstash Configuration Contains a Syntax Error
logstash 語法錯誤,這個問題通常各類各樣的。主要是logstash配置文件不對致使的。
解決方法:
在啓動logstash前,先檢查下logstash配置文件是否有問題,可經過下面命令檢測:
/opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/
後面指定你本身的配置文件。
十.參考文檔
Logstash Redis 配置參考
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-redis.html
Kibana 用戶指南
https://www.elastic.co/guide/en/kibana/current/index.html
配置 Logstash
https://www.elastic.co/guide/en/logstash/current/configuration.html