部署ELK分布式日志分析平台(最下方附属logstatsh+filebeat)

一、ELK应用背景:

 

需求背景:生产环境中业务发展越来越庞大,服务器越来越多,各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志,开发人员排查问题,需要到服务器上查日志,不方便,运营人员需要一些数据,需要我们运维到服务器上分析日志;

 

解决的问题:一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问;

 

日志系统:大型系统通常都是一个分布式部署的架构不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率;

一个完整的集中式日志系统,需要包含以下几个主要特点:

1.收集-能够采集多种来源的日志数据;

2.传输-能够稳定的把日志数据传输到中央系统;

3.存储-如何存储日志数据;

4.分析-可以支持 UI 分析;

5.警告-能够提供错误报告,监控机制;

 

二、ELK平台概述:

概述:Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能;ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent),Beats占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具,目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。而ELK则提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用;

 

特点:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。详细可参考Elasticsearch权威指南

 

网站:

ELK官网:https://www.elastic.co/cn/

中文指南:https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details

 

三、ELK核心组件:

ELK核心架构:

ELK核心组件:

  • Logstash:通过对日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索)。说到搜索,logstash带有一个web界面,搜索和展示所有日志。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去;
  • ElasticSearch:是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。在elasticsearch中,所有节点的数据是均等的;
  • Kibana :是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志;
  • Filebeat:隶属于Beats。目前Beats包含四种工具:

Packetbeat(搜集网络流量数据);

Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据);

Filebeat(搜集文件数据);

Winlogbeat(搜集 Windows 事件日志数据);

 

注:ELK Stack (5.0版本之后)--> Elastic Stack == (ELK Stack + Beats)

目前Beats包含六种工具:

Packetbeat: 网络数据(收集网络流量数据)

Metricbeat: 指标 (收集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)

Filebeat: 日志文件(收集文件数据)

Winlogbeat: windows事件日志(收集 Windows 事件日志数据)

Auditbeat:审计数据 (收集审计日志)

Heartbeat:运行时间监控 (收集系统运行时的数据)

x-pack工具:x-pack对Elastic Stack提供了安全、警报、监控、报表、图表于一身的扩展包,是收费的,所以本文不涉及x-pack的安装;

 

四、案例:部署ELK分布式日志分析平台:

 

案例环境:

系统类型

IP地址

主机名

所需软件

内存

Centos 7.4 1708 64bit

192.168.100.108

master-node

java-1.8.0-openjdk

elasticsearch

kibana

2G

Centos 7.4 1708 64bit

192.168.100.107

data-node1

java-1.8.0-openjdk

elasticsearch

Logstash

2G

Centos 7.4 1708 64bit

192.168.100.106

data-node2

java-1.8.0-openjdk

elasticsearch

2G

 

案例步骤:

  • 配置基础环境域名解析(在此只展示master-node节点的配置);
  • 所有节点安装JDK1.8(在此只展示master-node节点的配置);
  • 所有节点安装elasticsearch(在此只展示master-node节点的配置);
  • 配置es的master主节点;
  • 配置es的data1节点:
  • 配置es的data2节点:
  • 配置es主节点开启es服务:
  • 配置es从节点启动es服务:
  • 在es的master主节点验证集群状态:

 

  • 在es集群的master主节点安装并配置启动kibana:
  • 使用web浏览器访问kibana的web页面进行验证:

 

  • 在es集群的data1从节点安装并测试配置启动logstash;
  • 配置logstash服务让收集的日志信息输出到es服务器中,而不是当前终端:

 

  • 访问kibana服务器查看日志信息:
  • 配置kibana的web网页设置索引:
  • 配置kibana的web页面显示日志收集信息:

 

 

  • 配置基础环境域名解析(在此只展示master-node节点的配置);

[root@master-node ~]# cat <<END >>/etc/hosts

192.168.100.108 master-node

192.168.100.107 data-node1

192.168.100.106 data-node2

END

[root@master-node ~]# yum -y install ntpdate

[root@master-node ~]# /usr/sbin/ntpdate ntp1.aliyun.com

22 Sep 22:57:04 ntpdate[14520]: adjust time server 120.25.115.20 offset -0.001107 sec

[root@master-node ~]# echo "/usr/sbin/ntpdate ntp1.aliyun.com" >>/etc/rc.local

[root@master-node ~]# chmod +x /etc/rc.local

 

  • 所有节点安装JDK1.8(在此只展示master-node节点的配置);

[root@master-node ~]# yum -y install java-1.8.0-openjdk

