您的位置:首页 > 业界新闻

互联网亿级日志实时分析平台—ELK

2017-11-29 16:04 387 查看
一,前言人们常常说数据如金,可是,能被利用起的数据,才是“金”。而互联网的数据,常常以日志的媒介的形式存在,并需要从中提取其中的"数据"。
从这些数据中,我们可以做用户画像(每个用户都点了什么广告,对哪些开源技术感兴趣),安全审计,安全防护(如果1小时内登录请求数到达一定值就报警),业务数据统计(如开源中国每天的博客数是多少,可视化编辑格式和markdown格式各占比例是多少)等等。
之所以能做这些,是因为用户的所有的行为,都将被记录在nginx日志中或其它web服务器的日志中。日志分析要做的就是将这些日志进行结构化,方便我们的业务人员快速查询。日志分析平台要做的就是这些。
说完这些,你是不是觉得日志分析平台很难做,需要十人的团队加班几个月才能完成?
自从有了Elasticsearch、Logstash、Kibana,俗称ELK,小公司也可以很轻松地做日志分析了。说白了,1天几G的日志,ELK完全可以吃得消。就像标题说的,只需要1个人半小时就可以搭建好了。
二,集中式日志分析平台特点
收集-能够采集多种来源的日志数据
传输-能够稳定的把日志数据传输到中央系统
存储-如何存储日志数据
分析-可以支持UI分析
警告-能够提供错误报告,监控机制ELK完美的解决上述场景。

三,ELKStack简介

ELK不是一款软件,而是Elasticsearch、Logstash和Kibana三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于Elastic.co公司名下,所以被简称为ELKStack。根据GoogleTrend的信息显示,ELKStack已经成为目前最流行的集中式日志解决方案。Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于ApacheLucene构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;
Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;
Kibana:数据分析和可视化平台。通常与Elasticsearch配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;
Filebeat:ELK协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于Logstash-Forwarder源代码开发,是对它的替代。在需要采集日志数据的server上安装Filebeat,并指定日志目录或日志文件后,Filebeat
就能读取数据,迅速发送到Logstash进行解析,亦或直接发送到Elasticsearch进行集中式存储和分析。

四,ELK常用架构及使用场景

最简单架构

在这种架构中,只有一个Logstash、Elasticsearch和Kibana实例。Logstash通过输入插件从多种数据源(比如日志文件、标准输入Stdin等)获取数据,再经过滤插件加工数据,然后经Elasticsearch输出插件输出到Elasticsearch,通过Kibana展示。详见图1。
图1.最简单架构



这种架构非常简单,使用场景也有限。初学者可以搭建这个架构,了解ELK如何工作。

Logstash作为日志搜集器

这种架构是对上面架构的扩展,把一个Logstash数据搜集节点扩展到多个,分布于多台机器,将解析好的数据发送到Elasticsearchserver进行存储,最后在Kibana查询、生成日志报表等。详见图2。
图2.Logstash作为日志搜索器



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

Beats作为日志搜集器

这种架构引入Beats作为日志搜集器。目前Beats包括四种:Packetbeat(搜集网络流量数据);
Topbeat(搜集系统、进程和文件系统级别的CPU和内存使用情况等数据);
Filebeat(搜集文件数据);
Winlogbeat(搜集Windows事件日志数据)。
Beats将搜集到的数据发送到Logstash,经Logstash解析、过滤后,将其发送到Elasticsearch存储,并由Kibana呈现给用户。详见图3。图3.Beats作为日志搜集器
这种架构解决了Logstash在各服务器节点上占用系统资源高的问题。相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计。另外,Beats和Logstash之间支持SSL/TLS加密传输,客户端和服务器双向认证,保证了通信安全。
因此这种架构适合对数据安全性要求较高,同时各服务器性能比较敏感的场景。

引入消息队列机制的架构

