最近在做某个项目时客户要求实现广告实时数据报表,paperen也是第一次面对这个需求,由于本来广告就有使用nginx做监播(展示与点击日志),所以查阅了一些资料后决定使用比较轻量的ELK来实现这个需求,先放出平台实时报表的截图

http://paperen.com/file/203

ELK是三个开源软件的缩写,分别表示:Elasticsearch,Logstash,Kibana,都是elsatic下的产品https://www.elastic.co/products

并没有太复杂的东西,简单来说filebeat相当于是一个拉取日志数据,将数据拉到logstash,而logstash中可以配置一些过滤器对数据进行预处理或过滤,最后存到es中

组件简述

服务器:两台(一台跑es与logstash,一台跑filebeat)

搭建组件:通过filebeat将nginx日志的数据实时拉取到logstash,配置logstash的filter对数据进行一定的过滤与预处理(匹配出指定的参数与解析ip)后存到elasticsearch

报表查询:通过elasticsearch一个叫elasticsearch-sql的插件,让es可以使用sql的方式查询,每隔一分钟查询一次,前端使用highchart

具体部署说明

这里直接贴上配置,直接从配置看就能理解了

logstash

input {
    beats {
        port => "5044"
    }
}
filter {
    if "nginx-log" in [tags] {
     grok {
  patterns_dir => "/home/package/logstash-6.4.3/patterns"
  match => { "message" => "%{DSPLOG}" }
     }
     geoip {
  source => "remote_addr"
     }
    }
}
output {
    elasticsearch {
 hosts => [ "bigdata-master:9200" ]
 index => "dsp-%{+YYYY.MM.dd}"
    }
#    stdout { codec => rubydebug }
}
  • input - 输入,这里指定5044为输入的一个端口(相当于开了这个入口给数据输入)
  • filter - 过滤器,由于输入的数据可能是很多的,但是这里咱们只需要得到部分日志同时需要对日志中特殊的数据进行筛选
  • output - 最终输出到es

这里重点说一下filter

  • if条件,这里只筛选出标签为ngixn-log的日志(标签通过filebeat中配置的)
  • grok,由于自定义了一些正则规则,所以这里配置了patterns_dir,仅仅是一个路径,当中可以创建多个正则规则文件,%{DSPLOG}也在正则中定义好的

稍微贴下正则片段

UUID [a-z0-9]{31,32}
LINKID [0-9]+

DSPLOG [%{YEAR:year}-%{MONTH:month}-%{DAY:day}T%{HOUR:hour}:%{MIN:min}:%{SEC:sec}%{TIMEZONE:timezone}] %{IPV4:remote_addr} /report/%{WORD:type}/1.gif?uuid=%{UUID:uuid}&linkid;=%{LINKID:link_id}&cp;=%{CAMPAIGN:campaign_id}&adv;=%{ADVER:advertiser_id}&offer;=%{OFFER:offer_id}&adx;=%{ADX:adx_id}&adtype;=%{ADTYPE:adtype}&ctv;=%{CREATIVE:creative_id}&n=%{WORD:name}&c=%{WORD:channel_id}

对于logstash来说最需要了解的就是filter,更多详细说明可以参看https://www.jianshu.com/p/d46b911fb83e

filebeat

filebeat.prospectors:
- type: log
  paths:
    - /home/logs/1*.log
  tags: ["nginx-log"]
  include_lines: ['offer']
output.logstash:
  hosts: ["bigdata-master:5044"]
  • tags - 就是上面看到logstash配置中指定的那个标签定义
  • include_lines - 仅仅拉取日志中包含某些字符的行

关于filebeat配置的详细说明 https://blog.csdn.net/weixin_39077573/article/details/73467712

对于elasticsearch除了不能使用root启动外,配置并没有需要特殊调整的,这里配置es仅仅调整了network.host

由于报表需要在平台展示所以这里kibana仅仅作为自己调试或开发时使用 http://paperen.com/file/204

收尾

在运行的期间,es曾经出现过自动关闭的情况,所以需要增加自检测功能(通过编写shell实现)

esps=`ps -ef | grep elasticsearch | wc -l`
if [ $esps -lt 4 ];then
        su elasticsearch -l -c "/opt/soft/elasticsearch-6.4.2/bin/elasticsearch -d"
else
        echo 'elasticsearch running'
fi

由于是实时数据,次日数据释放掉就可以了,所以增加定时0点清理es数据功能(crontab+shell实现)

yesterday=`date -d "-1 day" +%Y.%m.%d`
esindex="dsp-$yesterday"
res=`curl -XDELETE -u elasticsearch:elasticsearch http://bigdata-master:9200/$esindex`

目前这个相当于单机环境,而且每天承受的量不是太大接近10w左右,所以对于数据量再大的时候是否出现瓶颈或其他情况仍是个疑问

总的来说这套属于比较轻量的实时统计方案,搭建起来也相对简单与快速