本文介紹關於關於搭建elasticsearch+logstash(beats)+kibana實現搭建可視化的日誌分析系統。
這幾款軟件也都是免費開源的,其官方站點爲:https://www.elastic.co/cn/productshtml
Elasticsearch是個開源分佈式搜索引擎,它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
Logstash是一個開源的用於收集,分析和存儲日誌的工具。
Kibana 也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠彙總、分析和搜索重要數據日誌。
Beats是elasticsearch公司開源的一款採集系統監控數據的代理agent,是在被監控服務器上以客戶端形式運行的數據收集器的統稱,能夠直接把數據發送給Elasticsearch或者經過Logstash發送給Elasticsearch,而後進行後續的數據分析活動。Beats由以下組成:
①Packetbeat:是一個網絡數據包分析器,用於監控、收集網絡流量信息,Packetbeat嗅探服務器之間的流量,解析應用層協議,並關聯到消息的處理,其支 持ICMP (v4 and v6)、DNS、HTTP、Mysql、PostgreSQL、Redis、MongoDB、Memcache等協議;
②Filebeat:用於監控、收集服務器日誌文件,其已取代 logstash forwarder;
③Metricbeat:可按期獲取外部系統的監控指標信息,其能夠監控、收集 Apache、HAProxy、MongoDB、MySQL、Nginx、PostgreSQL、Redis、System、Zookeeper等服務;
④Winlogbeat:用於監控、收集Windows系統的日誌信息;
⑤Create your own Beat:自定義beat ,若是上面的指標不能知足需求,elasticsarch鼓勵開發者 使用go語言,擴展實現自定義的beats,只須要按照模板,實現監控的輸入,日誌,輸出等便可。
Beats 將蒐集到的數據發送到 Logstash,經 Logstash 解析、過濾後,將其發送到 Elasticsearch 存儲,並由 Kibana 呈現給用戶。
Beats 做爲日誌蒐集器沒有Logstash 做爲日誌蒐集器消耗資源,解決了 Logstash 在各服務器節點上佔用系統資源高的問題。java
(1)大概網絡拓撲圖node
說明:
藍線的線路圖:文件---->logstash server------>elasticsearch
Logstash本身作過濾(input plugin)、轉換(filter plugin)、輸出(output plugin)機制而後直接傳送到elasticsearch集羣
紅線的路線圖說明:logstash agent 將數據傳輸到logstash server端,在servlet端進行統一的輸出格式。此刻agent端輸入是文件,輸出到server;在logstash server 端,輸入端是logstash agent ,輸出端是elasticsearch集羣。
墨色的線路圖:加個redis作隊列緩衝,爲了減輕logstash server的壓力,這也是主流的配置。
以上三種狀況,就模擬第三種主流的配置,第1、二有興趣的能夠本身作一下。
(2)主機配置說明linux
主機名 | ip | 運行的服務 |
---|---|---|
master | 172.16.5.4 | elasticsearch 、filebeat |
server1 | 172.16.5.3 | logstash agent、redis |
server2 | 172.17.5.2 | logstash server、kibana |
因爲本實驗測試吃很大內存,就不搭建集羣了,都是用一臺服務器測試。redis
(3)部署elastic stach
①環境部署。
關閉iptables、selinux,同時時間同步、hosts文件進行解析。
命令:iptables -F 狀況防火牆策略
setenforce 0 臨時關閉selinux,若是想要永久關閉,修改配置文件,很少說。
②安裝java環境,解決依賴關係,全部服務器上都安裝。
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
③安裝elasticsearch安裝包。
能夠官網下載:https://www.elastic.co/cn/products/elasticsearch
我使用已經下載好的安裝包
rpm -ivh elasticsearch-5.4.2.rpm
④修改配置文件
vim /etc/elasticsearch/jvm.options
修改內存:
-Xms1g
-Xmx1g 【建議生產環境32g,發揮最好的性能】
vim /etc/elasticsearch.yml
cluster.name: myels 【集羣名字】
node.name: node1 【節點名字,主機名】
path.data: /data/els/data 【索引存放路徑】
path.logs: /data/els/logs 【日誌路徑】
network.host: 0.0.0.0 【加入集羣時使用的地址,本機地址】
http.port: 9200 【監聽端口】
discovery.zen.ping.unicast.hosts: ["node1", "node2", "node3"] 【判斷是否在同一個集羣裏,也就是是否都是監聽同一端口】
discovery.zen.minimum_master_nodes: 2 【有幾個節點,大於半數的最小值】sql
⑤建立elasticsearch使用的index和logs目錄
mkdir -pv /els/{date,logs} && chown -R elasticsearch:elasticsearch /els/* 【建立索引和日誌目錄】
⑥啓動服務
systemctl start elasticsearch.service
測試。
出現以上就是成功了
(4)在server1上部署logstash agent和redis
①安裝logstash和redis包。
②查看logstash的配置文件
/etc/logstash/jvm.options 【運行環境,即配置內存等信息;server端建議大,agent默認就行】
/etc/logstash/conf.d 【配置插件使用的文件】
/etc/logstash/logstash.yml 【主配置文件,配置怎麼運行】
config.reload.automatic: ture 【文件是否當即生效,默認false須要手動重啓】
config.reload.devel:3 【配置文件多久從新加載一次】
配置文件不用修改。
③添加到path路徑
vim /etc/profied.d/logstash.sh
export PATH=$PATH:/usr/share/logstash/bin
④啓動服務
systemctl start logstash
⑤修改redis配置文件
建議修改該行,提升安全性,本實驗就不修改了
requirepass ilinux.io
⑥啓動redis服務
systemctl start redis
(5)實現server2服務器的logstash server和kibana的部署
①安裝logstash、kibana安裝包
②修改kibana配置文件
vim /etc/kibana/kibana.yml
server.host: "0.0.0.0"
server.name: "主機名「
elasticsearch.uri: "http://server:9200"
③啓動logstash和kibana服務
systemctl start logstash.service
systemctl start redis.service
④瀏覽器輸入http://localhost:5601,配置filebeat的索引(只需輸入filebeat-便可)。
(6)模擬各服務的輸入和輸出指向的服務。
①模擬logstash agent端把日誌文件輸入給redis。
設置logstash的轉換機制。
規則轉換機制都放在 /etc/logstash/conf.d/ 下面。
vim /etc/logstash/conf.d/redis.conf
補充:logstash內帶自變量函數
rpm -ql logstash | grep patternt
爲了更好的模擬生產環境,咱們在此安裝httpd服務。
yum install httpd
啓動httpd服務
systemctl start httpd.service
創建20個頁面
for i in {1..20};do echo "test${i}" > /var/www/html/test${i};done
訪問20次生產日誌
for i in {1..20};do j=$[$RANDOM%20+1];curl http://172.16.5.3/test${j}.html;done
②模擬logstash server端的輸入端是redis,輸出端是elasticsearch集羣。
vim /etc/logstash/conf.d/redis.conf
③把els集羣裏面的內容發送給kibana
在第一個框裏輸入filebeat-*後稍等片刻,kibana會自動識別,OK後下面的按鈕會由灰色變爲可操控的按鈕"Create",如上圖所示。點擊該按鈕後,最後就會呈現以下圖所示:
再回過頭新建logstash的索引,瀏覽器輸入http://server2:5601,點擊左邊欄的」Management」 ===> 而後點擊「index Patterns」 ===>
而後點擊「Add New」
點擊「Crete」按鈕建立logstash索引,建立完成後即會展示以下圖所示:
3、實現beats的輕量級數據採集器
官方站點:https://www.elastic.co/cn/products/beats
工做模式:
beats——>redis——>logstash server——>els集羣
說明:
此時使用beats代替了logstash agent,logstash 和filebeat都具備日誌收集功能,filebeat更輕量,佔用資源更少,但logstash 具備filter功能,能過濾分析日誌。通常結構都是filebeat採集日誌,而後發送到消息隊列,redis,kafaka。而後logstash去獲取,利用filter功能過濾分析,而後存儲到elasticsearch中。
本實驗在上個實驗中基本都作完了,這個實驗只作filebeat部分。
①安裝包
yum install httpd filebeat -y
②修改配置文件
cd /etc/filebeat
vim filebeat.yml
filebeat.prospectors: 【從哪加載文件,默認便可】
input_type: log 【文件類型,日誌,默認便可】
paths:apache
/var/log/httpd/error_log
hosts: 【存放路徑】
③添加數據
for i in {1..20};do echo "test $i" > /var/www/html/test${i}.html;done
啓動httpd服務和filebeat服務
systemctl start httpd
隨意找個主機進行訪問,爲了獲得日誌
for i in {1..20};do j=$[$RANDOM%20+1];curl http://172.16.0.4/test${j}.html
④輸出給elasticsearch
vim /etc/filebeat.yml
output.elasticsearch :
hosts: ["server1:9200「,「server2:9200」,「server3:9200」]
直接輸出給els不用輸出插件了vim
⑤輸出給logstash
vim /etc/filebeat.yml
output.logstash :
hosts: ["172.16.0.4:5044]
vim /etc/logstash/conf.d/Apachelog.conf
input {
beats {
port => 5044
}
filter {
grok {
match => {
"message" => "%{HTTPD_COMBINEDLOG}"
}
}
date {
match => ["timestamp","dd/MMM/YYYY:H:m:s Z"]
}
mutate {
rename => {
"agent" => "user_agent"
}
}
geoip {
source => "clientip"
target => "geoip"
database => "/etc/logstash/maxmind/GeoLite2-City.mmdb"
}
output {
elasticsearsh {
hosts => ["http://server1:9200","http://server2:9200","http://master:9200"]
index => "logstash-%{+YYYY.MM.DD}
document_type => "http_access_logs"
}
}
啓動:logstash -f apachelog.conf
⑥輸出給redis
編輯filebeat配置文件
vim /etc/filebeat.yml
添加:
output.redis:
hosts: ["redis服務器"]
password: "iliunx.io"
key: "httplog"
db: 0
timeout: 5
重啓filebeat
systemctl restart filebeat
進入redis查看數據
redis-cli -a ilinux.io
查看有多少數據
LLEN httplogs
在els server端配置輸入機制
vim /etc/elasticsearch/conf.d/redis2.conf
input {
redis {
batch_count => 1
data_type => "list"
key => "httpdlogs"
host => "192.168.0.2"
port => 6379
threads => 5
password => "ilinux.io"
}
}瀏覽器
filter {
grok {
match => {
"message" => "%{HTTPD_COMBINEDLOG}"
}
}
date {
match => ["timestamp","dd/MMM/YYYY:H:m:s Z"]
}
mutate {
rename => {
"agent" => "user_agent"
}
}
geoip {
source => "clientip"
target => "geoip"
database => "/etc/logstash/maxmind/GeoLite2-City.mmdb"
}
output {
elasticsearsh {
hosts => ["http://server1:9200","http://server2:9200","http://server3:9200"]
index => "logstash-%{+YYYY.MM.DD}
document_type => "http_access_logs"
}
}安全