这种架构使用Logstash从各个数据源搜集数据,然后经消息队列输出插件输出到消息队列中。目前Logstash支持Kafka、Redis、RabbitMQ等常见消息队列。然后Logstash通过消息队列输入插件从队列中获取数据,分析过滤后经输出插件发送到Elasticsearch,最后通过Kibana展示。详见图4。图4.引入消息队列机制的架构


这种架构适合于日志规模比较庞大的情况。但由于Logstash日志解析节点和Elasticsearch的负荷比较重,可将他们配置为集群模式,以分担负荷。引入消息队列,均衡了网络传输,从而降低了网络闭塞,尤其是丢失数据的可能性,但依然存在Logstash占用系统资源过多的问题。

基于Filebeat架构的配置部署详解

前面提到Filebeat已经完全替代了Logstash-Forwarder成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。这个章节将详细讲解如何部署基于Filebeat的ELK集中式日志解决方案,具体架构见图5。图5.基于Filebeat的ELK集群架构


因为免费的ELK没有任何安全机制,所以这里使用了Nginx作反向代理,避免用户直接访问Kibana服务器。加上配置Nginx实现简单的用户认证,一定程度上提高安全性。另外,Nginx本身具有负载均衡的作用,能够提高系统访问性能。五,实战

具体安装过程如下

步骤1,安装JDK
步骤2,安装Elasticsearch
步骤3,安装Kibana
步骤4,安装Nginx
步骤5,安装Logstash
步骤6,配置Logstash
步骤7,安装Logstash-forwarder
步骤8,最终验证

安装前的准备

两台64位虚拟机,操作系统是Ubuntu14.04,2CPU,4G内存,30G硬盘
两台64位虚拟机,操作系统是CentOS7.1,2CPU,4G内存,30G硬盘
创建用户elk和组elk,以下所有的安装均由这个用户操作,并授予sudo权限
如果是CentOS,还需要配置官方YUM源,可以访问CentOS软件包
注意:以下所有操作都是在两个平台上完成。

步骤1,安装JDK

Elasticsearch要求至少Java7。一般推荐使用OracleJDK1.8或者OpenJDK1.8。我们这里使用OpenJDK1.8。Ubuntu14.04加入Java软件源(Repository)
1
$sudoadd-apt-repositoryppa:openjdk-r/ppa

更新系统并安装JDK
1
2
$sudoapt-getupdate

$sudoapt-getinstallopenjdk-8-jdk

验证Java
1
2
3
4
$java-version

openjdkversion"1.8.0_45-internal"

OpenJDKRuntimeEnvironment(build1.8.0_45-internal-b14)

OpenJDK64-BitServerVM(build25.45-b02,mixedmode)

CentOS7.1配置YUM源
1
2
$cd/etc/yum.repos.d

$sudovicentos.repo

加入以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
[base]

name=CentOS-$releasever-Base

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#releasedupdates

[updates]

name=CentOS-$releasever-Updates

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra

#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/

gpgcheck=1

gpgkey=<
a
href
=
"../../../../../etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7"
><
code
>file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</
code
></
a
>

安装JDK
1
$sudoyuminstalljava-1.8.0-openjdk

验证Java
1
2
3
4
$java-version

openjdkversion"1.8.0_65"

OpenJDKRuntimeEnvironment(build1.8.0_65-b17)

OpenJDK64-BitServerVM(build25.65-b01,mixedmode)

步骤2,安装Elasticsearch

Ubuntu14.04下载Elasticsearch软件
$wget
https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.1.0/elasticsearch-2.1.0.tar.gz解压
1
$tarxzvfelasticsearch-2.1.0.tar.gz

文件目录结构如下:
1
2
3
4
$pwd

/home/elk/elasticsearch-2.1.0

$ls

binconfiglibLICENSE.txtNOTICE.txtREADME.textile

修改配置文件
1
2
$cdconfig

$vielasticsearch.yml

找到#network.host一行,修改成以下:
1
network.host:localhost

启动elasticsearch
1
2
$cd../bin

