1、簡介java
ELK 由三部分組成elasticsearch、logstash、kibana,elasticsearch是一個近似實時的搜索平臺,它讓你之前所未有的速度處理大數據成爲可能。node
Elasticsearch所涉及到的每一項技術都不是創新或者革命性的,全文搜索,分析系統以及分佈式數據庫這些早就已經存在了。它的革命性在於將這些獨立且有用的技術整合成一個一體化的、實時的應用。Elasticsearch是面向文檔(document oriented)的,這意味着它能夠存儲整個對象或文檔(document)。然而它不只僅是存儲,還會索引(index)每一個文檔的內容使之能夠被搜索。在Elasticsearch中,你能夠對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。這種理解數據的方式與以往徹底不一樣,這也是Elasticsearch可以執行復雜的全文搜索的緣由之一。linux
應用程序的日誌大部分都是輸出在服務器的日誌文件中,這些日誌大多數都是開發人員來看,而後開發卻沒有登錄服務器的權限,若是開發人員須要查看日誌就須要到服務器來拿日誌,而後交給開發;試想下,一個公司有10個開發,一個開發天天找運維拿一第二天志,對運維人員來講就是一個不小的工做量,這樣大大影響了運維的工做效率,部署ELKstack以後,開發任意就能夠直接登錄到Kibana中進行日誌的查看,就不須要經過運維查看日誌,這樣就減輕了運維的工做。nginx
日誌種類多,且分散在不一樣的位置難以查找:如LAMP/LNMP網站出現訪問故障,這個時候可能就須要經過查詢日誌來進行分析故障緣由,若是須要查看apache的錯誤日誌,就須要登錄到Apache服務器查看,若是查看數據庫錯誤日誌就須要登錄到數據庫查詢,試想一下,若是是一個集羣環境幾十臺主機呢?這時若是部署了ELKstack就能夠登錄到Kibana頁面進行查看日誌,查看不一樣類型的日誌只須要電動鼠標切換一下索引便可。web
Logstash:日誌收集工具,能夠從本地磁盤,網絡服務(本身監聽端口,接受用戶日誌),消息隊列中收集各類各樣的日誌,而後進行過濾分析,並將日誌輸出到Elasticsearch中。數據庫
Elasticsearch:日誌分佈式存儲/搜索工具,原生支持集羣功能,能夠將指定時間的日誌生成一個索引,加快日誌查詢和訪問。apache
Kibana:可視化日誌Web展現工具,對Elasticsearch中存儲的日誌進行展現,還能夠生成炫麗的儀表盤。json
2、安裝部署(由於我是測試環境,就將ElasticSearch+Logstash+ Kibana裝在一臺虛擬機上面了)bootstrap
安裝jdkvim
rpm -ivh jdk-8u92-linux-x64.rpm
vi /etc/profile
JAVA_HOME=/usr/java/jdk1.8.0_92/
source /etc/profile
echo $JAVA_HOME
/usr/java/jdk1.8.0_92/
java -version
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
安裝elasticsearch
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
添加yum文件
echo "
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1" >> /etc/yum.repos.d/elasticsearch.repo
yum install elasticsearch -y
mkdir /data/elk/{data,logs}
Type Description Location
home elasticsearch安裝的目錄 {extract.path}
bin elasticsearch二進制腳本目錄 {extract.path}/bin
conf 配置文件目錄 {extract.path}/config
data 數據目錄 {extract.path}/data
logs 日誌目錄 {extract.path}/logs
plugins 插件目錄 {extract.path}/plugin
配置說明:
vi /etc/elasticsearch/elasticsearch.yml
cluster.name: es
path.data: /data/elk/data
path.logs: /data/elk/logs
bootstrap.mlockall: true
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.2.215", "host2"]
啓動:
/etc/init.d/elasticsearch start
elasticsearch的config文件夾裏面有兩個配置文件:elasticsearch.yml和logging.yml,
第一個是es的基本配置文件,第二個是日誌配置文件,es也是使用log4j來記錄日誌的,因此logging.yml裏的設置按普通log4j配置文件來設置就好了。下面主要講解下elasticsearch.yml這個文件中可配置的東西。
cluster.name:elasticsearch
配置es的集羣名稱,默認是elasticsearch,es會自動發如今同一網段下的es,若是在同一網段下有多個集羣,就能夠用這個屬性來區分不一樣的集羣。
node.name:」FranzKafka」
節點名,默認隨機指定一個name列表中名字,該列表在es的jar包中config文件夾裏name.txt文件中,其中有不少做者添加的有趣名字。
node.master:true
指定該節點是否有資格被選舉成爲node,默認是true,es是默認集羣中的第一臺機器爲master,若是這臺機掛了就會從新選舉master。
node.data:true
指定該節點是否存儲索引數據,默認爲true。
index.number_of_shards:5
設置默認索引分片個數,默認爲5片。
index.number_of_replicas:1
設置默認索引副本個數,默認爲1個副本。
path.conf:/path/to/conf
設置配置文件的存儲路徑,默認是es根目錄下的config文件夾。
path.data:/path/to/data
設置索引數據的存儲路徑,默認是es根目錄下的data文件夾,能夠設置多個存儲路徑,用逗號隔開,例:
path.data:/path/to/data1,/path/to/data2
path.work:/path/to/work
設置臨時文件的存儲路徑,默認是es根目錄下的work文件夾。
path.logs:/path/to/logs
設置日誌文件的存儲路徑,默認是es根目錄下的logs文件夾
path.plugins:/path/to/plugins
設置插件的存放路徑,默認是es根目錄下的plugins文件夾
bootstrap.mlockall:true
設置爲true來鎖住內存。由於當jvm開始swapping時es的效率會下降,因此要保證它不swap,能夠把ES_MIN_MEM和ES_MAX_MEM兩個環境變量設置成同一個值,而且保證機器有足夠的內存分配給es。同時也要容許elasticsearch的進程能夠鎖住內存,linux下能夠經過`ulimit-lunlimited`命令。
network.bind_host:192.168.0.1
設置綁定的ip地址,能夠是ipv4或ipv6的,默認爲0.0.0.0。network.publish_host:192.168.0.1
設置其它節點和該節點交互的ip地址,若是不設置它會自動判斷,值必須是個真實的ip地址。
network.host:192.168.0.1
這個參數是用來同時設置bind_host和publish_host上面兩個參數。
transport.tcp.port:9300
設置節點間交互的tcp端口,默認是9300。
transport.tcp.compress:true
設置是否壓縮tcp傳輸時的數據,默認爲false,不壓縮。
http.port:9200
設置對外服務的http端口,默認爲9200。
http.max_content_length:100mb
設置內容的最大容量,默認100mb
http.enabled:false
是否使用http協議對外提供服務,默認爲true,開啓。
gateway.type:local
gateway的類型,默認爲local即爲本地文件系統,能夠設置爲本地文件系統,分佈式文件系統,hadoop的HDFS,和amazon的s3服務器,其它文件系統的設置方法下次再詳細說。
gateway.recover_after_nodes:1
設置集羣中N個節點啓動時進行數據恢復,默認爲1。
gateway.recover_after_time:5m
設置初始化數據恢復進程的超時時間,默認是5分鐘。
gateway.expected_nodes:2
設置這個集羣中節點的數量,默認爲2,一旦這N個節點啓動,就會當即進行數據恢復。
cluster.routing.allocation.node_initial_primaries_recoveries:4
初始化數據恢復時,併發恢復線程的個數,默認爲4。
cluster.routing.allocation.node_concurrent_recoveries:2
添加刪除節點或負載均衡時併發恢復線程的個數,默認爲4。
indices.recovery.max_size_per_sec:0
設置數據恢復時限制的帶寬,如入100mb,默認爲0,即無限制。
indices.recovery.concurrent_streams:5
設置這個參數來限制從其它分片恢復數據時最大同時打開併發流的個數,默認爲5。
discovery.zen.minimum_master_nodes:1
設置這個參數來保證集羣中的節點能夠知道其它N個有master資格的節點。默認爲1,對於大的集羣來講,能夠設置大一點的值(2-4)
discovery.zen.ping.timeout:3s
設置集羣中自動發現其它節點時ping鏈接超時時間,默認爲3秒,對於比較差的網絡環境能夠高點的值來防止自動發現時出錯。
discovery.zen.ping.multicast.enabled:false
設置是否打開多播發現節點,默認是true。
discovery.zen.ping.unicast.hosts:[「host1″,」host2:port」,」host3[portX-portY]」]
設置集羣中master節點的初始列表,能夠經過這些節點來自動發現新加入集羣的節點
安裝head插件(集羣管理插件)
cd /usr/share/elasticsearch/bin/
./plugin install mobz/elasticsearch-head
ll /usr/share/elasticsearch/plugins/head
http://192.168.2.215:9200/_plugin/head/
安裝kopf插件(集羣資源查看和查詢插件)
/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
http://192.168.2.215:9200/_plugin/kopf
啓動elasticearch
/etc/init.d/elasticsearch start
安裝kibana
kibana本質上是elasticsearch web客戶端,是一個分析和可視化elasticsearch平臺,可經過kibana搜索、查看和與存儲在elasticsearch的索引進行交互。能夠很方便的執行先進的數據分析和可視化多種格式的數據,如圖表、表格、地圖等。
Discover頁面:交互式的瀏覽數據。能夠訪問所匹配的索引模式的每一個索引的每一個文檔。能夠提交搜索查詢,過濾搜索結果和查看文檔數據。還能夠搜索查詢匹配的文檔數據和字段值的統計數據。還能夠選定時間以及刷新頻率
https://download.elastic.co/kibana/kibana/kibana-4.5.1-linux-x64.tar.gz
tar zxvf kibana-4.5.1-linux-x64.tar.gz
mv kibana-4.5.1-linux-x64 /usr/local/
vi /etc/rc.local
/usr/local/kibana-4.5.1-linux-x64/bin/kibana > /var/log/kibana.log 2>&1 &
vi /usr/local/kibana-4.5.1-linux-x64/config/kibana.yml
server.port: 5601
server.host: "192.168.2.215"
elasticsearch.url: "http://192.168.2.215:9200"
將nginx日誌轉換成json
vim /usr/local/nginx/conf/nginx.conf
log_format access1 '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
access_log /var/log/nginx/access.log access1;
從新載入nginx
/usr/local/nginx/sbin/nginx -s reload
安裝logstash
在logstash中,包括了三個階段:
輸入input --> 處理filter(不是必須的) --> 輸出output
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
echo "
[logstash-2.1]
name=Logstash repository for 2.1.x packages
baseurl=http://packages.elastic.co/logstash/2.1/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1" >> /etc/yum.repos.d/logstash.repo
yum install logstash -y
經過配置驗證Logstash的輸入和輸出
vim /etc/logstash/conf.d/stdout.conf
input {
stdin {}
}
output {
stdout {
codec => "rubydebug"
}
}
vim /etc/logstash/conf.d/logstash.conf
input {
stdin {}
}
input {
stdin {}
}
output {
elasticsearch {
hosts => ["192.168.2.215:9200"]
index => "test"
}
}
http://192.168.2.215:9200/_plugin/head/
vim /etc/logstash/conf.d/logstash.conf
output {
elasticsearch {
hosts => ["192.168.2.215:9200"]
index => "test"
}
input {
file {
type => "messagelog"
path => "/var/log/messages"
start_position => "beginning"
}
}
output {
file {
path => "/tmp/123.txt"
}
elasticsearch {
hosts => ["192.168.2.215:9200"]
index => "system-messages-%{+yyyy.MM.dd}"
}
}
檢查配置文件語法
/etc/init.d/logstash configtest
vim /etc/init.d/logstash
LS_USER=root
LS_GROUP=root
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf &