使用 elasticsearch、LogStash、Kibana完成网站流量的监控系统(基于nginx的访问日志实现流量监控) - Go语言中文社区

使用 elasticsearch、LogStash、Kibana完成网站流量的监控系统(基于nginx的访问日志实现流量监控)


分布式带来的变革:

    多节点、日志分散、运维成本高

 

先看几个实际的案例。

    各自的解决方案

    一些比较主流的集中式日志管理系统

     简单的Rsyslog

     商业化的 Splunk

     开源的有 Facebook 公司的 Scribe  Apache 的 Chukwa、ELK

 

ELK 是一整套解决方案,是三个软件产品的首字母的缩写,能够自动收集日志,统一把日志收集到一个地方,自动收集报表

Elasticsearch、Logstash、Kibana

 

Elasticsearch:

    Java语言编写的实时的分布式搜索和分析引擎,他可以用于全文搜索,结构化搜索以及分析

Logstash:

   Jruby语言编写,是一个具有实时渠道能力的数据收集引擎,包含输入、过滤、输出模块,一般在过滤模块中做日志格式化的解析工作,把数据进行统一的收集过滤,统一输出。

Kibana:

  为Elasticsearch提供分析和可视化的 Web平台。他可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度的表图。

 

这种结构因为需要在各个服务器上部署 Logstash,而它比较消耗CPU和内存的资源,所以比较适合计算资源比较丰富的服务器,否则容易造成服务器性能下降,甚至可能导致无法正常工作,这是不可忍受的。

logstash是一个矿工,挖矿者,因为 logstash 主要承担日志收集的工作,日志来自于业务系统产生的日志可能是javaee、inet、php 编写的或者其他语言,只要有日志就行,logstash还承担了日志过滤的功能,过滤日志的格式,处理结果发布到

elasticsearch,把所有日志存储到仓库当中,提供全文检索服务,提供快速检索操作。提供分布式存储。

kibana 完成可视化的工作,数据来源于 elasticsearch,与es建立连接,实时的读取到 es 中的数据变化,只要数据变化了,图形就变化了

 

现场搭建 elk 的环境实现

 

第一步:

首先在搭建 elasticsearch 的集群之前我们需要明确的是 easticsearch中的三个节点的数据都是空的,如果不是空的的话,很容易出现下面的这个错误:

with the same id but is a different node instance

所以首先要记得备份自己elasticsearch 中的数据,然后删除掉三台机器的 elasticsearch 中的data目录下的nodes文件夹,然后再进行集群的操作

 

首先先配置一台 elasticsearch,来到elasticsearch 中的 config 目录下,编辑 elasticsearch.yml 这个文件.

更改下面的属性参数:

http.cors.enabled : true
http.cors.allow-origin : "*"
http.cors.allow-methods : OPTIONS,HEAD,GET,POST,PUT,DELETE
http.cors.allow-headers : "X-Requested-With,Content-Type,Content-Length,X-User"

cluster.name: tom-test
node.name: master
#这个节点是主节点
node.master: true
network.host: 127.0.0.1

 

slave1这样进行配置:

cluster.name: tom-test
node.name: slave-1
network.host: 127.0.0.1
http.port: 8200

#这个配置的是从节点的集群ip组
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]

 

slave2这样进行配置:

cluster.name: tom-test
node.name: slave-2
network.host: 127.0.0.1
http.port: 8201

#这个配置的是从节点的集群ip组
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
 

 

然后分别进入三个es的bin目录下运行 elasticsearch.bat

运行之前先改下三台机器的 elasticsearch.bat 文件,更改其title 属性,分别如下,方便等下进行识别的工作

TITLE Elasticsearch 5.1.1 - master

TITLE Elasticsearch 5.1.1 - slave1

TITLE Elasticsearch 5.1.1 - slave2

 

然后分别启动三台 elasticsearch,在浏览器上输入 localhost:9200  localhost:8200  localhost:8201 

都能够看到这样的界面:

 

可以启动一个 elasticsearch 的可视化界面,需要在 github上下载这个软件 

安装 node.js 然后 npm run start 进行启动的从操作

浏览器输入 localhost:9100  可以访问到可视化界面如下图:

出现这样的界面表示三台elasticsearch集群成功,可以看到右边的集群健康值是绿色的表示状态正常,集群健康还可能出现黄色和红色,由于刚才删掉了集群中data目录中的数据,所以这里看到的数据索引 index 值都是空的

 

第二步:

启动 logstash :

在logstash的bin目录下执行下面的命令:

logstash -e 'input { stdin {}  } output {stdout {} }'

这是ruby的语法,设置控制台输入,控制台输出

Logstash非常耗性能,所以可以查看电脑的cpu和内存的性能,消耗比较严重的话表示Logstash已经启动了,在任务管理器中可以查看

同时启动的那句命令行会有下面的输出表示 Logstash 已经启动成功:

这里先停掉 Logstash。

 

第三步:使用logstash作为日志采集(矿工),elasticsearch作为日志存储的系统,在 Logstash 的config目录下建立一个文件

logstash.conf文件,并且在里面编写下面的内容:

