7

ELKStack日志平台

 1 year ago
source link: https://blog.51cto.com/redone/5982724
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ELKStack日志平台

精选 原创

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

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

ELKStack日志平台_elasticsearch
ELKStack日志平台_elk_02

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

ELKStack日志平台_kibana_03

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

ELKStack日志平台_linux_04

2、ELK架构

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

ELKStack单体架构

ELKStack日志平台_elasticsearch_05

ELKStack容器时代的应用架构

ELKStack日志平台_linux_06

ELKStack集群架构

ELKStack日志平台_linux_07

Elastic Stack还可以结合hadoop生态使用

ELKStack日志平台_kibana_08

3、ELK部署

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

ELKStack日志平台_linux_09
  • 节点名称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日志平台_linux_10

http测试结果

ELKStack日志平台_logstash_11

curl测试结果

ELKStack日志平台_elasticsearch_12

curl 获取集群节点信息

ELKStack日志平台_linux_13

curl 获取节点自定义信息

ELKStack日志平台_linux_14

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日志平台_linux_15

 http://192.168.200.200:9200/_plugin/bigdesk

ELKStack日志平台_elk_16

 http://192.168.200.200:9200/_plugin/head

ELKStack日志平台_linux_17

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日志平台_kibana_18
  • 验证redis缓存的数据
ELKStack日志平台_logstash_19

测试从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 &
ELKStack日志平台_linux_20

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

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

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

ELKStack日志平台_linux_21

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK