ELKStack日志平台

时间:2023-01-01 20:00:23

1、简介

  今天我们主要分享的是如何利用ELK集群系统收集日志并分析展示,ELKStack主要由elasticsearch、logstash、kibana这三个组件组成。传统收集日志的方式主要是rsyslog日志服务器集中收集管理,结合第三方软件LogAnalyzer展示输出。传统查看日志的方式无非就是常用的tail、grep、awk等,不管怎么说处理小规模还是能接受的,在规模较大的场景中,此方法效率低下。日志量太大、文本搜索太慢、如何归档、如何多维度查询,这些都是管理海量日志面临的问题。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集、管理、访问,但是集中的架构还是无法解决日志处理压力大的问题,此时ELKStack的分布式模型就可以解决这些问题。

Elasticsearch是一个基于Lucene实现的开源、分布式、Restful的全文本搜索引擎;此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。

ELKStack日志平台

ELKStack日志平台

Logstash是一个用来搜集、分析、过滤日志的工具。支持多数据获取机制,通过TCP/UDP协议、文件、syslog、windows EventLogs及STDIN等;获取到数据后,它支持对数据执行过滤、修改等操作。

ELKStack日志平台

Kibana是一个开源的分析与可视化平台,基于Web的图形界面,用于搜索、分析和可视化存储在Elasticsearch指标中的日志数据。可以通过Kibana进行搜索利用Elasticsearch的REST接口来检索数据,不仅允许用户创建定制仪表板视图,还允许以特殊的方式查询和过滤数据。

ELKStack日志平台

2、ELK架构

ELK能够解决海量日志搜索问题,一个处理海量日志平台的架构自然耦合要灵活,以下架构适合较大集群的解决方案,需要配置为集群模式。为了分担负荷,这种架构的优点在于引入了消息队列机制,均衡了网络传输,降低了网络阻塞,避免了丢失数据的可能性。单体架构仅用于实验,因为logstash的核心代码是用ruby语言开发,虽然运行在jruby上,但是由于中间涉及到数据结构的转化,架构中Logstash依然存在占用系统资源过多的问题。

ELKStack单体架构 ELKStack日志平台

ELKStack容器时代的应用架构 ELKStack日志平台

ELKStack集群架构 ELKStack日志平台

Elastic Stack还可以结合hadoop生态使用 ELKStack日志平台

3、ELK部署

本次ELK实验中我们使用的是elasticsearch、logstash、kibana较为通用的架构模型。在此基础上又引入了一个轻量级的消息队列redis,共使用三台主机配置。实验中logstash服务端、redis只配置了单台,生产环境建议配置高可用。 ELKStack日志平台

  • 节点名称IP node1:192.168.200.200 node1.elk.com node2:192.168.200.201 node2.elk.com node3:192.168.200.202 node3.elk.com
  • 节点用途 node1: es节点、logstash服务端、kibana web-gui、redis、es第三方插件 node2: es节点、logstash Agent节点 node3: es节点、logstash Agent节点、nginx日志

3.1 elasticsearch集群配置

  • 首先配置java环境本次使用的是openjdk1.7,官方已经建议使用1.8
# yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr
  • ELK集群安装
wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.noarch.rpm
# yum localinstall elasticsearch-1.7.2.noarch.rpm

node1

# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: myes
node.name: "node1.elk.com"
#transport.tcp.port: 9300
#http.port: 9200
#node.master: true
#node.data: true
#index.number_of_shards: 1
#index.number_of_replicas: 0

【es配置非常简单,以上注释信息默认即可,也可以根据生产环境具体定义】

node2

# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: myes
node.name: "node2.elk.com"

node3

# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: myes
node.name: "node3.elk.com"
  • 将3个节点es服务启动
# systemctl daemon-reload
# systemctl start elasticsearch.service
# systemctl status elasticsearch.service
  • 测试集群通信是否正常 tcp测试结果
# tcpdump -i ens33 -nn tcp port 9300

ELKStack日志平台

http测试结果 ELKStack日志平台

curl测试结果 ELKStack日志平台

curl 获取集群节点信息 ELKStack日志平台

curl 获取节点自定义信息 ELKStack日志平台

node1安装es第三方插件【安装节点根据情况自定】

# /usr/share/elasticsearch/bin/plugin -i bigdesk -u file:///root/bigdesk-latest.zip 
# /usr/share/elasticsearch/bin/plugin -i head -u file:///root/elasticsearch-head-latest.zip
# /usr/share/elasticsearch/bin/plugin -i marvel-latest.zip -u file:///root/marvel-latest.zip
# /usr/share/elasticsearch/bin/plugin -l
Installed plugins:
    - bigdesk
    - head
    - marvel

http://192.168.200.200:9200/_plugin/marvel ELKStack日志平台