[root@master-node ~]# java -version

openjdk version "1.8.0_131"

OpenJDK Runtime Environment (build 1.8.0_131-b12)

OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

 

  • 所有节点安装elasticsearch(在此只展示master-node节点的配置);

[root@master-node ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

[root@master-node ~]# cat <<END >>/etc/yum.repos.d/elastic.repo

[elasticsearch-6.x]

name=Elasticsearch repository for 6.x packages

baseurl=https://artifacts.elastic.co/packages/6.x/yum

gpgcheck=1

gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch

enabled=1

autorefresh=1

type=rpm-md

END

[root@master-node ~]# yum install -y elasticsearch

[root@master-node ~]# rpm -qc elasticsearch

/etc/elasticsearch/elasticsearch.yml ##主配置文件

/etc/elasticsearch/jvm.options

/etc/elasticsearch/log4j2.properties

/etc/elasticsearch/role_mapping.yml

/etc/elasticsearch/roles.yml

/etc/elasticsearch/users

/etc/elasticsearch/users_roles

/etc/init.d/elasticsearch

/etc/sysconfig/elasticsearch

/usr/lib/sysctl.d/elasticsearch.conf

/usr/lib/systemd/system/elasticsearch.service

[root@master-node ~]# ll /etc/elasticsearch/

总用量 28

-rw-rw---- 1 root elasticsearch  207 9月  22 02:31 elasticsearch.keystore

-rw-rw---- 1 root elasticsearch 3089 9月  22 06:09 elasticsearch.yml

-rw-rw---- 1 root elasticsearch 3009 9月  14 06:22 jvm.options

-rw-rw---- 1 root elasticsearch 6380 9月  14 06:22 log4j2.properties

-rw-rw---- 1 root elasticsearch  473 9月  14 06:22 role_mapping.yml

-rw-rw---- 1 root elasticsearch  197 9月  14 06:22 roles.yml

-rw-rw---- 1 root elasticsearch    0 9月  14 06:22 users

-rw-rw---- 1 root elasticsearch    0 9月  14 06:22 users_roles

 

  • 配置es的master主节点;

[root@master-node ~]# vi /etc/elasticsearch/elasticsearch.yml ##追加,注意配置项:后的空格,

cluster.name: linuxfan   ##集群名称

node.name: master-node   ##该节点名称

node.master: true   ##该节点为主节点

node.data: false   ##表示这不是数据节点

network.host: 192.168.100.108   ##监听ip

http.port: 9200   ##es服务的端口号

discovery.zen.ping.unicast.hosts: ["192.168.100.108", "192.168.100.107", "192.168.100.106"]

##配置自动发现

:wq

 

  • 配置es的data1节点:

[root@data-node1 ~]# vi /etc/elasticsearch/elasticsearch.yml

cluster.name: linuxfan

node.name: data-node1

node.master: false

node.data: true

network.host: 192.168.100.107

http.port: 9200

discovery.zen.ping.unicast.hosts: ["192.168.100.108", "192.168.100.107", "192.168.100.106"]

:wq

 

  • 配置es的data2节点:

[root@data-node2 ~]# vi /etc/elasticsearch/elasticsearch.yml

cluster.name: linuxfan

node.name: data-node2

node.master: false

node.data: true

network.host: 192.168.100.106

http.port: 9200

discovery.zen.ping.unicast.hosts: ["192.168.100.108", "192.168.100.107", "192.168.100.106"]

:wq

 

  • 配置es主节点开启es服务:

[root@master-node ~]# vi /etc/sysctl.conf

vm.max_map_count = 655360

[root@master-node ~]# sysctl -p

[root@master-node ~]# systemctl start elasticsearch

[root@master-node ~]# systemctl enable elasticsearch

Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

 

注解:如若无法启动:

vi /etc/security/limits.conf

* soft nofile 65536

* hard nofile 65536

* soft nproc 65536

* hard nproc 65536

 

[root@master-node ~]# netstat -utpln |grep java

tcp        0      0 192.168.100.108:9200    0.0.0.0:*               LISTEN      14027/java          

tcp        0      0 192.168.100.108:9300    0.0.0.0:*               LISTEN      14027/java

 

注解:9300端口是es集群通信用的,9200则是数据传输时用的;

 

  • 配置es从节点启动es服务:

[root@data-node1 ~]# systemctl start elasticsearch

[root@data-node1 ~]# systemctl enable elasticsearch

Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

[root@data-node1 ~]# netstat -utpln|grep java

tcp        0      0 192.168.100.107:9200    0.0.0.0:*               LISTEN      13879/java          

tcp        0      0 192.168.100.107:9300    0.0.0.0:*               LISTEN      13879/java

 

[root@data-node2 ~]# systemctl start elasticsearch

[root@data-node2 ~]# systemctl enable elasticsearch

Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

[root@data-node2 ~]# netstat -utpln|grep java

tcp        0      0 192.168.100.106:9200    0.0.0.0:*               LISTEN      13879/java          

tcp        0      0 192.168.100.106:9300    0.0.0.0:*               LISTEN      13879/java

 

  • 在es的master主节点验证集群状态:
  •  

[root@master-node ~]# curl '192.168.100.108:9200/_cluster/health?pretty'

{

  "cluster_name" : "linuxfan",

  "status" : "green",

  "timed_out" : false,

  "number_of_nodes" : 3,

  "number_of_data_nodes" : 2,

  "active_primary_shards" : 0,

  "active_shards" : 0,

  "relocating_shards" : 0,

  "initializing_shards" : 0,

  "unassigned_shards" : 0,

  "delayed_unassigned_shards" : 0,

  "number_of_pending_tasks" : 0,

  "number_of_in_flight_fetch" : 0,

  "task_max_waiting_in_queue_millis" : 0,

  "active_shards_percent_as_number" : 100.0

}

 

注解:curl操作es集群更多操作:http://zhaoyanblog.com/archives/732.html

 

  • 在es集群的master主节点安装并配置启动kibana:

[root@master-node ~]# yum -y install kibana

[root@master-node ~]# vi /etc/kibana/kibana.yml   ##追加

server.port: 5601

server.host: 192.168.100.108

elasticsearch.url: "http://192.168.100.108:9200"  

logging.dest: /var/log/kibana.log

:wq

[root@master-node ~]# touch /var/log/kibana.log

[root@master-node ~]# chmod 777 /var/log/kibana.log

[root@master-node ~]# systemctl start kibana

[root@master-node ~]# systemctl enable kibana

Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.

[root@master-node ~]# netstat -utpln |grep node

tcp        0      0 192.168.100.108:5601    0.0.0.0:*               LISTEN      14294/node

 

注:由于kibana是使用node.js开发的,所以进程名称为node

 

  • 使用web浏览器访问kibana的web页面进行验证:

在浏览器里进行访问http://192.168.100.108:5601 ,由于我们并没有安装x-pack,所以此时是没有用户名和密码的,可以直接访问的:

 

  • 在es集群的data1从节点安装并测试配置启动logstash;

[root@data-node1 ~]# yum -y install logstash

[root@data-node1 ~]# vi /etc/logstash/conf.d/syslog.conf   ##追加 

input {   ##定义日志源

  syslog {

    type => "system-syslog"   ##定义类型

    port => 10514     ##定义监听端口

  }

}

output {   ##定义日志输出

  stdout {

    codec => rubydebug   ##将日志输出到当前的终端上显示

  }

}

:wq

[root@data-node1 ~]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit ##检查配置文件,注意内存的使用,如若内存不足,会出现检查jdk失败;

注解:

--path.settings ##用于指定logstash的配置文件所在的目录

-f ##指定需要被检测的配置文件的路径

--config.test_and_exit ##指定检测完之后就退出,不然就会直接启动了

 

[root@data-node1 ~]# vi /etc/rsyslog.conf ##追加

*.* @@192.168.100.107:10514

:wq

[root@data-node1 ~]# systemctl restart rsyslog

[root@data-node1 ~]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf ##启动logstash

这时终端会停留在这里,因为我们在配置文件中定义的是将信息输出到当前终端;

打开新终端检查一下10514端口是否已被监听;

 

然后在别的机器ssh登录到这台机器上,测试一下有没有日志输出;

 

 

如上,可以看到,终端中以JSON的格式打印了收集到的日志,测试成功。

 

  • 配置logstash服务让收集的日志信息输出到es服务器中,而不是当前终端:

[root@data-node1 ~]# vi /etc/logstash/conf.d/syslog.conf ##更改为如下内容

input {

  syslog {

    type => "system-syslog"

    port => 10514

  }

}

output {

  elasticsearch {

    hosts => ["192.168.100.108:9200"]

    index => "system-syslog-%{+YYYY.MM}"  

  }

}

:wq

[root@data-node1 ~]# vi /etc/logstash/logstash.yml

http.host: "192.168.100.107"

:wq

[root@data-node1 ~]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit

 

[root@data-node1 ~]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf &

 

注解:启动logstash后,进程是正常存在的,但是9600以及10514端口却没有被监听。检查message日志文件发现:

[root@data-node1 ~]# chown logstash /var/log/logstash/logstash-plain.log

再次检查日志文件:

可以看到,依旧是权限的问题,这是因为之前我们以root的身份在终端启动过logstash,所以产生的相关文件的属组属主都是root,同样的,也是设置一下权限即可:

[root@data-node1 bin]# chown -R logstash /var/lib/logstash/

这次就没问题了,端口正常监听了,这样我们的logstash服务就启动成功了:

 

  • 访问kibana服务器查看日志信息

[root@master-node ~]# curl '192.168.100.108:9200/_cat/indices?v' ##查看索引信息,索引信息正常说明logstash服务于es服务通信正常,如若无法正常生成索引,需要新建数据连接到logstash服务器;

[root@master-node ~]# curl '192.168.100.108:9200/system-syslog-2018.09?pretty' ##查看索引的详细信息

[root@master-node ~]# curl -XDELETE '192.168.200.1:9200/system-syslog-2018.04' ##删除索引

 

  • 配置kibana的web网页设置索引:

 

  • 配置kibana的web页面显示日志收集信息:

 

  • 案例:应用ELK日志分析平台进行分析nginx日志:(这种方式会消耗大量内存,不建议使用建议使用filebeat)

在192.168.100.107上编译安装nginx,此处的data1-node1就是nginx

在es集群的data1从节点安装并测试配置启动logstash;

[root@data-node1 ~]# yum -y install logstash

[root@data-node1 ~]# vim /etc/logstash/logstash.yml

28 path.data: /var/lib/logstash

64 path.config: /etc/logstash/conf.d

190 http.host: "192.168.100.107"

208 path.logs: /var/log/logstash

 

[root@data-node1 ~]# cd /etc/logstash/conf.d/

[root@data-node1 conf.d]# vim logstash-nginx-es.conf

input {

  file {

        path => [ "/usr/local/nginx/logs/access.log" ]   # nginx日志的目录

        start_position => "beginning"  # 从文件开头采集

    }

}

filter {

  #Only matched data are send to output.

}

output {

  elasticsearch {

    action => "index"          #The operation on ES

    hosts  => "192.168.100.108:9200"   #ElasticSearch host, can be array.

    index  => "applog"         # 创建一个ES的index

  }

}

 

[root@data-node1 ]# /etc/init.d/nginx start

[root@data-node1 ~]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/logstash-nginx-es.conf --config.test_and_exit

OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N

Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties

[2018-09-24T13:08:47,005][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/var/lib/logstash/queue"}

[2018-09-24T13:08:47,036][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/var/lib/logstash/dead_letter_queue"}

[2018-09-24T13:08:47,773][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified

Configuration OK

[2018-09-24T13:08:51,348][INFO ][logstash.runner          ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash

[root@data-node1 ~]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/logstash-nginx-es.conf &

[1] 5598

[root@data-node1 ~]# OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N

[root@data-node1 conf.d]# curl '192.168.100.108:9200/_cat/indices?v'

health status index  uuid           pri rep docs.count docs.deleted store.size pri.store.size

green  open   applog wUbx_yvBQcSx1r9-ZEtaaw   5   1   4  0  49.1kb         21.5kb

 

此处applog是索引

 

环境搭建

将ELK和filebeat下载后解压到一个目录下,四个产品都是开箱即用的。

Logstash安装与配置

Logstash的作用主要是用来处理数据,当然它也可以直接从日志文件读取记录然后进行处理。在Logstash的根目录,我们需要建立一个新文件logstash.conf:

# 配置logstash输入源
input {
  beats {
    host => "localhost"
    port => "5043" #注意要和filebeat的输出端口一致
  }
}

# 配置输出的地方
output {
  # 控制台
  stdout { codec => rubydebug }
  # es
  elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}

Filebeat安装与配置

Filebeat作为日志搜集器,肯定是需要指定输入源和输出地,所以我们需要先配置它。在Filebeat的根目录下我们需要在filebeat.yml中:

# 输入源
filebeat.prospectors:
- type: log
  paths:
    - /var/log/*.log # 日志文件以log结尾并且需要放在/var/log目录下
    # 如果是windows,如下
    # - C:\Users\chen\Desktop\elastic\elkjava\log\*.log
# 输出地
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5043"]

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值