主要參考原文地址:http://www.ywnds.com/?p=9776
ELK Stack是軟件集合Elasticsearch、Logstash躁锁、Kibana的簡(jiǎn)稱(chēng)咽瓷,由這三個(gè)軟件及其相關(guān)的組件可以打造大規(guī)模日志實(shí)時(shí)處理系統(tǒng)召烂。
其中串塑,Elasticsearch 是一個(gè)基于 Lucene 的沼琉、支持全文索引的分布式存儲(chǔ)和索引引擎,主要負(fù)責(zé)將日志索引并存儲(chǔ)起來(lái)桩匪,方便業(yè)務(wù)方檢索查詢(xún)打瘪。
Logstash是一個(gè)日志收集、過(guò)濾傻昙、轉(zhuǎn)發(fā)的中間件闺骚,主要負(fù)責(zé)將各條業(yè)務(wù)線(xiàn)的各類(lèi)日志統(tǒng)一收集、過(guò)濾后妆档,轉(zhuǎn)發(fā)給 Elasticsearch 進(jìn)行下一步處理僻爽。
Kibana是一個(gè)可視化工具,主要負(fù)責(zé)查詢(xún) Elasticsearch 的數(shù)據(jù)并以可視化的方式展現(xiàn)給業(yè)務(wù)方贾惦,比如各類(lèi)餅圖进泼、直方圖、區(qū)域圖等纤虽。
所謂“大規(guī)模”绞惦,指的是 ELK Stack 組成的系統(tǒng)以一種水平擴(kuò)展的方式支持每天收集逼纸、過(guò)濾、索引和存儲(chǔ) TB 規(guī)模以上的各類(lèi)日志济蝉。
通常杰刽,各類(lèi)文本形式的日志都在處理范圍,包括但不限于 Web 訪(fǎng)問(wèn)日志王滤,如 Nginx/Apache Access Log 贺嫂。
基于對(duì)日志的實(shí)時(shí)分析,可以隨時(shí)掌握服務(wù)的運(yùn)行狀況雁乡、統(tǒng)計(jì) PV/UV第喳、發(fā)現(xiàn)異常流量、分析用戶(hù)行為踱稍、查看熱門(mén)站內(nèi)搜索關(guān)鍵詞等曲饱。
版本跳躍
ELK在5.0版本以后(從2.x版本直接全部升級(jí)為5.x版本)悠抹,Elastic公司將原來(lái)的ELK Stack稱(chēng)之為Elastic Stack,原因是引入了Beats套件扩淀。
Elastic Products全家福:
Elastic Stack平臺(tái)搭建
對(duì)于ELK部署使用而言楔敌,下面是一個(gè)再常見(jiàn)不過(guò)的架構(gòu)了,如下圖:
上圖是ELK Stack實(shí)際應(yīng)用中典型的一種架構(gòu)驻谆,其中:
1)filebeat:部署在具體的業(yè)務(wù)機(jī)器上卵凑,通過(guò)定時(shí)監(jiān)控的方式獲取增量的日志,并轉(zhuǎn)發(fā)到Kafka消息系統(tǒng)暫存胜臊。
2)Kafka:以高吞吐量的特征勺卢,作為一個(gè)消息系統(tǒng)的角色,接收從filebeat收集轉(zhuǎn)發(fā)過(guò)來(lái)的日志区端,通常以集群的形式提供服務(wù)值漫。
3)logstash:然后,Logstash從Kafka中獲取日志织盼,并通過(guò)Input-Filter-Output三個(gè)階段的處理杨何,更改或過(guò)濾日志,最終輸出我們感興趣的數(shù)據(jù)沥邻。通常危虱,根據(jù)Kafka集群上分區(qū)(Partition)的數(shù)量,1:1確定Logstash實(shí)例的數(shù)量唐全,組成Consumer Group進(jìn)行日志消費(fèi)埃跷。
4)elasticsearch:最后,Elasticsearch存儲(chǔ)并索引Logstash轉(zhuǎn)發(fā)過(guò)來(lái)的數(shù)據(jù)邮利,并通過(guò)Kibana查詢(xún)和可視化展示弥雹,達(dá)到實(shí)時(shí)分析日志的目的。
Elasticsearch/Kibana還可以通過(guò)安裝x-pack插件實(shí)現(xiàn)擴(kuò)展功能延届,比如監(jiān)控Elasticsearch集群狀態(tài)剪勿、數(shù)據(jù)訪(fǎng)問(wèn)授權(quán)等。
我們一步步安裝部署Elastic Stack系統(tǒng)的各個(gè)組件方庭,然后以網(wǎng)站訪(fǎng)問(wèn)日志為例進(jìn)行數(shù)據(jù)實(shí)時(shí)分析厕吉。
首先,到ELK 官網(wǎng)下載需要用到的Filebeat/Logstash/Elasticsearch/Kibana軟件安裝包械念。(推薦下載編譯好的二進(jìn)制可執(zhí)行文件头朱,直接解壓執(zhí)行就可以部署)
- 系統(tǒng)環(huán)境
System: Centos release 7.2 (Final)
ElasticSearch: 5.4.1
Logstash: 5.4.1
Kibana: 5.4.1
Java: openjdk version "1.8.0_131"
kafka: 2.10
Nginx: 1.10.1
- 軟件下載
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.1.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.1-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.1.tar.gz
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.1-linux-x86_64.tar.gz
wget http://apache.fayea.com/kafka/0.10.2.1/kafka_2.10-0.10.2.1.tgz
這里我下載是我所使用的軟件版本(都是當(dāng)前最新版),如果你想使用舊一點(diǎn)或者更新一點(diǎn)的版本可以自行下載龄减。
$ ll
total 327156
-rw-r--r-- 1 root root 1539364 Jun 5 05:33 3.2.0.tar.gz
-rw-r--r-- 1 root root 33321278 Jun 1 09:58 elasticsearch-5.4.1.tar.gz
-rw-r--r-- 1 root root 8780385 Jun 1 09:57 filebeat-5.4.1-linux-x86_64.tar.gz
-rw-r--r-- 1 root root 53791517 Jun 1 09:59 kibana-5.4.1-linux-x86_64.tar.gz
-rw-r--r-- 1 root root 92710340 Jun 1 09:59 logstash-5.4.1.tar.gz
-rw-r--r-- 1 root root 9788179 Jun 1 09:58 packetbeat-5.4.1-linux-x86_64.tar.gz
-rw-r--r-- 1 root root 38424081 Apr 26 15:59 kafka_2.10-0.10.2.1.tgz
3. 安裝Nginx
這里我們部署ELK之前项钮,需要一個(gè)產(chǎn)生日志的源,這里呢就選項(xiàng)Nginx服務(wù)器。
默認(rèn)情況下寄纵,CentOS的官方資源是沒(méi)有php-fpm和Nginx的鳖敷,需要安裝第三方資源庫(kù)即可。(此步驟可省略)
$ wget http://www.atomicorp.com/installers/atomic
$ sh ./atomic
$ yum check-update
安裝啟動(dòng)nginx(關(guān)于nginx可以看本博客也有詳細(xì)介紹)
$ yum install nginx -y
$ nginx
$ netstat -nplt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12719/nginx: master
nginx的訪(fǎng)問(wèn)日志格式定義程拭,默認(rèn)如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
在/etc/nginx/conf.d/default.conf中添加如下一行定踱,定義nginx日志使用的格式,以及日志文件的位置恃鞋。
access_log /var/log/nginx/access.log main;
然后重新啟動(dòng)nginx
$ nginx -s stop
$ nginx
4. 安裝JAVA
由于kafka/logstash/elastisearch的運(yùn)行依賴(lài)于Java環(huán)境崖媚, 而Logstash 1.5以上版本依賴(lài)java版本不能低于java 1.7,因此推薦使用最新版本的Java恤浪。因?yàn)槲覀冎恍枰狫ava的運(yùn)行環(huán)境畅哑,所以可以只安裝JRE,不過(guò)這里我依然使用JDK水由。由于我使用的是CentOS7系統(tǒng)荠呐,java版本是1.8,符合需求砂客,我就使用yum直接安裝了泥张。
$ yum install java-1.8.0-openjdk
查看JAVA版本
$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
如果java -version沒(méi)有問(wèn)題,就不需要設(shè)置環(huán)境變量鞠值。一般使用yum安裝的jdk不需要設(shè)置JAVA_HOME環(huán)境變量媚创。如果你是使用二進(jìn)制版本安裝的jdk,那么可能需要設(shè)置一下JAVA_HOME環(huán)境變量彤恶,具體的JAVA_HOME環(huán)境變量設(shè)置根據(jù)安裝路徑不同而不同钞钙。
5. 安裝部署Kafka
確認(rèn)已安裝java運(yùn)行環(huán)境,直接解壓Kafka即可使用声离。
$ tar xvf kafka_2.10-0.10.2.1.tgz -C /usr/local/elk
解壓后芒炼,編輯配置文件:
$ cat /usr/local/elk/kafka_2.10-0.10.2.1/config/server.properties
############################# Server Basics #############################
broker.id=0
delete.topic.enable=true
############################# Socket Server Settings #############################
listeners=PLAINTEXT://0.0.0.0:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
############################# Log Basics #############################
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
############################# Log Flush Policy #############################
log.flush.interval.messages=10000
log.flush.interval.ms=1000
############################# Log Retention Policy #############################
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
############################# Zookeeper #############################
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
kafka需要依賴(lài)zookeeper,所以需要先啟動(dòng)zookeeper术徊。
$ nohup /usr/local/elk/kafka_2.10-0.10.2.1/bin/zookeeper-server-start.sh /usr/local/elk/kafka_2.10-0.10.2.1/config/zookeeper.properties &
啟動(dòng)Kafka Server:(指定 JMX_PORT 端口本刽,可以通過(guò) Kafka-manager 獲取統(tǒng)計(jì)信息)
$ nohup /usr/local/elk/kafka_2.10-0.10.2.1/bin/kafka-server-start.sh /usr/local/elk/kafka_2.10-0.10.2.1/config/server.properties &
6. 安裝部署Filebeat
$ tar xvf filebeat-5.4.1-linux-x86_64.tar.gz -C /usr/local/elk/
把filebeat解壓后就可以使用了,是不是很簡(jiǎn)單弧关。
開(kāi)啟日志增量監(jiān)控 ,添加filebeat輸出源為kafka(修改filebeat.yml文件):
$ cat /usr/local/elk/filebeat-5.4.1-linux-x86_64/filebeat.yml
filebeat.prospectors:
- input_type: log
paths:
- /var/log/*.log
- input_type: log
paths:
- /var/log/nginx/*.log
encoding: utf-8
document_type: my-nginx-log
scan_frequency: 10s
harvester_buffer_size: 16384
max_bytes: 10485760
tail_files: true
output.kafka:
enabled: true
hosts: ["127.0.0.1:9092"]
topic: elk-%{[type]}
worker: 2
max_retries: 3
bulk_max_size: 2048
timeout: 30s
broker_timeout: 10s
channel_buffer_size: 256
keep_alive: 60
compression: gzip
max_message_bytes: 1000000
required_acks: 0
client_id: beats
上述配置表示唤锉,F(xiàn)ilebeat定期監(jiān)控:/var/log/nginx/目錄下所有以.log結(jié)尾的文件世囊,并且將增量日志轉(zhuǎn)發(fā)到Kafka集群。filebeat支持file窿祥、tcp株憾、udp等輸入方式,輸出方式支持kafka,file嗤瞎,redis墙歪,elasticsearch、logstash等贝奇。
然后虹菲,后臺(tái)啟動(dòng)Filebeat進(jìn)程:
$ nohup /usr/local/elk/filebeat-5.4.1-linux-x86_64/filebeat -c /usr/local/elk/filebeat-5.4.1-linux-x86_64/filebeat.yml &
這時(shí)候,在瀏覽器上訪(fǎng)問(wèn)Nginx服務(wù)器并生成訪(fǎng)問(wèn)日志后掉瞳,F(xiàn)ilebeat 會(huì)及時(shí)的將日志轉(zhuǎn)發(fā)到 Kafka 集群毕源。
我們這個(gè)時(shí)候可以查一下kafka的隊(duì)列信息,可以看到有elk-log的陕习。
$ /usr/local/elk/kafka_2.10-0.10.2.1/bin/kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
elk-log
elk-log
具體深入kafka需要單獨(dú)學(xué)習(xí)了霎褐,如果嫌麻煩可以使用Redis比較簡(jiǎn)單。
7. 安裝配置Logstash
$ tar xvf logstash-5.4.1.tar.gz -C /usr/local/elk
把logstash解壓后就可以使用了该镣,是不是很簡(jiǎn)單冻璃。和所有的編程語(yǔ)言一樣,我們以一個(gè)輸出 “hello world” 的形式開(kāi)始我們的logstash學(xué)習(xí)损合。
7.1 開(kāi)始使用logstash
在終端中省艳,像下面這樣運(yùn)行命令來(lái)啟動(dòng) Logstash進(jìn)程:
這種寫(xiě)法了解就好,正解采用下面配置文件的用法
$ /usr/local/elk/logstash-5.4.1/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
Sending Logstash's logs to /usr/local/elk/logstash-5.4.1/logs which is now configured via log4j2.properties
[logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/usr/local/elk/logstash-5.4.1/data/queue"}
[logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"cbfff69e-1504-48f8-bd8b-6b37b8e6b1d9", :path=>"/usr/local/elk/logstash-5.4.1/data/uuid"}
[logstash.pipeline ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
[logstash.pipeline ] Pipeline main started
The stdin plugin is now waiting for input:
[2017-06-05T09:41:06,159][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
hello world
執(zhí)行完命令塌忽,然后你會(huì)發(fā)現(xiàn)終端在等待你的輸入拍埠。沒(méi)問(wèn)題,敲入hello world土居,然后回車(chē)枣购,logstash會(huì)返回以下結(jié)果!
{
"@timestamp" => 2017-06-05T13:41:41.840Z,
"@version" => "1",
"host" => "gpmaster",
"message" => "hello world"
}
輸出沒(méi)有問(wèn)題擦耀,就證明可以正式來(lái)使用logstash了棉圈。
解釋一下命令含義
每位系統(tǒng)管理員都肯定寫(xiě)過(guò)很多類(lèi)似這樣的命令:cat randdata | awk ‘{print $2}’ | sort | uniq -c | tee sortdata。這個(gè)管道符|可以算是Linux世界最偉大的發(fā)明之一(另一個(gè)是“一切皆文件”)眷蜓。Logstash就像管道符一樣分瘾!你輸入(就像命令行的 cat )數(shù)據(jù),然后處理過(guò)濾(就像 awk 或者 uniq 之類(lèi))數(shù)據(jù)吁系,最后輸出(就像 tee )到其他地方德召。
Logstash會(huì)給事件添加一些額外信息。最重要的就是@timestamp汽纤,用來(lái)標(biāo)記事件的發(fā)生時(shí)間上岗。因?yàn)檫@個(gè)字段涉及到Logstash的內(nèi)部流轉(zhuǎn),所以必須是一個(gè)job對(duì)象蕴坪,如果你嘗試自己給一個(gè)字符串字段重命名為@timestamp的話(huà)肴掷,Logstash會(huì)直接報(bào)錯(cuò)敬锐。所以,請(qǐng)使用filters/date插件來(lái)管理這個(gè)特殊字段呆瞻。
此外台夺,大多數(shù)時(shí)候,還可以見(jiàn)到另外幾個(gè):
host – 標(biāo)記事件發(fā)生在哪里痴脾。
type – 標(biāo)記事件的唯一類(lèi)型颤介。
tags – 標(biāo)記事件的某方面屬性,這是一個(gè)數(shù)組明郭,一個(gè)事件可以有多個(gè)標(biāo)簽买窟。
你可以隨意給事件添加字段或者從事件里刪除字段。事實(shí)上事件就是一個(gè) Ruby對(duì)象薯定,或者更簡(jiǎn)單的理解為就是一個(gè)哈希也行始绍。
小貼士:每個(gè)logstash過(guò)濾插件,都會(huì)有四個(gè)方法叫add_tag, remove_tag, add_field和remove_field话侄。它們?cè)诓寮^(guò)濾匹配成功時(shí)生效亏推。
Logstash的運(yùn)行方式為主程序+配置文件。Collect年堆,Enrich和Transport的行為在配置文件中定義吞杭。配置文件的格式有點(diǎn)像json。
推薦這種
下面來(lái)創(chuàng)建一個(gè)logstash_index.conf文件:
$ cat /usr/local/elk/logstash-5.4.1/etc/logstash_index.conf
input {
kafka {
#codec => "json"
topics_pattern => "elk-.*"
bootstrap_servers => "127.0.0.1:9092"
auto_offset_reset => "latest"
group_id => "logstash-g1"
}
}
output {
elasticsearch { #Logstash輸出到elasticsearch变丧;
hosts => ["localhost:9200"] #elasticsearch為本地芽狗;
index => "logstash-nginx-%{+YYYY.MM.dd}" #創(chuàng)建索引;
document_type => "nginx" #文檔類(lèi)型痒蓬;
workers => 1 #進(jìn)程數(shù)量童擎;
user => elastic #elasticsearch的用戶(hù);
password => changeme #elasticsearch的密碼;
flush_size => 20000
idle_flush_time => 10
}
}
如上配置文件,input定義了從Redis中讀取數(shù)據(jù)攻晒;而output我是輸出到了本地的elasticsearch中存儲(chǔ)顾复。
Logstash傳遞的每條數(shù)據(jù)都帶有元數(shù)據(jù),如@version鲁捏,@timestamp芯砸,host等等,有些可以修改给梅,有些不允許修改假丧。host記錄的是當(dāng)前的主機(jī)信息。Logstash可能不會(huì)去獲取主機(jī)的信息或者獲取的不準(zhǔn)动羽,這里建議替換成自己定義的主機(jī)標(biāo)識(shí)包帚,以保證最終的日志輸出可以有完美的格式。
另外我這里添加了elasticsearch的用戶(hù)名和密碼曹质,因?yàn)楹竺嫖沂褂昧藊-pack插件婴噩,默認(rèn)用戶(hù)名是elastic,密碼是changeme羽德。
啟動(dòng)Logstash:
$ nohup /usr/local/elk/logstash-5.4.1/bin/logstash -f /usr/local/elk/logstash-5.4.1/etc/logstash_index.conf &
8. 安裝使用Elastcearch
$ tar xvf elasticsearch-5.4.1.tar.gz -C /usr/local/elk/
同Logstash一樣几莽,解壓完就可以使用了。但是注意使用elasticsearch不能使用root用戶(hù)宅静,所以這里我創(chuàng)建了一個(gè)elk用戶(hù)章蚣,把elasticsearch.2.3.2目錄及子目錄的屬主和屬組改為elk用戶(hù)了。
$ useradd elk
$ chown elk.elk -R /usr/local/elk/elasticsearch-5.4.1
修改elasticsearch配置文件姨夹,添加如下幾行(注意開(kāi)啟network.host):
$ cat /usr/local/elk/elasticsearch-5.4.1/config/elasticsearch.yml
# ---------------------------------- Cluster -----------------------------------
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
node.name: node-1
#node.attr.rack: r1
# ----------------------------------- Paths ------------------------------------
path.data: /data/elasticsearch/
path.logs: /var/log/elasticsearch/
# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: false
# ---------------------------------- Network -----------------------------------
network.host: 0.0.0.0
http.port: 9200
# --------------------------------- Discovery ----------------------------------
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
#discovery.zen.minimum_master_nodes: 3
# ---------------------------------- Gateway -----------------------------------
#gateway.recover_after_nodes: 3
指定文檔和日志的存儲(chǔ)路徑以及監(jiān)聽(tīng)的地址和端口纤垂。注意,應(yīng)當(dāng)保證有足夠的磁盤(pán)空間來(lái)存儲(chǔ)文檔磷账,否則ES將拒絕寫(xiě)入新數(shù)據(jù)峭沦。
創(chuàng)建elasticsearch需要的數(shù)據(jù)目錄和日志目錄。
$ mkdir -p /data/elasticsearch
$ mkdir -p /var/log/elasticsearch/
$ chown elk.elk /data/elasticsearch/ -R
$ chown elk.elk /var/log/elasticsearch/ -R
啟動(dòng)elasticsearch
$ nohup sudo -u elk /usr/local/elk/elasticsearch-5.4.1/bin/elasticsearch &
$ netstat -nplt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 5026/java
如果啟動(dòng)Elasticsearch出現(xiàn)以下錯(cuò)誤提示:
錯(cuò)誤1:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
解決:打開(kāi)/etc/security/limits.conf文件逃糟,添加以下兩行代碼并保存:
* soft nofile 65536 //*表示任意用戶(hù)吼鱼,這里是elasticsearch報(bào)的錯(cuò),也可以直接填運(yùn)行elk的用戶(hù);
* hard nofile 131072
錯(cuò)誤2:memory locking requested for elasticsearch process but memory is not locked
解決:修改elasticsearch.yml文件
bootstrap.memory_lock : false
錯(cuò)誤3:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決:修改內(nèi)核配置
$ sysctl -w vm.max_map_count=262144
$ sysctl -p
錯(cuò)誤4:os::commit_memory(0x00000001006cd000, 77824, 0) failed; error=’Cannot allocate memory’ (errno=12)
解決:提供內(nèi)存不足绰咽,增大主機(jī)內(nèi)存或減小elasticsearch的內(nèi)存大小
JVM默認(rèn)配置參數(shù):
$ grep -v "^#" /usr/local/elk/elasticsearch-5.4.1/config/jvm.options | grep -v "^$"
-Xms1g
-Xmx1g
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch
-server
-Xss1m
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djna.nosys=true
-Djdk.io.permissionsUseCanonicalPath=true
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
-XX:+HeapDumpOnOutOfMemoryError
然后使用curl訪(fǎng)問(wèn)http://localhost:9200/?pretty
$ curl http://localhost:9200/?pretty
{
"name" : "node-1",
"cluster_name" : "my-application",
"cluster_uuid" : "Jf0qp0GqQ_W1MHN4pDtLdA",
"version" : {
"number" : "5.4.1",
"build_hash" : "2cfe0df",
"build_date" : "2017-05-29T16:05:51.443Z",
"build_snapshot" : false,
"lucene_version" : "6.5.1"
},
"tagline" : "You Know, for Search"
}
如果可以看到類(lèi)似上面的返回菇肃,則說(shuō)明ES單機(jī)運(yùn)行沒(méi)有問(wèn)題了。
安裝x-pack插件
x-pack是elasticsearch的一個(gè)擴(kuò)展包取募,將安全琐谤,警告,監(jiān)視玩敏,圖形和報(bào)告功能捆綁在一個(gè)易于安裝的軟件包中斗忌,雖然x-pack被設(shè)計(jì)為一個(gè)無(wú)縫的工作,但是你可以輕松的啟用或者關(guān)閉一些功能聊品。
$ /usr/local/elk/elasticsearch-5.4.1/bin/elasticsearch-plugin install x-pack
ES如果是一個(gè)集群飞蹂,需要在每一個(gè)節(jié)點(diǎn)上安裝(包括kibana)。
用戶(hù)和權(quán)限管理
x-pack安裝之后有一個(gè)超級(jí)用戶(hù)elastic 翻屈,其默認(rèn)的密碼是changeme陈哑,擁有對(duì)所有索引和數(shù)據(jù)的控制權(quán),可以使用該用戶(hù)創(chuàng)建和修改其他用戶(hù)伸眶,當(dāng)然這里可以通過(guò)kibana的web界面進(jìn)行用戶(hù)和用戶(hù)組的管理惊窖。
X-pack的elk之間的數(shù)據(jù)傳遞保護(hù)
這一步要注意下,在安裝了X-pack之后就要配置厘贼,配置之后要重啟各個(gè)組件才會(huì)生效的界酒,不然下面直接啟動(dòng)kibana的時(shí)候會(huì)報(bào)錯(cuò)。如圖嘴秸,重啟相關(guān)的東西在底部做了個(gè)匯總
安裝完x-pack之后毁欣,我們就可以用我們所創(chuàng)建的用戶(hù)來(lái)保護(hù)elk之間的數(shù)據(jù)傳遞 安裝了X-pack之后就要改庇谆,然后重啟才可以
1:kibana<——>elasticsearch
在kibana.yml文件中配置:
elasticsearch.username: "elastic"
elasticsearch.password: "changeme"
2:logstash<——>elasticsearch
output {
elasticsearch {
hosts => ["http://localhost:9200"]
user => elastic
password => changeme
}
}
這里如果不進(jìn)行相關(guān)配置的話(huà),elk之間的數(shù)據(jù)傳遞就會(huì)出現(xiàn)問(wèn)題凭疮。
安裝Cerebro
Cerebro時(shí)一個(gè)第三方的Elasticsearch集群管理軟件饭耳,可以方便地查看集群狀態(tài):
$ tar xvf cerebro-0.6.5.tgz -C /usr/local/elk/
下載地址(下載二進(jìn)制版):https://github.com/lmenezes/cerebro
啟動(dòng)進(jìn)程:
$ nohup /usr/local/elk/cerebro-0.6.5/bin/cerebro -Dhttp.port=1234 -Dhttp.address=0.0.0.0 &
可以在瀏覽器查看,需要輸入elasticsearch的用戶(hù)和密碼(如果安裝了x-pack)执解。
可以在管理后臺(tái)修改模板寞肖,優(yōu)化索引配置,例如:
安裝head插件
由于elasticsearch 5.0版本變化較大衰腌,目前elasticsearch 5.0暫時(shí)不支持直接安裝head插件新蟆,但是head作者提供了另一種安裝方法。推薦使用docker直接安裝elasticsearch-head右蕊,關(guān)于head插件琼稻,直接這樣的話(huà)是不能用的,顯示為未鏈接饶囚,看另外一篇文章有解決辦法欣簇。
$ docker run -p 9100:9100 -d mobz/elasticsearch-head:5
Docker需要自行安裝即可,另外由于elasticsearch安裝了x-pack坯约,所以elasticsearch有密碼熊咽。head連接elasticsearch需要賬號(hào)密碼。
8. 安裝kibana
Kibana安裝跟logstash闹丐、elasticsearch一樣不需要安裝横殴,解壓就能用。
$ tar xvf kibana-5.4.1-linux-x86_64.tar.gz -C /usr/local/elk
安裝x-pack
$ /usr/local/elk/kibana-5.4.1-linux-x86_64/bin/kibana-plugin install x-pack
Attempting to transfer from x-pack
Attempting to transfer from https://artifacts.elastic.co/downloads/kibana-plugins/x-pack/x-pack-5.4.1.zip
Transferring 119988917 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete
調(diào)整配置文件卿拴,主要配置一下下面三個(gè)參數(shù):
$ cat /usr/local/elk/kibana-5.4.1-linux-x86_64/config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
server.basePath: ""
server.maxPayloadBytes: 1048576
elasticsearch.url: "http://127.0.0.1:9200"
elasticsearch.preserveHost: true
kibana.index: ".kibana"
elasticsearch.pingTimeout: 1500
elasticsearch.requestTimeout: 30000
elasticsearch.shardTimeout: 0
elasticsearch.startupTimeout: 5000
pid.file: /var/run/kibana.pid
logging.dest: stdout
logging.silent: false
logging.quiet: false
logging.verbose: false
ops.interval: 5000
i18n.defaultLocale: "en"
# elasticsearch.username: "user"
# elasticsearch.password: "pass"
啟動(dòng)Kibana
$ nohup /usr/local/elk/kibana-5.4.1-linux-x86_64/bin/kibana &
$ netstat -nplt | grep node
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 12471/node
然后打開(kāi)瀏覽器輸入IP加端口5601即可訪(fǎng)問(wèn)衫仑,界面如下(需要輸入用戶(hù)密碼了):
默認(rèn)賬號(hào):elastic
默認(rèn)密碼:changeme
x-pack安裝之后有一個(gè)超級(jí)用戶(hù)elastic ,其默認(rèn)的密碼是changeme堕花,擁有對(duì)所有索引和數(shù)據(jù)的控制權(quán)文狱,可以使用該用戶(hù)創(chuàng)建和修改其他用戶(hù)。
初次訪(fǎng)問(wèn)Kibana的時(shí)候缘挽,需要配置一個(gè)默認(rèn)的ES索引瞄崇,一般填寫(xiě).monitoring即可,這是因?yàn)樵谏鲜霭惭bx-pack后壕曼,會(huì)自動(dòng)開(kāi)始監(jiān)控Elasticsearch集群的狀態(tài)苏研,并將監(jiān)控結(jié)果以.monitoring命名索引文件。
添加logstash索引(Management->index Patterns->+)
看日志已經(jīng)出來(lái)了腮郊。
ELK的搭建已經(jīng)基本完成摹蘑,接下來(lái)就是搭建elasticsearch集群,以及使用kibana了轧飞。
X-PACK使用
x-pack的監(jiān)控功能
X-Pack監(jiān)控組件使您能夠通過(guò)Kibana輕松監(jiān)控Elasticsearch衅鹿,您可以實(shí)時(shí)查看集群運(yùn)行狀況和性能撒踪,以及分析過(guò)去的集群,索引和節(jié)點(diǎn)指標(biāo)大渤。 此外糠涛,您可以監(jiān)控Kibana本身的性能。在群集上安裝X-Pack時(shí)兼犯,監(jiān)視代理會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行,以從Elasticsearch收集索引指標(biāo)集漾。 通過(guò)在Kibana中安裝X-Pack切黔,您可以通過(guò)一組專(zhuān)用儀表板查看監(jiān)視數(shù)據(jù)。
x-pack的Graph
https://www.elastic.co/guide/en/x-pack/current/graph-getting-started.html
Redis當(dāng)隊(duì)列配置
如果嫌使用kafka當(dāng)隊(duì)列太麻煩具篇,可以把Kafka換成Redis即可纬霞,配置如下:
filebeat配置
filebeat.prospectors:
- input_type: log
paths:
- /var/log/*.log
- input_type: log
paths:
- /var/log/nginx/*.log
encoding: utf-8
document_type: my-nginx-log
scan_frequency: 10s
harvester_buffer_size: 16384
max_bytes: 10485760
tail_files: true
output.redis:
enabled: true
hosts: ["127.0.0.1:6379"]
port: 6379
key: filebeat
db: 0
worker: 1
timeout: 5s
max_retries: 3
logstash配置
input {
redis { #去redis隊(duì)列取數(shù)據(jù);
host => "localhost" #連接redis服務(wù)器驱显;
port => 6379 #連接redis端口诗芜;
data_type => "list" #數(shù)據(jù)類(lèi)型;
key => "filebeat" #隊(duì)列名稱(chēng)埃疫;
type => "nginxlog" #日志的類(lèi)型伏恐,用于區(qū)分index索引用;
}
}
output {
elasticsearch { #Logstash輸出到elasticsearch栓霜;
hosts => ["localhost:9200"] #elasticsearch為本地翠桦;
index => "logstash-%{type }-%{+YYYY.MM.dd}" #創(chuàng)建索引;
document_type => "nginx" #文檔類(lèi)型胳蛮;
workers => 1 #進(jìn)程數(shù)量销凑;
flush_size => 20000
idle_flush_time => 10
user => elastic
password => changeme
}
}
查看Redis隊(duì)列信息
$ redis-cli
127.0.0.1:6379> KEYS *
1) "filebeat"
127.0.0.1:6379> llen filebeat
(integer) 2
Redis要自行安裝了。
Nginx日志輸出為JSON格式
把Nginx日志的格式輸出成JSON格式展示在Kibana面板仅炊,生產(chǎn)環(huán)境中基本都是這么使用斗幼。
配置Nginx
主要修改nginx的訪(fǎng)問(wèn)日志格式,這里定義成json格式抚垄,以便后面logstash更好的處理蜕窿,建議生產(chǎn)環(huán)境也這樣使用。在主配置/etc/nginx/nginx.conf文件中添加如下內(nèi)容(注釋其他日志格式):
log_format json '{"@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",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
在/etc/nginx/conf.d/default.conf中添加如下一行呆馁,定義nginx日志使用的格式渠羞,以及日志文件的位置声登。
access_log /var/log/nginx/access.log json;
然后重新啟動(dòng)nginx
$ nginx -s stop
$ nginx
配置Logstash
修改Indexer角色的配置文件:logstash_indexer.conf
$ cat /usr/local/logstash-2.3.2/etc/logstash_indexer.conf
input {
redis {
host => "localhost"
data_type => "list"
key => "filebeat"
type => "redis-input"
}
}
filter {
json {
source => "message"
remove_field => "message"
}
}
output {
elasticsearch {
hosts => ["localhost"]
index => "logstash-nginx-%{+YYYY.MM.dd}"
document_type => "nginx"
# template => "/usr/local/logstash-2.3.2/etc/elasticsearch-template.json"
workers => 1
flush_size => 20000
idle_flush_time => 10
}
}
刪除elasticsearch老的數(shù)據(jù)
$ rm -fr /data/elasticsearch/*
然后重啟logstash_indexer.conf和elastisearch即可贫悄,繼續(xù)刷新Nginx日志。
打開(kāi)Kibana镰烧,應(yīng)該會(huì)讓你重新創(chuàng)建索引瓷叫,如果沒(méi)有問(wèn)題會(huì)出現(xiàn)JSON格式的日志屯吊。
啟動(dòng)代碼
nginx
/usr/local/elk/kafka_2.10-0.10.2.1/bin/zookeeper-server-start.sh /usr/local/elk/kafka_2.10-0.10.2.1/config/zookeeper.properties &
/usr/local/elk/kafka_2.10-0.10.2.1/bin/kafka-server-start.sh /usr/local/elk/kafka_2.10-0.10.2.1/config/server.properties &
/usr/local/elk/filebeat-5.4.1-linux-x86_64/filebeat -c /usr/local/elk/filebeat-5.4.1-linux-x86_64/filebeat.yml &
/usr/local/elk/logstash-5.4.1/bin/logstash -f /usr/local/elk/logstash-5.4.1/etc/logstash_index.conf &
sudo -u elk /usr/local/elk/elasticsearch-5.4.1/bin/elasticsearch &
/usr/local/elk/cerebro-0.6.5/bin/cerebro -Dhttp.port=1234 -Dhttp.address=0.0.0.0 &
docker run -p 9100:9100 -d mobz/elasticsearch-head:5
/usr/local/elk/kibana-5.4.1-linux-x86_64/bin/kibana &
前面加 nohup 防止關(guān)掉了xshell之后送巡,kibana也關(guān)掉了,如 nohup /usr/local/elk/kibana-5.4.1-linux-x86_64/bin/kibana &