自建elk+filebeat+grafana日誌收集平臺
歡迎關註個人公眾號“沒有故事的陳師傅”
搭建這個平臺的初衷只是為了我和我的兩個小夥伴來更好的學習es以及周邊組件,欲善其事,必利其器,只是單純的去學習理論知識是不夠的,理論與操作相結合,才能學的更紮實。
環境配置:
使用自己的兩臺1v2g阿裏雲主機以及好友穎樅的一臺1v2gvps,共計三臺主機
環境架構如下:
三臺主機的環境分別如下:
node1:elasticsearch6.4+filebeat
node2:kibana6.4+grafana+filebeat
node3:logstash+nginx+filebeat+Redis
由於es很消耗內存,所以我只把es單獨運行在一個主機上,並設置主分片為1,副本分片為0,每周定時刪除上周的索引數據
日誌采集端配置
安裝Redis
redis服務器是logstash官方推薦的broker(代理人)選擇,broker角色也就意味著會同時存在輸入和輸出兩個插件,產生數據的被稱作生產者,而消費數據的被稱作消費者。
redis消息隊列作用說明:
1、防止Logstash和ES無法正常通信,從而丟失日誌。
2、防止日誌量過大導致ES無法承受大量寫操作從而丟失日誌。
3、應用程序(php,java)在輸出日誌時,可以直接輸出到消息隊列,從而完成日誌收集。
補充:如果redis使用的消息隊列出現擴展瓶頸,可以使用更加強大的kafka,flume來代替。
編譯安裝Redis
wget http://download.redis.io/releases/redis-4.0.11.tar.gz #下載Redis源碼 tar -zxf redis-4.0.11.tar.gz #解壓Redis源碼 cp -r redis-4.0.11 /usr/local/ mv redis-4.0.11/ redis cd /usr/local/redis/ cp redis.conf bin/ make PREFIX=/usr/local/redis install #編譯安裝Redis echo "export PATH=$PATH:/usr/local/redis/bin" >> /etc/profile 將Redis加入環境變量
啟動Redis
1.前端模式啟動
直接運行bin/redis-server將以前端模式啟動,前端模式啟動的缺點是ssh命令窗口關閉則redis-server程序結束,不推薦使用此方法redis-server
2.後端模式啟動
修改redis.conf配置文件, daemonize yes 以後端模式啟動
vim /usr/local/redis/bin/redis.conf
daemonize yes
執行如下命令啟動redis:
redis-server redis.conf
連接redisredis-cli
關閉Redis
強行終止redis進程可能會導致redis持久化數據丟失。正確停止Redis的方式應該是向Redis發送SHUTDOWN命令,命令為:
redis-cli shutdown
修改nginx日誌格式
nginx日誌默認格式為log格式,傳輸到es中需要經過grok插件進行處理並轉換成json格式,這一過程是很消耗logstash資源的,而且傳入到es中的字段並不容易分析,所以在收集端先將日誌轉為json格式,再傳入es中去,這樣傳入的字段也是利於分析的。
編輯nginx配置文件
vim /usr/local/nginx/conf/nginx.conf #修改主配置文件,定義日誌格式
log_format json ‘{ "@timestamp": "$time_iso8601", ‘
‘"time": "$time_iso8601", ‘
‘"clientip": "$remote_addr", ‘
‘"remote_user": "$remote_user", ‘
‘"body_bytes_sent": "$body_bytes_sent", ‘
‘"request_time": "$request_time", ‘
‘"status": "$status", ‘
‘"host": "$host", ‘
‘"request": "$request", ‘
‘"request_method": "$request_method", ‘
‘"uri": "$uri", ‘
‘"http_referrer": "$http_referer", ‘
‘"body_bytes_sent":"$body_bytes_sent", ‘
‘"http_x_forwarded_for": "$http_x_forwarded_for", ‘
‘"http_user_agent": "$http_user_agent" ‘
‘}‘;
vim /usr/local/nginx/conf.d/default.conf #修改站點配置文件
access_log /var/log/nginx/io.log json ;
vim /usr/local/nginx/conf.d/doc.conf
access_log /var/log/nginx/doc.access.log json;
重載nginxsystemctl reload nginx
查看日誌格式tail -f /var/log/nginx/io.log
安裝並配置filebeat
filebeat是一個輕量級的日誌采集器,由於logstash比較消耗資源,不適合在每臺主機上部署logstash
使用RPM安裝filebeat
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.0.1-x86_64.rpm
rpm -vi filebeat-7.0.1-x86_64.rpm
配置filebeat收集nginx日誌
配置輸入端采集nginx日誌,根據字段類型不同輸出到Redis不同的key中,每種日誌存放在不同的key中,便於後續的處理
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/io.log
fields:
type: www_access
fields_under_root: true
- type: log
paths:
- /var/log/nginx/io.error.log
fields:
type: www_error
fields_under_root: true
- type: log
paths:
- /var/log/nginx/doc.access.log
fields:
type: doc_access
fields_under_root: true
setup.template.settings:
index.number_of_shards: 1
output.redis:
hosts: ["127.0.0.1:6379"]
key: "nginx"
keys:
- key: "%{[type]}"
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
重啟filebeat
systemctl restart filebeat
進入Redis中查看日誌信息redis-cli
獲取key的長度,key長度增加說明日誌已經寫入到Redis裏了,而且也能看到日誌的信息,下圖日誌信息還是log格式的,因為json格式是後來修改的
日誌處理端配置
安裝並配置logstash
1.安裝logstash需要依賴Java8的環境,不支持Java9
使用yum install java命令安裝
2.下載並安裝公共簽名密鑰
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
3.添加logstash的yum倉庫
vim /etc/yum.repos.d/logstash.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
4.使用yum安裝logstashyum install logstash
編寫日誌處理配置文件
定義Redis列表或者頻道名稱,以及Redis的數據類型,定義type以區分不同的日誌類型,使用json插件將message字段處理成json格式,並刪掉message字段,使用date插件定義新的時間戳,使用geoip插件根據客戶端IP來定位客戶端大體,默認是使用GeoLite2 city數據庫,此數據庫官網每兩周更新一次,如果對IP地址的準確性要求高,可寫一個定時任務,每兩周從官網下載新的數據庫,mutate插件用於修改字段數據類型,因為"coordinates"子字段不修改會默認為keyword格式,這對於在kibana上創建坐標地圖可能會不支持,關於以上插件的詳細信息可查看本人以前發的logstash文章。
vim /etc/logstash/conf.d/test.conf
input {
redis {
host => "127.0.0.1"
port => 6379
type => "www_access"
data_type => "list"
key => "www_access"
codec => "json"
}
redis {
host => "127.0.0.1"
port => 6379
type => "nginx_error"
data_type => "list"
key => "www_error"
}
redis {
host => "127.0.0.1"
port => 6379
type => "doc_access"
data_type => "list"
key => "doc_access"
codec => "json"
}
}
filter {
if [type] == "www_access" {
json {
source => "message"
remove_field => "message"
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
geoip {
source => "clientip"
fields => ["city_name", "country_code2", "country_name", "region_name","longitude","latitude","ip"]
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]","float" ]
}
}
else if [type] =~ "error" {
grok {
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
else {
json {
source => "message"
remove_field => "message"
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] }
geoip {
source => "clientip"
fields => ["city_name", "country_code2", "country_name", "region_name","longitude","latitude","ip"]
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] }
mutate {
convert => ["[geoip][coordinates]","float"]
}
}
}
output {
if [type] == "www_access" {
elasticsearch {
hosts => ["60.205.177.168:9200"]
index => "nginx_access-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
else if [type] == "www_error" {
elasticsearch {
hosts => ["60.205.177.168:9200"]
index => "nginx_error-%{+YYYY.MM.dd}"
}
}
else {
elasticsearch {
hosts => ["60.205.177.168:9200"]
index => "nginx_doc-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
}
啟動logstash
logstash -f /etc/logstash/conf.d/test.conf
再次進入Redis數據庫查看,發現日誌數據已經被消費掉了
日誌存儲分析端配置
安裝elasticsearch
elasticsearch同樣需要Java運行環境
1.下載elasticsearch的tar包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.tar.gz
2.解壓包
tar -xzf elasticsearch-6.4.0.tar.gz
3.修改配置文件
[[email protected] elasticsearch-6.4.0]# vim config/elasticsearch.yml
修改內容如下:
cluster.name: my-elk #設置集群的名字
node.name: es1 #集群中的節點名稱,同一集群中的節點名稱不能重復
path.data: /elasticsearch/elasticsearch-6.4.0/data #設置es集群的數據位置
path.logs: /elasticsearch/elasticsearch-6.4.0/logs/ #設置存放日誌的路徑
network.host: 192.168.179.134 #綁定本地ip地址
http.port: 9200 #設置開放的端口,默認就是9200端口
4.啟動elasticsearch
cd elasticsearch-6.4.0/
./bin/elasticsearch
如果要將es後臺運行,可以在命令後加-d
這裏要使用普通用戶運行,還要把目錄授予普通文件權限chown -R elker.elker /elasticsearch
5.查看啟動狀態
輸入netstat -ntlp |grep 9200查看9200端口是否監聽,可以使用curl 192.168.179.134:9200或者在瀏覽器上輸入192.168.179.134:9200進行查看啟動後的狀態
6.啟動過程出現的報錯
[WARN ][o.e.b.BootstrapChecks ] [PWm-Blt] max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
解決辦法:
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
[WARN ][o.e.b.BootstrapChecks ] [PWm-Blt] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決辦法:
vim /etc/sysctl.conf
vm.max_map_count=655360
修改完成執行命令:sysctl -p
日誌可視化端配置
kibana安裝
kibana版本須與es版本一致
1.下載並解壓kibana包
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.0-linux-x86_64.tar.gz
tar -xzf kibana-6.4.0-linux-x86_64.tar.gz
2.修改kibana默認配置
vim kibana-6.4.0-linux-x86_64/config/kibana.yml
server.port: 5601 #kibana默認端口是5601
server.host: "192.168.179.134" #設置綁定的kibana服務的地址
elasticsearch.url: "http://192.168.179.134:9200" #設置elasticsearch服務器的ip地址,不修改的話啟動的時候會報[elasticsearch] Unable to revive connection: http://localhost:9200/連接不上elasticsearch的錯誤
3.啟動kibana
/kibana-6.4.0-linux-x86_64/bin/kibana
netstat -ntlp |grep 5601 #可以查看5601端口是否啟動
在瀏覽器輸入192.168.179.134:5601即可訪問kibana
4.出現的警告信息
雖然出現警告信息,不過還是可以啟動kibana的,本人有點強迫癥,不想看到警告信息
警告信息1:[security] Generating a random key for xpack.security.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in kibana.yml
解決方法:修改配置文件vim config/kibana.yml
在配置文件底部添加
xpack.reporting.encryptionKey: "a_random_string"
警告信息2:[security] Session cookies will be transmitted over insecure connections. This is not recommended.
解決方法:修改配置文件vim config/kibana.yml
在配置文件底部添加
xpack.security.encryptionKey: "something_at_least_32_characters"
5.檢查kibana狀態
在瀏覽器輸入192.168.179.134:5601/status查看kibana狀態,或者輸入http://192.168.179.134:5601/api/status查看json格式的詳細狀態
grafana安裝
1.下載RPM包並安裝
wget https://dl.grafana.com/oss/release/grafana-5.4.2-1.x86_64.rpm
yum install grafana-5.4.2-1.x86_64.rpm
yum install initscripts -y
2.啟動grafana
通過init.d方式啟動
service grafana-server start
/sbin/chkconfig --add grafana-server
通過systemd啟動
systemctl daemon-reload
systemctl start grafana-server
systemctl enable grafana-server.service
3.修改存儲數據庫為mysql
默認使用sqlite3數據庫,可以編輯配置文件/etc/grafana/grafana.ini,修改使用的數據庫,可以選擇mysql或者postgres,默認數據庫文件位置/var/lib/grafana/grafana.db
創建grafana數據庫
create database grafana character set utf8 collate utf8_general_ci;
編輯grafana配置文件
vim /etc/grafana/grafana.ini
在[database]段下添加以下內容
type = mysql
host = 192.168.179.131:3306
name = grafana
user = root
password = "123456"
重啟grafana會報一個錯,因為我使用的是mysql8.0的數據庫,他不支持授權方法caching_sha2_password,解決方法是配置root用戶使用mysql_native_password身份驗證插件連接器
reason="Service init failed: Migration failed err: this authentication plugin is not supported
alter user [email protected]‘%‘ identified with mysql_native_password by ‘123456‘;
select user, plugin from mysql.user;
4.添加數據源
首先添加一個elasticsearch的數據源
使用kibana展示數據
數據展示完成如下所示
下面開始進行逐一添加
創建訪問IP排行
首先創建一個柱形圖
選擇索引模式或者保存的搜索
定義x軸信息,並把clientip字段作為求和的值
單擊保存就可以創建圖形了
創建訪問IP的坐標地圖
這一項需要依賴geoip插件,坐標地圖需要有地理坐標的數據類型geo_point存在,但是es創建動態映射不會定義這些特殊的數據類型,這就需要我們自己定義映射模板,mapping信息可以復制之前自動創建的映射內容,然後修改coordinate的數據類型為geo_point就可以了,mapping信息可以從這裏復制。
然後我們在dev tools中定義索引的模板,下圖是我之前定義好的模板,創建模板使用put請求,
關於geo_point數據類型可以查看
官方文檔
修改完之後可以刪除索引並重新生成新的索引,然後需要刪除索引模式,並重新創建索引模式,不然地圖上可能會沒有數據。
創建坐標地圖
選擇索引模式
選擇具有geo_point類型的字段
保存之後就可以看到正常的地圖了
使用grafana展示數據
創建一個博客訪問量的圖形
歡迎各位關註我的公眾號"沒有故事的陳師傅"
自建elk+filebeat+grafana日誌收集平臺