自动化日志收集分析平台ELKstack

字数 2833阅读 5672

ELK-Stack简介

ELK是elasticsearch,logstash以及kibana的简称。
 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 大多数电商搜索都是基于lucene,百度早期,订单搜索,商品搜索等。 ES使用lucene作为核心,官网:www.elastic.co
 Logstash是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。在ELK场景下,用Elasticsearch作为后台数据的存储,kibana用来前端的报表展示。Logstash在其过程中担任搬运工的角色,它为数据存储,报表查询和日志解析创建了一个功能强大的管道链。Logstash提供了多种多样的 input,filters,codecs和output组件,让使用者轻松实现强大的功能。
 Kibana 是一个为 Logstash 和 ElasticSearch 提供的日志分析的 Web 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。

  • logstash 管理日志和事件的工具
  • ElasticSearch 搜索
  • Kibana4 功能强大的数据显示客户端
  • redis 缓存

ELKstack优点

  • 处理方式灵活:Elasticsearch 是实时全文索引,不需要像 storm 那样预先编程才能使用;
  • 配置简易上手:Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计;
  • 检索性能高效:虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到百亿级数据查询的秒级响应;
  • 集群线性扩展:不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的;
  • 前端操作炫丽:Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。

下面将分别对各个组件进行介绍


elasticsearch简介

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

elasticsearch几个重要术语

  • NRT elasticsearch:
    是一个近似实时的搜索平台,从索引文档到可搜索有些延迟,通常为1秒。
  • 集群:
    集群是一个或多个节点存储数据,其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。
  • 节点:
    节点是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然啦,你可以自己定义。该名字也蛮重要的,在集群中用于识别服务器对应的节点。节点可以通过指定集群名字来加入到集群中。默认情况下,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。
  • 索引:
    索引是有几分相似属性的一系列文档的集合。如nginx日志索引、syslog索引等等。索引是由名字标识,名字必须全部小写。这个名字用来进行索引、搜索、更新和删除文档的操作。索引相对于关系型数据库的库。
  • 类型:
    在一个索引中,可以定义一个或多个类型。类型是一个逻辑类别还是分区完全取决于你。通常情况下,一个类型被定于成具有一组共同字段的文档。如ttlsa运维生成时间所有的数据存入在一个单一的名为logstash-ttlsa的索引中,同时,定义了用户数据类型,帖子数据类型和评论类型。类型相对于关系型数据库的表。
  • 文档:
    文档是信息的基本单元,可以被索引的。文档是以JSON格式表现的。在类型中,可以根据需求存储多个文档。虽然一个文档在物理上位于一个索引,实际上一个文档必须在一个索引内被索引和分配一个类型。文档相对于关系型数据库的列。
  • 分片和副本:
    在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个十亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。分片的两个最主要原因:a、水平分割扩展,增大存储量b、分布式并行跨分片操作,提高性能和吞吐量分布式分片的机制和搜索请求的文档如何汇总完全是有elasticsearch控制的,这些对用户而言是透明的。网络问题等等其它问题可以在任何时候不期而至,为了健壮性,强烈建议要有一个故障切换机制,无论何种故障以防止分片或者节点不可用。为此,elasticsearch让我们将索引分片复制一份或多份,称之为分片副本或副本。副本也有两个最主要原因:高可用性,以应对分片或者节点故障。出于这个原因,分片副本要在不同的节点上。提供性能,增大吞吐量,搜索可以并行在所有副本上执行。总之,每一个索引可以被分成多个分片。索引也可以有0个或多个副本。复制后,每个索引都有主分片(母分片)和复制分片(复制于母分片)。分片和副本数量可以在每个索引被创建时定义。索引创建后,可以在任何时候动态的更改副本数量,但是,不能改变分片数。默认情况下,elasticsearch为每个索引分片5个主分片和1个副本,这就意味着集群至少需要2个节点。索引将会有5个主分片和5个副本(1个完整副本),每个索引总共有10个分片。每个elasticsearch分片是一个Lucene索引。一个单个Lucene索引有最大的文档数LUCENE-5843, 文档数限制为2147483519(MAX_VALUE – 128)。 可通过_cat/shards来监控分片大小。

logstash简介

LogStash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上。不同于分离的代理端(agent)或主机端(server),LogStash可配置单一的代理端(agent)与其它开源软件结合,以实现不同的功能。

