1、ELK是什麼鬼?前端
ELK其實是三個工具的集合,Elasticsearch + Logstash + Kibana,這三個工具組合造成了一套實用、易用的監控架構,不少公司利用它來搭建可視化的海量日誌分析平臺。java
1. ElasticSearchlinux
ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。nginx
2. Logstashgit
Logstash是一個用於管理日誌和事件的工具,你能夠用它去收集日誌、轉換日誌、解析日誌並將他們做爲數據提供給其它模塊調用,例如搜索、存儲等。github
3. Kibanaweb
Kibana是一個優秀的前端日誌展現框架,它能夠很是詳細的將日誌轉化爲各類圖表,爲用戶提供強大的數據可視化支持。redis
2、ELK有何優點?數據庫
1. 強大的搜索功能,elasticsearch能夠以分佈式搜索的方式快速檢索,並且支持DSL的語法來進行搜索,簡單的說,就是經過相似配置的語言,快速篩選數據。vim
2. 完美的展現功能,能夠展現很是詳細的圖表信息,並且能夠定製展現內容,將數據可視化發揮的淋漓盡致。
3. 分佈式功能,可以解決大型集羣運維工做不少問題,包括監控、預警、日誌收集解析等。
3、ELK通常用來作啥?
ELK組件在海量日誌系統的運維中,可用於解決:
- 分佈式日誌數據集中式查詢和管理
- 系統監控,包含系統硬件和應用各個組件的監控
- 故障排查
- 安全信息和事件管理
- 報表功能
ELK組件在大數據運維繫統中,主要可解決的問題以下:
- 日誌查詢,問題排查,上線檢查
- 服務器監控,應用監控,錯誤報警,Bug管理
- 性能分析,用戶行爲分析,安全漏洞分析,時間管理
緣起:
在微服務開發過程當中,通常都會利用多臺服務器作分佈式部署,如何可以把分散在各個服務器中的日誌歸集起來作分析處理,是一個微服務服務須要考慮的一個因素。
搭建一個日誌系統
搭建一個日誌系統須要考慮一下一些因素:
利用什麼技術,是本身實現還利用現成的組件
日誌須要定義統一的格式
日誌須要擁有一個錨點來進行全局跟蹤
第一個問題,針對小公司來講,基本沒有本身的研發能力,絕對是選用第三方開源的組件了。ELK配置比較簡單,有現成的UI界面,容易檢索日誌信息,是首選。
第二個問題,利用log4j2定義好統一的日誌格式,利用logstash過濾日誌內容。
第三個問題,全局跟蹤的ID有幾種生產方式,一種是利用UUID或者生成隨機數,一種是利用數據庫來生成sequence number,還能夠經過自定義一個id生成服務來獲取。考慮到自身服務的須要,這裏選用生成隨機數來實現。
ELK工做原理:
從左邊看起,每一臺webserver上都會部署一個logstash-agent,它的做用是用相似tailf的方式監聽日誌文件,而後把新添加的日誌發送到redis隊列裏面,logstash-indexer負責從redis相應的隊列裏面取出日誌,對日誌進進行加工後輸出到elasticsearch中,elasticsearch會根據要求對日誌進行索引歸集,最後用戶能夠經過kibana來查看和分析日誌。
軟件包下載:
elasticsearch:
logstash:
wget https://download.elastic.co/logstash/logstash/logstash-2.2.2.tar.gz
kibana:
wget https://download.elastic.co/kibana/kibana/kibana-4.4.2-linux-x64.tar.gz
環境搭建:
注意:jdk可自行網上搜索安裝方法
注:因爲Logstash的運行依賴於Java環境, 而Logstash 1.5以上版本不低於java 1.7,所以推薦使用最新版本的Java。由於咱們只須要Java的運行環境,因此能夠只安裝JRE,不過這裏我依然使用JDK,請自行搜索安裝。
這次搭建須要使用的網絡源:
虛擬機可以訪問互聯網:
安裝Java環境
yum -y install java-1.8.0-openjdk*
安裝Elasticsearch
tar -xvf elasticsearch-2.2.1.tar.gz -C /usr/local/
ln -s /usr/local/elasticsearch-2.2.1/ /usr/local/elasticsearch
cd /usr/local/elasticsearc
安裝插件:
./bin/plugin install mobz/elasticsearch-head
插件安裝方法1:
1.elasticsearch/bin/plugin -install mobz/elasticsearch-head
2.運行es
3.打開http://localhost:9200/_plugin/head/
插件安裝方法2:
1.https://github.com/mobz/elasticsearch-head下載zip 解壓
2.創建elasticsearch-1.0.0\plugins\head\_site文件
3.將解壓後的elasticsearch-head-master文件夾下的文件copy到_site
4.運行es
5.打開http://localhost:9200/_plugin/head/
建立用戶和目錄(由於elasticsearch 2.0.0 以上版本不能用root用戶運行)
1 2 3 4 5 |
[root@localhost]# groupadd -g 1000 elasticsearch [root@localhost]# useradd -g 1000 -u 1000 elasticsearch [root@localhost]# sudo -u elasticsearch mkdir /tmp/elasticsearch [root@localhost]# ls /tmp/elasticsearch [root@localhost]# sudo -u elasticsearch mkdir /tmp/elasticsearch/{data,logs} |
mkdir /usr/local/elasticsearch/config/scripts
編輯配置文件vim config/elasticsearch.yml
加如如下四行(注意冒號後面有空格):
path.data: /tmp/elasticsearch/data
path.logs: /tmp/elasticsearch/logs
network.host: 192.168.100.10(服務器IP)
network.port: 9200
啓動服務:
sudo -u elastsearch /usr/local/elasticsearch/bin/elasticsearch
注意:若是正式應用須要在後臺運行
1 | sudo -u elastsearch /usr/local/elasticsearch/bin/elasticsearch -d |
注意:
能夠看到,它跟其餘的節點的傳輸端口爲9300,接受HTTP請求的端口爲9200。
# curl 192.168.100.10:9200
{
"name" : "Wilson Fisk",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.2.1",
"build_hash" : "d045fc29d1932bce18b2e65ab8b297fbf6cd41a1",
"build_timestamp" : "2016-03-09T09:38:54Z",
"build_snapshot" : false,
"lucene_version" : "5.4.1"
},
"tagline" : "You Know, for Search"
}
返回展現了配置的cluster_name和name,以及安裝的ES的版本等信息。
剛剛安裝的head插件,它是一個用瀏覽器跟ES集×××互的插件,能夠查看集羣狀態、集羣的doc內容、執行搜索和普通的Rest請求等。如今也可使用它打開http://192.168.253.140:9200/_plugin/head/頁面來查看ES集羣狀態:
上面的功能仍是不錯的!
【安裝Logstash---數據日誌存儲和傳輸】
其實它就是一個收集器而已,收集(input)和傳輸(output),咱們須要爲它指定Input和Output(固然Input和Output能夠爲多個)。能夠指定input的日誌和output到elasticsearch中
tar xvf logstash-2.2.2.tar.gz -C /usr/local/
ln -s /usr/local/logstash-2.2.2/ /usr/local/logstash
測試logstash
(1) 屏幕輸入輸出方式測試
/usr/local/logstash/bin/logstash -e 'input { stdin { } } output { stdout { } }'
咱們能夠看到,咱們輸入什麼內容logstash按照某種格式輸出,其中-e參數參數容許Logstash直接經過命令行接受設置。這點尤爲快速的幫助咱們反覆的測試配置是否正確而不用寫配置文件。使用CTRL-C命令能夠退出以前運行的Logstash。
使用-e參數在命令行中指定配置是很經常使用的方式
不過若是須要配置更多設置則須要很長的內容。這種狀況,咱們首先建立一個簡單的配置文件,而且指定logstash使用這個配置文件。例如:在logstash安裝目錄下建立
配置logstash
建立配置文件目錄: mkdir -p /usr/local/logstash/etc vim /usr/local/logstash/etc/hello_search.conf 輸入下面: |
# cat /usr/local/logstash/etc/hello_search.conf
input {
stdin {
type => "human"
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => "192.168.100.10:9200"
}
}
啓動: /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/hello_search.conf
(以頻幕上輸入的方式輸入,以rubydebug格式輸出到屏幕,而且傳遞到elasticsearch)
測試logstash日誌是否傳輸到了elasticsearch
經過如下接口:
curl 'http://192.168.253.140:9200/_search?pretty'
至此,你已經成功利用Elasticsearch和Logstash來收集日誌數據了。
【安裝kibana---展現數據】
注:如今kibanna能夠自帶了web服務,bin/kibana就能夠直接啓動了,建議不用nginx進行配合啓動了,使用自帶的web
安裝Kibana
下載kibana後,解壓到對應的目錄就完成kibana的安裝
解壓、軟鏈接
1 2 |
tar -xzvf kibana-4.4.2-linux-x64.tar.gz -C /usr/local/ ln -s /usr/local/kibana-4.4.2-linux-x64/ /usr/local/kibana |
啓動kibanna
1 | /usr/local/kibana-4.4.2-linux-x64/bin/kibana |
或者
1 | /usr/local/kibana/bin/kibana |
此時是沒有鏈接上elasticsearch
配置kibanna
vim /usr/local/kibana-4.4.2-linux-x64/config/kibana.yml
重啓
/usr/local/kibana/bin/kibana
web訪問:
監聽了5601做爲web端口
使用http://kibanaServerIP:5601訪問Kibana,登陸後,首先,配置一個索引,默認,Kibana的數據被指向Elasticsearch,使用默認的logstash-*的索引名稱,而且是基於時間的,點擊「Create」便可。
In order to use Kibana you must configure at least one index pattern. Index patterns are used to identify the Elasticsearch index to run search and analytics against. They are also used to configure fields.
爲了後續使用Kibana,須要配置至少一個Index名字或者Pattern,它用於在分析時肯定ES中的Index
補充:
[配置logstash做爲Indexer]
將logstash配置爲索引器,並將logstash的日誌數據存儲到Elasticsearch,本範例主要是索引本地系統日誌
cat /usr/local/logstash/etc/logstash-indexer.conf
input {
file {
type =>"syslog"
path => ["/var/log/messages", "/var/log/secure" ]
}
syslog {
type =>"syslog"
port =>"5544"
}
}
output {
stdout { codec=> rubydebug }
elasticsearch {hosts => "192.168.100.10:9200" }
}
執行:
/usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash-indexer.conf
執行:
echo "谷歌alphago和李世石圍棋大戰" >> /var/log/messages
每一個收集日誌的啓動,都是一個獨立的進程