input{
	file{
		path => ["D:javanginx-1.14.0logsaccess.log"]	
		type => "nginx_access"
		start_position => "beginning"
	}
}

output{
	stdout{
		codec => rubydebug
	}
}

注意上面配置中的 file 中的 path,对应的是 nginx的日志路径

 

安装nginx,然后先把nginx logs目录下的 access.log 这个文件删除

然后再新建一个空的文件  access.log  这个文件 

然后需要配置nginx的log 具体在这里配置:

nginx.conf 文件:

在 http的那个大括号里面配置下面的两个属性

#用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)
log_format  main  '$remote_addr - $remote_user [$time_local] "$request"'
  
#用来指定日志文件的路径以及使用何种日志格式记录日志
access_log  logs/access.log  main;

nginx的发布文件资源路径在这里配置,修改 root 和 index即可

 server 
{
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location / {
            root   F:uploadImages;
            index  index.html index.htm;
		}
}

 

然后启动nginx,   windows 平台可以使用 nginx.exe & 命令 或者 start nginx 命令

可以访问以下 nginx 中的资源,看到nginx中的access.log 这个文件中的数据是在不断变化的

由于刚刚在 Logstash 的logstash.conf 文件中配置了 nginx的日志  access.log 文件的位置,所以我们看到刚刚使用 logstash -f ../config/logstash.conf 这个命令 打开的 Logstash 的控制端数据也一直在变化

 

接下来还要配置 Logstash 匹配 nginx 日志:

(编辑 logstash目录下的 configpatternsnginx   这个文件,没有这个文件的话自行创建 )内容如下:

NGINXACCESS %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth}[%{HTTPDATE:timestamp}]
"(?:%{WORD:verb} %{URIPATH:uri}%{URIPARAM:Param} (?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest} )"
%{NUMBER:response} (?:%{NUMBER:bytes} |-)

NGINXACCESSLOG %{NGINXACCESS} %{QS:referrer} %{QS:agent} %{QS:x_forward_for}

 

 

然后再编辑一下  logstash.conf  这个文件,内容如下:

input{
	file{
		path => ["D:javanginx-1.14.0logsaccess.log"]	
		type => "nginx_access"
		start_position => "beginning"
	}
}

output{
	
	elasticsearch {
#这里记得写的是hosts,因为可能会是集群的 elasticsearch,但是配置的之后只要写上主节点就行了	
        hosts => "localhost:9200"
#规定存储日志的索引规则,动态配置,方便管理
        index => "logstash_%{type}=%{+YYYY.MM.dd}"
# type 里的参数 就是上面配置的 nginx_access		
		document_type => "%{type}"
    }
	
    stdout{
        codec=>rubydebug
    }
}

 

把logstash收集到的nginx日志导入到 elasticsearch当中去:

重启一下 刚刚配置好的 logstash.conf 文件 ,然后刷新访问 nginx 中的资源文件,这个时候会发现,日志已经存储到 elasticsearch 当中去了,多次刷新就会出现类似下面的结果。

注意在 elasticsearch 中的 index 和 type 的命令规则是在前面的 logstash.conf 文件中定义好的

 

接下来我们使用 kibana对es收集到的日志进行图形化的展示操作。(kibana的版本必须和 elasticsearch的版本一致)

启动 kibana,默认端口号 5601,可以在 config 目录下的  kibana.yml 文件当中进行配置

启动之后界面如下所示:

按照图上标注的步骤进行操作,创建完了 pattern 之后刷新页面,点击第一个菜单 Discover,可以看到收集的日志已经被当做图表的形式进行了展示。

这个时候刷新访问 nginx 发布的资源,然后再刷新这个界面,可以看到对应的生成统计图会发生变化

 

可以使用 kibana 生成不同形态的图形(点击第二个菜单 Visualize):界面如下:

这里选择一个折线图 LineChart,会到达这个界面,选择 logstash_*  就是最开始进入kibana时候创建的pattern。

 

然后也可以选择横坐标 x 轴按照时间进行展示,点击运行的三角按钮即可看到下面的图:

按照上图点击两下 save 按钮可以保存图像:

点击主菜单第三个 Dashboard ,点击 add ,选择 Default ,然后再点save save Dashboard

于是就可以在 kibana当中成功的保存了这个生成的图像,每次启动进入 Dashboard便可进行查看

 

在实际的使用过程中一般用户访问的是 html 的时候才是网站的真正流量。需要对日志进行过滤

再次来到 elasticsearch 的 dashboard 那个面板,添加搜索的条件。

输入*.html 即可查询到 只包含html参数信息的流量。

 

Filebeat 简介:

Filebeat可以理解为是一个 Logstash 的轻装上阵,对资源的要求更低,可以保证高采集效率

使用了 FileBeat 之后监控系统的架构就会变成下面这样的。

一般在使用监控系统的时候,elk会采用下面的部署方案:

集群的话架构配置如下:

 

海量日志部署的架构:

日志吞吐量越来越多,日志复杂度变高,这样的架构师不能满足需求的,需要升级。

引入kafka或者activemq

 

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/baidu_24545901/article/details/81170113
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 10:52:12
  • 阅读 ( 1483 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