http://192.168.200.200:9200/_plugin/bigdesk ELKStack日志平台

http://192.168.200.200:9200/_plugin/head ELKStack日志平台

3.2 redis配置

# yum install redis
# systemctl start redis
# systemctl status redis

3.3 nginx配置

# yum install nginx
# systemctl start nginx
# systemctl status nginx

3.4 logstash配置

wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-1.5.4-1.noarch.rpm
# yum install logstash-1.5.4-1.noarch.rpm

node1

# vi /etc/profile.d/logstash.sh
export PATH=/opt/logstash/bin:$PATH
. /etc/profile.d/logstash.sh

node2

# vi /etc/profile.d/logstash.sh
export PATH=/opt/logstash/bin:$PATH
. /etc/profile.d/logstash.sh

node3

# vi /etc/profile.d/logstash.sh
export PATH=/opt/logstash/bin:$PATH
. /etc/profile.d/logstash.sh
  • 自定义日志格式
# vi /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.3.0/patterns/grok-patterns
#nginx Logs
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}

node2、node3logstash Agent配置 配置收集nginx日志 ->redis输出 【Logstash Agent】

# vi /etc/logstash/conf.d/nglogredissample.conf
input {
    file {
        path => ["/var/log/nginx/access.log"]
        type => "nginxlog"
        start_position => "beginning"
    }
}

filter {
    grok {
        match => { "message" => "%{NGINXACCESS}" }
    }
}

output {
    redis {
        port  => "6379"
        host  => ["192.168.200.200"]
        data_type  => "list"
        key   => "logstash-%{type}"
    }
}

node1logstash Server配置 redis输入 ->配置处理nginx日志 ->es存储 【Logstash Server】

# vim /etc/logstash/conf.d/serversample.conf【输出屏幕测试一下】
input {
    redis {
        port  => "6379"
        host  => "127.0.0.1"
        data_type  => "list"
        key   => "logstash-nginxlog"
    }
}

output {
    stdout {
        codec  => rubydebug
    }
}

测试一下node1节点输出的信息

# logstash -f /etc/logstash/conf.d/serversample.conf

ELKStack日志平台

  • 验证redis缓存的数据

ELKStack日志平台

测试从redis中获取数据没问题,output配置为elasticsearch

# vim /etc/logstash/conf.d/serversample.conf
input {
    redis {
        port  => "6379"
        host  => "127.0.0.1"
        data_type  => "list"
        key   => "logstash-nginxlog"
    }
}

output {
    elasticsearch {
        cluster  => "myes"
        index    => "logstash-%{+YYYY.MM.dd}"
    }
}

测试logstash配置文件语法

# logstash -f /etc/logstash/conf.d/sample.conf --configtest

启动logstash SysV服务脚本,生产环境使用daemon守护进程的方式启动

# service logstash start
# service logstash status

3.5 kibana配置

  • 下载源码包
wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz

node1节点安装kibana web图形展示

# tar xf kibana-4.1.1-linux-x64.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv kibana-4.1.1-linux-x64 kibana
# vim /usr/local/kibana/config/kibana.yml 
elasticsearch_url: "http://192.268.200.200:9200" 【不是集群名而是任意节点名】
  • 启动kibana
# /usr/local/kibana/bin/kibana -l /var/log/kibana.log &
  • 测试访问 http://192.168.200.200:5601

ELKStack日志平台

4、总结

  ELK也算是如今最流行并且更新速度最快的开源大数据产品,这就是为什么好多企业开始应用ELKStack日志平台了。ELK为业务提供日志搜索功能,也可以为系统日志提供存储搜索。在本次实验也验证了logstash本身的重量级,其实近些年elasticsearch相关的轻量级采集程序衍生出好多,具体如下:

  • filebeat: 主要用于采集文件形式日志。
  • metricbeat: 主要用于监测操作系统运行性能指标。
  • packetbeat: 主要用于采集网络流量数据。
  • Heartbeat: 主要用于检测服务间的连通性监控,比如icmp, tcp, http。
  • Winlogbeat: 专门针对windows的event log事件日志数据采集。
  • Auditbeat:采集Linux审计框架数据,以及各类主流操作系统文件完整性监测。

X-Pack是一个Elastic Stack的扩展,将安全,警报,监视,报告和图形功能整合于一个软件包中。 ELKStack日志平台

通过对es的了解和其它分布式系统的学习,其实分布式系统就是系统的各组件分布于网络上多个计算机;各组件彼此之间仅仅通过消息传递来通信并协调行动。ELK的分布式还比较容易理解和掌握的,ELK是一个开源的实时日志分析平台,其特点是分布式、可扩展,高可用、RESTful风格的搜索和数据分析引擎。希望今后能够在更多领域对ELK深入研究和应用。