logStash的四大组件

  • Shipper: 发送事件(events)至LogStash;通常,远程代理端(agent)只需要运行这个组件即可
  • Broker and Indexer:接收并索引化事件
  • Search and Storage:允许对事件进行搜索和存储
  • Web Interface:基于Web的展示界面正是由于以上组件在LogStash架构中可独立部署,才提供了更好的集群扩展性。

LogStash主机分类

  • 代理主机(agent host):作为事件的传递者(shipper),将各种日志数据发送至中心主机,只需运行Logstash 代理(agent)程序。
  • 中心主机(central host):可运行包括中间转发器(Broker)、索引器(Indexer)、搜索和存储器(Search and Storage)、Web界面端(Web Interface)在内的各个组件,以实现对日志数据的接收、处理和存储。

Kibana简介

Kibana 也是一个开源和免费的工具,他可以帮助您汇总、分析和搜索重要数据日志并提供友好的web界面。他可以为 Logstash 和 ElasticSearch 提供的日志分析的 Web 界面,展示效果非常棒,也是我们日常见的最多的ELK组件。

使用ELK必要性(解决运维痛点)

  • 开发人员不能登录线上服务器查看详细日志,提取日志耗费工时。
  • 日至数据分散,查找困难。
  • 日志数据量大,查询速度慢,或者数据不够实时。
  • 日志数据管理和审计困难。

OK:不要干,就是怂。Here we go!


</br>


安装前准备

关闭防火墙和selinux
本机系统:CentOS6.7
本机IP:
主192.168.56.11
 192.168.56.12
#PS:在es配置集群时可以添加多台主机,直接分片即可。

chkconfig ip6tables off
chkconfig iptables  off
/etc/init.d/iptables stop
#关闭防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
grep SELINUX=disabled /etc/selinux/config
setenforce 0
关闭selinux

安装es

rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
#配置yum源

yum install -y elasticsearch
#yum安装es

安装logstash

vim /etc/yum.repos.d/logstash.repo
[logstash-2.1]
name=Logstash repository for 2.1.x packages
baseurl=http://packages.elastic.co/logstash/2.1/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
#配置yum源

yum install -y logstash
#yum安装logstash

安装JDK

mv jdk-7u79-linux-x64.tar.gz /usr/local/src/
#首先上传JDK到相应目录

cd /usr/local/src && tar zxf jdk-7u79-linux-x64.tar.gz && mv jdk1.7.0_79 /usr/local/jdk && chown -R root:root /usr/local/jdk

配置环境变量

vi /etc/profile
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

使环境变量生效

source /etc/profile
java -version

安装Kibana

wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
tar zxf kibana-4.3.1-linux-x64.tar.gz
mv kibana-4.3.1-linux-x64 /usr/local/
ln -s /usr/local/kibana-4.3.1-linux-x64/ /usr/local/kibana

配置es集群

[root@elk ~]# cd /etc/elasticsearch/
[root@elk elasticsearch]# vi elasticsearch.yml
##17 集群名称 #多台集群名称一样
##23 节点名称 #节点名称不同
##33 data路径
##37 日志路径
##43 启用不使用叫交换分区
##54 监听地址
##58 监听端口

以下为详细配置

[root@elk elasticsearch]# chown -R elasticsearch:elasticsearch /data/es-data/
[root@elk elasticsearch]# grep -n '^[a-Z]' elasticsearch.yml
17:cluster.name: elk-jy
23:node.name: elk-1
33:path.data: /data/es-data
37:path.logs: /var/log/elasticsearch/
43:bootstrap.mlockall: true
54:network.host: 0.0.0.0
58:http.port: 9200

启动es

[root@elk elasticsearch]# /etc/init.d/elasticsearch start

编写logstash配置文件

vim /etc/logstash/file.conf

input {
    file {
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
    }
}
output {
    elasticsearch {
        hosts => ["192.168.56.11:9200"]
        index => "system-%{+YYYY.MM.dd}"
    }
}
#具体文件写法下面会详细介绍

启动logstash

/opt/logstash/bin/logstash -f  /etc/logstash/file.conf

启动Kibana

/usr/local/kibana/bin/kibana

登录到Kibana

浏览器登录到:
http://192.168.56.11:5601/app/kibana#

Kibana页面

END.

OK今天就为大家介绍这么多了。
我是EC君,如果你喜欢我的文章,请帮忙点个关注!点个喜欢吧!
也可以点击作者信息,扫描微信二维码关注我的个人微信公众号。
你的鼓励将是我们共同进步的源泉。

推荐阅读更多精彩内容