$./elasticsearch

验证elasticsearch
1
2
3
4
5
6
7
8
9
10
11
12
13
$curl'localhost:9200/'

{

"name":"Surge",

"cluster_name":"elasticsearch",

"version":{

"number":"2.1.0",

"build_hash":"72cd1f1a3eee09505e036106146dc1949dc5dc87",

"build_timestamp":"2015-11-18T22:40:03Z",

"build_snapshot":false,

"lucene_version":"5.3.1"

},

"tagline":"YouKnow,forSearch"

}

CentOS7.1步骤和上述Ubuntu14.04安装完全一致

步骤3,安装Kibana

Ubuntu14.04下载Kibana安装软件
$wget
https://download.elastic.co/kibana/kibana/kibana-4.3.0-linux-x64.tar.gz解压
1
$tarxzvfkibana-4.3.0-linux-x64.tar.gz

文件目录结构如下:
1
2
3
4
5
$pwd

/home/elk/kibana-4.3.0-linux-x64

$ls

binconfiginstalledPluginsLICENSE.txtnodenode_modulesoptimize

package.jsonREADME.txtsrcwebpackShims

修改配置文件
1
2
$cdconfig

$vikibana.yml

找到#server.host,修改成以下:
1
server.host:“localhost”

启动Kibana
1
2
3
4
5
$cd../bin

$./kibana

[…]

log[07:50:29.926][info][listening]Serverrunningat'target='_blank'>http://localhost:5601[/code]
[…]

验证Kibana由于我们是配置在localhost,所以是无法直接访问Web页面的。可以使用netstat来检查缺省端口5601,或者使用curl:
1
2
3
4
5
6
7
8
9
10
$curllocalhost:5601

<script>
var
hashRoute=
'/app/kibana'
;

var
defaultRoute=
'/app/kibana'
;


var
hash=window.location.hash;

if
(hash.length){

window.location=hashRoute+hash;

}
else
{

window.location=defaultRoute;

}
</script>

CentOS7.1步骤和上述Ubuntu14.04安装完全一致。

步骤4,安装Nginx

Nginx提供了反向代理服务,可以使外面的请求被发送到内部的应用上。Ubuntu14.04安装软件
1
$sudoapt-getinstallnginxapache2-utils

修改Nginx配置文件
1
$sudovi/etc/nginx/sites-available/default

找到server_name,修改成正确的值。或者使用IP,或者使用FQDN。然后在加入下面一段内容:
1
2
3
4
5
6
7
8
9
10
11
12
server{

listen80;

server_nameexample.com;

location/{

proxy_pass'target='_blank'>http://localhost:5601;[/code]
proxy_http_version1.1;

proxy_set_headerUpgrade$http_upgrade;

proxy_set_headerConnection'upgrade';

proxy_set_headerHost$host;

proxy_cache_bypass$http_upgrade;


}

注意:建议使用IP。重启Nginx服务
1
$sudoservicenginxrestart

验证访问http://FQDN或者CentOS'target='_blank'>http://IPCentOS7.1配置Nginx官方yum源
1
2
3
4
5
6
$sudovi/etc/yum.repos.d/nginx.repo

[nginx]

name=nginxrepo

baseurl=http://nginx.org/packages/centos/7/$basearch/

gpgcheck=0

enabled=1

安装软件
1
$sudoyuminstallnginxhttpd-tools

修改Nginx配置文件
1
$sudovi/etc/nginx/nginx.conf

检查是否http块(http{...})含有下面这一行:
1
include/etc/nginx/conf.d/*conf

为Kibana创建一个配置文件
1
$sudovi/etc/nginx/conf.d/kibana.conf

加入以下这一段内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
server{

listen80;


server_nameexample.com;


location/{

proxy_pass'target='_blank'>http://localhost:5601;[/code]
proxy_http_version1.1;

proxy_set_headerUpgrade$http_upgrade;

proxy_set_headerConnection'upgrade';

proxy_set_headerHost$host;

proxy_cache_bypass$http_upgrade;

}


注意:建议使用IP。启动Nginx服务
1
2
$sudosystemctlenablenginx

$sudosystemctlstartnginx

验证访问http://FQDN或者步骤'target='_blank'>http://IP

步骤5,安装Logstash

Ubuntu14.04下载Logstash安装软件
1
$wget'target='_blank'>https://download.elastic.co/logstash/logstash/logstash-2.1.1.tar.gz[/code]
解压
1
$tarxzvflogstash-2.1.1.tar.gz

文件目录结构如下:
1
2
3
4
5
$pwd

/home/elk/logstash-2.1.1


$ls

binCHANGELOG.mdCONTRIBUTORSGemfileGemfile.jruby-1.9.locklibLICENSENOTICE.TXTvendor

验证Logstash
1
2
3
4
$cdbin

$./logstash-e'input{stdin{}}output{stdout{}}'

Settings:Defaultfilterworkers:1

Logstashstartupcompleted

显示如下:
1
2
helloelkstack

2015-12-14T01:17:24.104Z0.0.0.0helloelkstack

说明Logstash已经可以正常工作了。按CTRL-D退出CentOS7.1步骤和上述Ubuntu14.04安装完全一致。

步骤6,配置Logstash

我们需要配置Logstash以指明从哪里读取数据,向哪里输出数据。这个过程我们称之为定义Logstash管道(LogstashPipeline)。通常一个管道需要包括必须的输入(input),输出(output),和一个可选项目Filter。见图7。图7.Logstash管道结构示意标准的管道配置文件格式如下:
1
2
3
4
5
6
7
8
9
10
#The#characteratthebeginningofalineindicatesacomment.Use

#commentstodescribeyourconfiguration.

input{

}

#Thefilterpartofthisfileiscommentedouttoindicatethatitis

#optional.

#filter{

#}

output{

}

每一个输入/输出块里面都可以包含多个源。Filter是定义如何按照用户指定的格式写数据。由于我们这次是使用logstash-forwarder从客户机向服务器来传输数据,作为输入数据源。所以,我们首先需要配置SSL证书(Certification)。用来在客户机和服务器之间验证身份。Ubuntu14.04配置SSL
1
2
$sudomkdir-p/etc/pki/tls/certsetc/pki/tls/private

$sudovi/etc/ssl/openssl.cnf

找到[v3_ca]段,添加下面一行,保存退出。
1
subjectAltName=IP:logstash_server_ip

执行下面命令:
1
2
3
$cd/etc/pki/tls

$sudoopensslreq-config/etc/ssl/openssl.cnf-x509-days3650-batch-nodes-newkeyrsa:2048-keyout

private/logstash-forwarder.key-outcerts/logstash-forwarder.crt

这里产生的logstash-forwarder.crt文件会在下一节安装配置Logstash-forwarder的时候使用到。配置Logstash管道文件
1
2
3
$cd/home/elk/logstash-2.1.1

$mkdirconf

$visimple.conf

添加以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
input{

lumberjack{

port=>5043

type=>"logs"

ssl_certificate=>"/etc/pki/tls/certs/logstash-forwarder.crt"

ssl_key=>"/etc/pki/tls/private/logstash-forwarder.key"

}

}

filter{

grok{

match=>{"message"=>"%{COMBINEDAPACHELOG}"}

}

date{

match=>["timestamp","dd/MMM/yyyy:HH:mm:ssZ"]

}

}

output{

elasticsearch{hosts=>["localhost:9200"]}

stdout{codec=>rubydebug}

}

启动Logstsh
1
2
$cd/home/elk/logstash-2.1.1/bin

$./logstash-f../conf/simple.conf

CentOS7.1在CentOS7.1上配置Logstash,只有一步配置SSL是稍微有点不同,其他全部一样。
1
$sudovi/etc/pki/tls/openssl.cnf

找到[v3_ca]段,添加下面一行,保存退出。
1
2
3
4
5
subjectAltName=IP:logstash_server_ip


$cd/etc/pki/tls

$sudoopensslreq-config/etc/pki/tls/openssl.cnf-x509-days3650-batch-nodes-newkey

rsa:2048-keyoutprivate/logstash-forwarder.key-outcerts/logstash-forwarder.crt

这里产生的logstash-forwarder.crt文件会在下一节安装配置Logstash-forwarder的时候使用到。

步骤7,安装Logstash-forwarder

注意:Logstash-forwarder也是一个开源项目,最早是由lumberjack改名而来。在作者写这篇文章的时候,被吸收合并到了Elastic.co公司的另外一个产品Beat中的FileBeat。如果是用FileBeat,配置稍微有些不一样,具体需要去参考官网。Ubuntu14.04安装Logstash-forwarder软件注意:Logstash-forwarder是安装在另外一台机器上。用来模拟客户机传输数据到Logstash服务器。配置Logstash-forwarder安装源执行以下命令:
1
2
$echo'debhttp://packages.elastic.co/logstashforwarder/debian

stablemain'|sudotee/etc/apt/sources.list.d/logstashforwarder.list

$wget-qO-https://packages.elastic.co/GPG-KEY-elasticsearch|sudoapt-keyadd-安装软件包
1
2
$sudoapt-getupdate

$sudoapt-getinstallLogstash-forwarder

配置SSL
1
$sudomkdir-p/etc/pki/tls/certs

把在步骤六中在Logstash服务器上产生的ssl证书文件拷贝到刚刚创建出来的目录下:
1
$sudoscpuser@logstash_server:/etc/pki/tls/certs/logstash_forwarder.crt/etc/pki/tls/certs/

配置Logstash-forwarder
1
$sudovi/etc/logstash-forwarder.conf

在network段("network":{),修改如下:
1
2
3
"servers":["logstash_server_private_address:5043"],

"sslca":"/etc/pki/tls/certs/logstash-forwarder.crt",

"timeout":15

在files段("files":[),修改如下:
1
2
3
4
5
6
7
{

"paths":[

"/var/log/syslog",

"/var/log/auth.log"

],

"fields":{"type":"syslog"}

}

启动Logstash-forwarder
1
$sudoservicelogstash-forwarderstart

验证Logstash-forwarder
1
2
$sudoservicelogstash-forwarderstatus

logstash-forwarderisrunning

如果有错误,则需要去/var/log/logstash-forwarder目录下面检查。CentOS7.1配置Logstash-forwarder安装源执行以下命令:
1
2
3
$sudorpm--import'target='_blank'>http://packages.elastic.co/GPG-KEY-elasticsearch[/code]
$sudovi/etc/yum.repos.d/logstash-forwarder.repo

加入以下内容:
1
2
3
4
5
6
[logstash-forwarder]

name=logstash-forwarderrepository

baseurl=http://packages.elastic.co/logstashforwarder/centos

gpgcheck=1

gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch

enabled=1

存盘退出。安装软件包
1
$sudoyum-yinstalllogstash-forwarder

剩余步骤和上述在Ubuntu14.04上面的做法完全一样。

步骤8,最后验证

在前面安装Kibana的时候,曾经有过验证。不过,当时没有数据,打开Web页面的时候,将如下所示:图8.无数据初始页面现在,由于logstash-forwarder已经开始传输数据了,再次打开Web页面,将如下所示:图9.配置索引页面点击创建按钮(Create),在选择Discover,可以看到如下画面:图10.数据展示页面

至此,所有部件的工作都可以正常使用了。关于如何具体使用Kibana就不在本文中加以描述了,有兴趣的同学可以参考官网。文章参考出处:https://my.oschina.net/zjzhai/blog/751246https://www.zybuluo.com/dume2007/note/665868https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/index.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ELK