ELK+filebeat+x-pack平台搭建

概要:

ELK允许你以任何格式搜索,分析和可视化从任何源生成的日志,这种做法称为集中式日志记录。在尝试识别服务器或应用程序的问题时,集中日志记录非常有用,因为它允许您在一个位置搜索所有日志。它也很有用,因为它允许您通过在特定时间范围内关联其日志来识别跨多个服务器的问题。

组件:

Elasticsearch

是一个基于Apache Lucene(TM)的开源搜索引擎 ,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,RESTful web风格接口,多数据源,自动搜索负载等。

Logstash

是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和 Elasticsearch。
虽然filebeat可以将数据直接发送到elasticseaech数据库,但我们建议先使用Logstash处理数据,这将允许从不用的源数据收集数据,将其转换为通用格式,并将其导出到另一个数据库。logstash配置文件以json格式编写,配置时,可以将logstash作为一个管道,将一端接收数据,以某种方式处理它,并将数据发送到ES,logstash有两个必要的元素,input和output以及一个可选元素filter

stdin {} 就是从标准输入 stdout {} 就是从标准输出
在这个字符串中,其实定义了 Logstash 的两个行为input和output。
在 input 中,我们定义了一个标准输入,由于什么都没有,所以 Logstash 会从终端的标准输入中读取字符串,这也是为什么刚才在输入完命令后会出现等待输入的情况。
在 output 中,我们定义了一个标准输出,也就是说 Logstash 在处理完后会将结果从标准输出(终端)中输出,而 codec 字段,则说明了输出会遵循什么样的格式,这里定义的 codec 为 rubydebug,所以我们刚才看到了一套标准的输出格式。
logsatsh
filter
grok: 基于正则表达式提供丰富可重用的模式,基于此可以将非结构化数据转换为结构化数据
date: 将字符串类型的时间字段转换为时间戳类型的,方便后续数处理
Mutate:进行增删改查替换相关字段
logstash:位于ELK数据管道的最前端,其作用主要是收集,过滤,分析,输出各种结构化或者非结构化的原始数据(典型的如日志系统),原始数据从“无序变成有序”的重担就落在了logstash的肩上了,因此其作用举足轻重。
说到Logstash,不得不说其中的 插件机制,其几乎所有的功能都是靠插件来实现的,因此灵活易用:
关于 数据收集,Logstash 提供了输入插件来支持各种不同的数据源
关于 数据分析,Logstash 则提供了过滤器插件来支持对输入原始数据的花式处理
关于 数据输出,Logstash 也提供了各种输出插件,从而支持将结果数据输出到各种地方,比如标准控制台,文件,各种数据库包括 ElasticSearch 等

Logstash其实在整个ELK中环节还蛮重要的,其实可以理解为一个“中间人”的角色。它通过从filebeat中接受数据,然后进行过滤,最后再传输给es。所以一般logstash的配置也包括input,output以及filter的配置。

logstash理解参考>>
https://segmentfault.com/a/1190000015754162

Kibana

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

filebeat

轻量级,单用途的数据发送器,可以将数百或数千台计算机的数据发送到logstash或elasticsearch
beats
filebeat 日志文件(yaml)
处理流程:输入input 处理filter 输出output

x-pack

X-Pack是一个Elastic Stack的扩展,将安全,警报,监视,报告和图形功能包含在一个易于安装的软件包中
X-Pack 提供以下几个级别保护elastic集群
1)用户验证
2)授权和基于角色的访问控制
3)节点/客户端认证和信道加密
4)审计
通俗讲解:
安全防护功能:你是不是,不想别人直接访问你的5601,9200端口,这个,x-pack能办到。
实时监控功能:实时监控集群的CPU、磁盘等负载;
生成报告功能:图形化展示你的集群使用情况。
还有,机器学习等功能。
X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, Watcher, Marvel, Graph, 和 reporting,先来说说这几个爸爸是做什么的吧:

  • Shield: 提供对数据的 Password-Protect,以及加密通信、基于角色的权限控制,IP 过滤,审计,可以有效地:
  • 防止未授权的访问:基于 Password-Protect,基于角色的权限控制,IP过滤;
  • 保证数据的完整性:基于消息认证和 TLS/SSL 加密;
  • 审计跟踪:可以知道谁在什么时候对数据做了什么;
  • Watcher: 提供对数据操作的变更的监控和报警。
  • Marvel: 基于 Kibana 的插件,主要用于监控 ES 集群。可以看到集群的健康状况、实时的性能指标,分析历史集群、索引、节点的指标等。
  • Graph: 用于分析数据间的关系。
  • Reporting: 用于快速生成 Kibana Visualization 和 Dashboard 的报表,可以对生成的时间定制计划,并且可以由某些特定条件触发。

再来看看我们的儿子 X-Pack 是做啥的,哦,他就是他们的儿子,一个大合集,便于安装、不用为版本兼容性犯愁,可以灵活 disable / enable 其中的各个组件。他还多干了一件事儿,可以监控 Logstash。

关于免费和收费版本,版本功能比较可以查看:https://www.elastic.co/subscriptions

免费版本注册地址:https://register.elastic.co/xpack_register

付费版本(分为黄金、白金级别)购买地址:https://www.elastic.co/subscriptions/xpack

默认的免费版本有一个月的 trial 试用期。免费版本试用期只包含 ES 集群监控、图分析和可视化,基于角色的 ES 权限控制和搜索用户信息的功能。不包含:

  • 安全组件 Shield:
    • TLS/SSL加密;
    • LDAP的整合;
    • 日志审计;
    • 第三方的认证域整合;
  • 报警组件 Watcher;
  • 报表组件 Reporting;

总的来说免费版本对于安全组件这块什么都不支持。

参考:https://www.jianshu.com/p/a49d93212eca
x-pack尚处于付费版本,适用期限:1个月

应用场景

在传统的应用运行环境中,收集、分析日志往往是非常必要且常见的,一旦应用出现问题、或者需要分析应用行为时,管理员将通过一些传统工具对日志进行检查,如cat、tail、sed、awk、perl以及grep。这种做法有助于培养在常用工具方面的优秀技能,但它的适用范围仅限于少量的主机和日志文件类型。

随着应用系统的复杂性与日俱增,日志的分析也越来越重要,常见的需求包括,团队开发过程中可能遇到一些和日志有关的问题:

开发没有生产环境服务器权限,需要通过系统管理员获取详细日志,沟通成本高
系统可能是有多个不同语言编写、分布式环境下的模块组成,查找日志费时费力
日志数量巨大,查询时间很长

es历史数据处理:
hadoop集群,把历史日志都放在hadoop集群上,直接写一个mapreduce想查所长时间就查多长时间的
elk可以实现但是对于超过半年的索引会关闭掉,为了查询效率

ELK流程图

ELK+filebeat+x-pack平台搭建_第1张图片
image.png

调研了ELK技术栈,发现新一代的logstash-forward即Filebeat,使用了golang,性能超logstash,部署简单,占用资源少,可以很方便的和logstash和ES对接,作为日志文件采集组件。所以决定使用ELK+Filebeat的架构进行平台搭建。Filebeat是Beats家族的一员,后续可以使用Packetbeat进行网络数据采集、Winlogbeat进行Windosw事件采集、Heartbeat进行心跳采集、Metricbeat进行系统指标采集。这种架构解决了 Logstash 在各服务器节点上占用系统资源高的问题。相比 Logstash,Beats 所占系统的 CPU 和内存几乎可以忽略不计。另外,Beats 和 Logstash 之间支持 SSL/TLS 加密传输,客户端和服务器双向认证,保证了通信安全。

各组件承担的角色和功能:
Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;
Logstash:数据处理引擎,它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到 ES;
Kibana:数据分析和可视化平台。与 Elasticsearch 配合使用,对数据进行搜索、分析和以统计图表的方式展示;
Filebeat:ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,使用 golang 基于 Logstash-Forwarder 源代码开发,是对它的替代。在需要采集日志数据的 server 上安装 Filebeat,并指定日志目录或日志文件后,Filebeat 就能读取数据,迅速发送到 Logstash 进行解析。

1.准备工作

环境

Linux:Centos7.2
ElasticSearch : elasticsearch-6.7.0
Logstash : logstash-6.7.0
kibana:kibana-6.7.0
JDK: 1.8

占用端口

elasticsearch 9200/9300 它跟其他的节点的传输端口为9300,接受HTTP请求的端口为9200
logstash 9600/5044 5044接收beat数据的端口,9600是logstash API端口
kibana 5601

官网下载:

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.7.0.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-6.7.0-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/logstash/logstash-6.7.0.tar.gz
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.7.0-linux-x86_64.tar.gz

注意点:
  • 安装Elastic Stack组件需要使用相同的版本
  • elasticsearch的配置文件采用YAML格式,这意味着缩进非常重要,编辑文件时,确保不添加任何额外的空格

2.系统配置

创建sudo权限用户
[root@elk ~]# useradd -d /elk elk
[root@elk ~]# username=elk
[root@elk ~]# echo "$username ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$
操作系统配置

禁用linux

[root@elk ~]#vi /etc/sysconfig/selinux 
将SELINUX=enforcing修改为SELINUX=disabled

安装jdk1.8

请参考之前博客https://www.jianshu.com/p/1b2b00ceef88

selinux设置

====操作系统优化设置====
[elk@elk config]$ sudo vim /etc/security/limits.conf 
* soft nproc 65535
[elk@elk config]$ sudo vim /etc/security/limits.d/20-nproc.conf
* soft nproc 65535

系统参数配置

[elk@elk config]$ sudo vim /etc/sysctl.conf
fs.file-max=655350
vm.max_map_count=655360
[elk@elk config]$ sudo sysctl -p

防火墙设置

//临时关闭
systemctl stop firewalld
//禁止开机启动
systemctl disable firewalld

3.Elasticsearch安装

安装

[elk@elk ~]$ tar -xzf elasticsearch-6.7.0.tar.gz
[elk@elk config]$ cd /elk/elasticsearch-6.7.0/config

es单节点
修改elasticsearch.yml配置文件

[elk@elk config]$ vim elasticsearch.yml
==设置集群名称==
17 cluster.name: wp_seclog
==设置节点名称==
23 node.name: ELK-node1
==设置数据存储路径==
34 path.data: /elk/data
==设置日志存储路径==
38 path.logs: /elk/data/logs
#集群设置==绑定IP地址==
#56 network.host: 0.0.0.0
==绑定端口==
60 http.port: 9200
==集群IP集合== #也可以添加端口
69 discovery.zen.ping.unicast.hosts: ["192.168.100.203"]
# 集群设置:多节点
#69 discovery.zen.ping.unicast.hosts: ["192.168.100.203","hosts2","host3"]

es集群多节点
已经安装好单个节点,添加多节点时,只需要将es安装包复制到相应的机器上,需要配置集群中的另外节点es-2 和 es-3.配置同es-1,修改一下配置文件里的节点名和地址即可
如果是集群使用x-pack需要为内部节点通信配置TSL/SSL

参考:es内部节点安全认证

ELK+filebeat+x-pack平台搭建_第2张图片
image.png
集群内部证书配置(详细可参考上面连接->es内部节点安全认证)
cd /elk/elasticsearch-6.7.0
#创建TSL/SSL证书
bin/elasticsearch-certutil ca
bin/elasticsearch-certutil cert --ca config/certs/elastic-stack-ca.p12 --dns 192.168.100.203 --ip 192.168.100.203
##创建cert文件夹
[elk@elk config]$ mkdir -p /elk/elasticsearch-6.7.0/config/certs   
[elk@elk config]$ ls -al /elk/elasticsearch-6.7.0/config/certs
-rw------- 1 elk elk 3443 6月  20 10:07 elastic-certificates.p12

注意:如果安装了x-pack但是不配置内部安全通信认证,集群不可用
集群配置
wp-node1

[elk@elk elasticsearch-6.7.0]$ egrep -v '^$|#' config/elasticsearch.yml
cluster.name: wupao
node.name: wp-node1
node.master: true
path.data: /elk/elasticsearch-6.7.0/data
path.logs: /elk/elasticsearch-6.7.0/logs
bootstrap.system_call_filter: false
network.host: 0.0.0.0
transport.tcp.compress: true
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.100.203", "192.168.100.202","192.168.100.201"]
discovery.zen.minimum_master_nodes: 2
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12 
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12 

wp-node2

-bash-4.2$ egrep -v '^$|#' config/elasticsearch.yml
cluster.name: wupao
node.name: wp-node2
node.master: true
path.data: /elk/elasticsearch-6.7.0/data
path.logs: /elk/elasticsearch-6.7.0/logs
bootstrap.system_call_filter: false
network.host: 0.0.0.0
transport.tcp.compress: true
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.100.203", "192.168.100.202","192.168.100.201"]
discovery.zen.minimum_master_nodes: 2
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12 
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

wp-node3

-bash-4.2$ egrep -v '^$|#' config/elasticsearch.yml
cluster.name: wupao
node.name: wp-node3
node.master: false 
path.data: /elk/elasticsearch-6.7.0/data
path.logs: /elk/elasticsearch-6.7.0/logs
bootstrap.system_call_filter: false
network.host: 0.0.0.0
transport.tcp.compress: true
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.100.203", "192.168.100.202","192.168.100.201"]
discovery.zen.minimum_master_nodes: 2
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12 
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

注意:
node.master: false ##注意discovery.zen.minimum_master_nodes: 2 为2两个为true,为1一个为true
discovery.zen.minimum_master_nodes: 2 ##这个的参数为节点数N/2+1,因为我目前的节点是个,所以为2、所以为2个节点填写为1
node3添加到集群后,node-master日志中会显示


image.png

报错解决
报错1:因为刚开始是一个节点,后增加了两个节点做集群,添加的方法是直接copy之前的包到新的服务器上
刚开始遇到无法添加集群的报错:

[wp-node2] failed to send join request to master [{wp-node1}{MxvGfK7lR6iI_frh_BOzcg}{M_VIMWHFSPmZT9n2D2_fZQ}{192.168.1.203}{192.168.1.203:9300}{ml.machine_memory=16603000832, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}], reason [RemoteTransportException[[wp-node1][192.168.1.203:9300][internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {wp-node2}{MxvGfK7lR6iI_frh_BOzcg}{gO2EuagySwq9d5AfDTK6qg}{192.168.1.202}{192.168.1.202:9300}{ml.machine_memory=12411887616, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}, found existing node } with the same id but is a different node instance]; ]

ith the same id but is a different node instance是因为复制虚拟机时,elsticsearch时,将elsticsearch文件夹下的data文件夹一并复制了。而在前面测试时,data文件夹下已经产生了data数据,于是报上面的错误
解决办法:删除elsticsearch文件夹下的data文件夹下的节点数据
报错2:elasticsearch集群搭建报错:

 not enough master nodes discovered during pinging

解决2:
原因是node.master: true 和discovery.zen.minimum_master_nodes: 2 的数量不匹配,如果为2需要两个几点配置node.master: true

修改jvm.options配置文件

[elk@elk config]$ vim jvm.options
====修改jvm内存值====
 #按照主机的内存50%进行设置,默认es6.3.2为1g
-Xms2g
-Xmx2g

启动

[elk@elk bin]$ ./elasticsearch -d
==查看log信息,检查es启动是否正常==
[elk@elk logs]$ tail -f /elk/data/logs/
显示如下,表示启动成功
[2019-03-28T14:17:00,452][INFO ][o.e.n.Node               ] [HCU8cIa] started
[2019-03-28T14:17:00,457][INFO ][o.e.g.GatewayService     ] [HCU8cIa] recovered [0] indices into cluster_state

关闭

直接杀掉进程
[elk@elk ~]$ jps
18438 Elasticsearch
18566 Jps
[elk@elk ~]$ kill -9 18328

启动报错处理

报错:
[2019-03-28T09:38:45,704][ERROR][o.e.b.Bootstrap          ] [secnode-1] node validation exception
[1] bootstrap checks failed
[1]: max file descriptors [35536] for elasticsearch process is too low, increase to at least [65536]
解决:修改最大连接数,刚开始我修改了没生效,重启机器后生效

查看端口

[elk@elk ~]$ ss -ltnp              
LISTEN     0      128                      :::9200                                 :::*                   users:(("java",pid=18438,fd=488))
LISTEN     0      128                      :::9300                                 :::*                   users:(("java",pid=18438,fd=374))

验证

[elk@elk bin]$ curl 192.168.100.203:9200

健康状态

[elk@elk ~]$ curl -X GET http://192.168.100.203:9200/_cat/health?v
epoch      timestamp cluster   status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1553766910 09:55:10  wp-seclog green           1         1      0   0    0    0        0             0                  -                100.0%

注意:

1 network.host: 0.0.0.0 只要不是localhost就是生产模式
2 http://192.168.100.203:9200/_cat/nodes?v   查看集群状态

Chrome扩展程序


ELK+filebeat+x-pack平台搭建_第3张图片
image.png

安装完成后打开浏览器


ELK+filebeat+x-pack平台搭建_第4张图片
image.png

安装完集群后显示为
ELK+filebeat+x-pack平台搭建_第5张图片
image.png

4.logstash安装

解压

[elk@elk bin]$tar -xzf logstash-6.7.0.tar.gz
[elk@elk bin]$ cd /elk/logstash-6.7.0/bin/

测试

进行数据测试,启动完成后输入hello 看能否正常输出
[elk@elk bin]$ ./logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug} }'          
hello
Sending Logstash's logs to /elk/logstash-6.7.0/logs which is now configured via log4j2.properties
[2019-03-28T14:38:25,111][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"fb_apache", :directory=>"/elk/logstash-6.7.0/modules/fb_apache/configuration"}
[2019-03-28T14:38:25,129][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"netflow", :directory=>"/elk/logstash-6.7.0/modules/netflow/configuration"}
[2019-03-28T14:38:25,334][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/elk/logstash-6.7.0/data/queue"}
[2019-03-28T14:38:25,340][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/elk/logstash-6.7.0/data/dead_letter_queue"}
[2019-03-28T14:38:25,811][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2019-03-28T14:38:25,850][INFO ][logstash.agent           ] No persistent UUID file found. Generating new UUID {:uuid=>"780df64b-8158-495f-a366-8e4bdbff21c7", :path=>"/elk/logstash-6.7.0/data/uuid"}
[2019-03-28T14:38:26,455][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"6.7.0"}
[2019-03-28T14:38:26,949][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
[2019-03-28T14:38:29,594][INFO ][logstash.pipeline        ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>32, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2019-03-28T14:38:29,742][INFO ][logstash.pipeline        ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#"}
The stdin plugin is now waiting for input:
[2019-03-28T14:38:29,834][INFO ][logstash.agent           ] Pipelines running {:count=>1, :pipelines=>["main"]}
{
      "@version" => "1",
    "@timestamp" => 2019-03-28T06:38:29.828Z,
          "host" => "elk",
       "message" => "hello"
}

配置conf文件,将数据传送到ES

[elk@elk config]$ cd /elk/logstash-6.7.0/config/
vim logstash-simple.conf(创建logstash的配置文件,6.7.0版本无此文件需自行创建)
input { stdin { } }
output 
{
      elasticsearch { hosts => ["192.168.100.203:9200"] }
      stdout { codec => rubydebug }
}

启动

[elk@elk config]$ cd /elk/logstash-6.7.0/bin/
[elk@elk bin]$ nohup ./bin/logstash -f config/logstash.conf >/dev/null 2>&1 &

查看日志

[elk@elk logs]$ cd /elk/logstash-6.7.0/logs
[elk@elk logs]$ tail -f  less logstash-plain.log 

端口

[root@elk /]# ss -ltnp
LISTEN     0      50               ::ffff:127.0.0.1:9600                                       :::*                   users:(("java",pid=18987,fd=88))

配置示例:

[elk@elk config]$ cat logstash.conf 
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
    beats {
        port => 5044
   }
}

output{
    if [fields][env] == "wiki"{                                 
        stdout {codec => rubydebug}
        elasticsearch {
           hosts => "192.168.100.203:9200"
           manage_template => false
           index => "wiki-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
           document_type => "%{[@metadata][type]}"
       }
 
     }
 
    if [fields][env] == "jira"{                            
        stdout {codec => rubydebug}
        elasticsearch {
           hosts => "192.168.100.203:9200"
           manage_template => false
           index => "jira-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
           document_type => "%{[@metadata][type]}"
       }
    }

    if [fields][env] == "fisheye"{                            
        stdout {codec => rubydebug}
        elasticsearch {
           hosts => "192.168.100.203:9200"
           manage_template => false
           index => "fisheye-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
           document_type => "%{[@metadata][type]}"
       }
    }

    if [fields][env] == "crowd"{                            
        stdout {codec => rubydebug}
        elasticsearch {
           hosts => "192.168.100.203:9200"
           manage_template => false
           index => "crowd-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
           document_type => "%{[@metadata][type]}"
       }
    }

    if [fields][env] == "jenkins"{                            
        stdout {codec => rubydebug}
        elasticsearch {
           hosts => "192.168.100.203:9200"
           manage_template => false
           index => "jenkins-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
           document_type => "%{[@metadata][type]}"
       }
    }
}
[elk@elk config]$ pwd
/elk/logstash-6.7.0/config

5.kibana安装

解压

[elk@elk ~]$ tar -xzf kibana-6.7.0-linux-x86_64.tar.gz
[elk@elk ~]$ mv kibana-6.7.0-linux-x86_64 kibana-6.7.0

修改配置文件

[elk@elk kibana-6.7.0]$ cd /elk/kibana-6.7.0/config/
[elk@elk config]$ vim kibana.yml
 2 server.port: 5601
 #kibana IP
 7 server.host: "192.168.100.203"
 #es ip
 28 elasticsearch.url: "http://192.168.100.203:9200"
 elasticsearch.username: "kibana"
 elasticsearch.password: "xxxxxx"

启动

nohup /elk/kibana-6.7.0/bin/kibana > /dev/null 2>&1 &

端口

[root@elk /]# ss -ltnp
LISTEN     0      128                                                         192.168.1.203:5601                                                                                *:*  

相关术语

kibana
discover:数据搜索查看
visualize:图标制作
dashboard:仪表盘制作
timelion:时序数据的高级可视化分析
devtools:开发者工具

术语
document:文档数据
index:索引
type:索引中的数据类型
field字段:文档的属性
query dsl:查询语言

es CRUD
create:创建文档
read:读取文档
update:更新文档
delete:删除文档
kibana->开发工具-创建
GET _search
{
  "query": {
    "match_all": {}
  }
}

##create
POST /accounts/persion/1
{
  "name":"daisy",
  "lastname":"Doe",
  "jobdescription":"Systens"
}
#read
GET accounts/persion/1
#update
POST /accounts/persion/1/_update
{
  "doc":{
    "jobdescription":"Linux"
  }
}
#delete
DELETE accounts/persion/1

#query string查询方式1
Get /accounts/persion/_search?q=daisy

#query DSL 查询方式2
GET accounts/persion/_search
{
  "query":{
    "term":{
      "name":{
        "value":"daisy"
      }
    }
  }
}

6.x-pack安装

6.1安装:

cd /elk/elasticsearch-6.7.0/bin && ./elasticsearch-plugin install x-pack
cd /elk/logstash-6.7.0/bin/ && ./logstash-plugin install x-pack
cd cd /elk/kibana-6.7.0/bin/ && ./kibana-plugin install x-pack
提示:
ERROR: this distribution of Elasticsearch contains X-Pack by default   表示es的x-pack包默认已安装
Logstash now contains X-Pack by default, there is no longer any need to install
it as it is already present.
ERROR: Invalid pack for: x-pack, reason: x-pack not an installable plugin, message: x-pack not an installable plugin      表示logstash的x-pack包默认已安装
Plugin installation was unsuccessful due to error "Kibana now contains X-Pack by default, there is no longer any need to install it as it is already present."   表示kibana的x-pack包默认已安装

6.2破解

参考:https://www.linuxea.com/1895.html
破解包下载:51下载
license申请:申请license
时间戳:https://tool.lu/timestamp/

6.2.1将破解包下载下来,包含下面两个文件(重写x-pack的两个类)

-rw-rw-r-- 1 elk  elk     4786 3月  21 15:34 LicenseVerifier.class
-rw-rw-r-- 1 elk  elk     2893 3月  21 15:34 XPackBuild.class

6.2.2 找到目标jar包

/elk/elasticsearch-6.7.0/modules/x-pack-core/x-pack-core-6.7.0.jar

6.2.3 替换jar包

为了能够分辨清楚,创建old,解压jar包
[elk@elk old]$ jar -xf x-pack-core-6.7.0.jar
-rw-rw-r-- 1 elk elk     994 3月  21 15:34 logstash-index-template.json
drwxrwxr-x 2 elk elk    4096 3月  21 15:34 META-INF
-rw-rw-r-- 1 elk elk    1247 3月  21 15:34 monitoring-alerts.json
-rw-rw-r-- 1 elk elk   24213 3月  21 15:34 monitoring-beats.json
-rw-rw-r-- 1 elk elk   32309 3月  21 15:34 monitoring-es.json
-rw-rw-r-- 1 elk elk    5899 3月  21 15:34 monitoring-kibana.json
-rw-rw-r-- 1 elk elk   11787 3月  21 15:34 monitoring-logstash.json
drwxrwxr-x 3 elk elk    4096 3月  21 15:34 org
-rw-rw-r-- 1 elk elk     294 3月  21 15:34 public.key
-rw-rw-r-- 1 elk elk     556 3月  21 15:34 rollup-dynamic-template.json
-rw-rw-r-- 1 elk elk    1859 3月  21 15:34 security_audit_log.json
-rw-rw-r-- 1 elk elk    6038 3月  21 15:34 security-index-template.json
-rw-rw-r-- 1 elk elk     893 3月  21 15:34 triggered-watches.json
-rw-rw-r-- 1 elk elk    1391 3月  21 15:34 watches.json
-rw-rw-r-- 1 elk elk   19869 3月  21 15:34 watch-history.json
替换jar包中的 LicenseVerifier.class,XPackBuild.class两个类文件
cp -a LicenseVerifier.class old/org/elasticsearch/license/
cp -a XPackBuild.class old/org/elasticsearch/xpack/core/
打包
[elk@elk old]$jar -cvf x-pack-core-6.7.0.jar
将打包好的x-pack-core-6.7.0.jar替换之前的/elk/elasticsearch-6.7.0/modules/x-pack-core/x-pack-core-6.7.0.jar目标jar包

6.2.4申请license并上传
根据上面的连接申请license,认真填写邮箱,用来接收json文件,country写china,其它都可以随便写,点击申请后邮箱会马上收到一个邮件
“type”:“basic” 替换为 “type”:"platinum" # 基础版变更为铂金版
“expiry_date_in_millis”:1561420799999 替换为 “expiry_date_in_millis”:3107746200000# 一个月变为50年
大概格式:

{"license":{
    "uid":"2651b126-fef3-480e-ad4c-a60eb696a733",
    "type":"platinum", # 白金
    "issue_date_in_millis":1533513600000,
    "expiry_date_in_millis":3107746200000, # 到期时间
.............................

当修改了时间和白金类型后,来到 Management 选择 License Management,点击update license上传以及修改好的License

ELK+filebeat+x-pack平台搭建_第6张图片
image.png

如上图,如果提示错误,注意修改打开elasticsearch.yml 配置文件 加入 xpack.security.enabled: false,或者执行“ 启动x-pack功能”再更新
破解成功后显示


ELK+filebeat+x-pack平台搭建_第7张图片
image.png

6.3启动x-pack功能:

es集群配置x-pack

6.3.1 开启es的登录功能,注意使用普通用户

[elk@elk old]$ cd /elk/elasticsearch-6.7.0/
bin/elasticsearch-setup-passwords interactive   ##注意修改elastic/kibana等账号的密码,elastic是登录es的最高权限账号
修改elasticsearch.yml配置:
cat /elk/elasticsearch-6.7.0/config/elasticsearch.yml
#添加如下2行,打开安全配置功能
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

6.3.2 修改kibana.yml配置

cat /elk/kibana-6.7.0/config/kibana.yml
#添加如下两行
29 elasticsearch.username: "kibana"
30 elasticsearch.password: "your passwd"

此处修改完,重启es和kibana服务就需要登录账号和密码了


ELK+filebeat+x-pack平台搭建_第8张图片
image.png

6.3.3 修改logstash.yml配置

219 xpack.monitoring.enabled: true
220 xpack.monitoring.elasticsearch.username: logstash_system
221 xpack.monitoring.elasticsearch.password: your passwd
222 xpack.monitoring.elasticsearch.hosts: ["http://192.168.100.203:9200"]

配置logstash.conf时要添加用户名密码,如

配置 5044 端口作为 Filebeat 的连接和创建 ES 索引,保存在 config 目录:
[elk@elk config]$ cat logstash-sample.conf 
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://192.168.100.203:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "your passwd"
  }
}

Logstash 使用该配置使用 ES 的索引,和 Filebeat 做的事情是一样的,不过拥有了额外的缓存以及强大丰富的插件库。
启动 logstash :
./bin/logstash -f config/logstash-sample.conf &
此时开启filebeat,就可以在es中查看到log了

参考:https://segmentfault.com/a/1190000010981283

7.filebeat安装

安装

[root@zabbix data]# tar -xzf filebeat-6.7.0-linux-x86_64.tar.gz
[root@zabbix data]# cd filebeat-6.7.0-linux-x86_64/

修改配置文件
注意:

  enabled: true        ##true
  paths:
    -  /confluence/confluence_home/logs/catalina.out  #填写具体的日志路径
  reload.enabled: true   ##true
 fields:
   env: wiki      ##名称
  output.logstash:
    hosts: ["IP:5044"]    ##注意输出到logstash中,需要填写logstash的IP和端口
[root@zabbix data]# vim filebeat.yml
filebeat.inputs:
- type: log
  enabled: true       
  paths:
    -  /confluence/confluence_home/logs/catalina.out
fields:
  env: wiki
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
setup.template.settings:
  index.number_of_shards: 3
setup.kibana:
output.logstash:
    hosts: ["IP:5044"]
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

启动

测试是否正常
./filebeat -configtest -e
启动
nohup ./filebeat -c ./filebeat.yml -e >/dev/null 2>filebeat.log &

打开kibana控制台可以看到


ELK+filebeat+x-pack平台搭建_第9张图片
image.png

注意:

如果数据无法传输要手动加载模板
在 Elasticsearch 中, Index Pattern 用于定义字段应如何分析的设置和映射。Filebeat 的默认 Index Pattern 由软件包安装。 如果在 filebeat.yml 配置文件中接受模板加载的默认配置,则 Filebeat 在成功连接到Elasticsearch后会自动加载模板。 如果模板已存在,默认不会覆盖,但是可以通过配置进行覆盖。如果要禁用自动模板加载,或者要加载自己的模板,可以在Filebeat配置文件中更改模板加载的设置。 如果选择禁用自动模板加载,则需要手动加载模板。
配置模板加载 - 仅Elasticsearch输出支持。
手动加载模板 - Logstash输出所需。
由于我们需要的是输出到 Logstash,所以我们使用手动模板加载:
curl -XPUT 'http://192.168.100.203:9200/_template/filebeat' -d@/data/filebeat-6.7.0-linux-x86_64/kibana/6/index-pattern/filebeat.json

8.kibana汉化

参考:https://github.com/anbai-inc/Kibana_Hanization

汉化方法(6.x)

  • 拷贝此项目中的translations文件夹到您的kibana目录下的src/legacy/core_plugins/kibana/目录。若您的kibana无此目录,那还是尝试使用此项目old目录下的汉化方法吧。
  • 修改您的kibana配置文件kibana.yml中的配置项:i18n.locale: "zh-CN"
  • 重启Kibana,汉化完成

9.Q&&A

  • filebeat 数据一直传输不过去
运行filebeat时,log中显示:
2019-04-04T10:58:39.928+0800    INFO    log/input.go:138    Configured paths: [/var/log/logstash/logstash-slowlog-plain*.log]
2019-04-04T10:58:39.929+0800    INFO    log/input.go:138    Configured paths: [/var/log/logstash/logstash-plain*.log]
查看/opt/filebeat-6.7.0-linux-x86_64/modules.d,发现logsatsh模块时打开的
./filebeat modules disable logstash
关闭后再次执行就会发送到配置文件中的logstash中了
多个log注意配置logstash
  • filebeat修改index默认名称,filebeat到es(单个)

参考:filebeat

默认值为 "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"
 # Array of hosts to connect to.
 hosts: ["localhost:9200"]
 index: "api-access-%{+yyyy.MM.dd}"
setup.template:
 name: 'api-access'
 pattern: 'api-access-*'
 enabled: false

filebeat修改index默认名称,filebeat到es(多个)

10. 参考

原理>>
elk常用架构以及场景介绍
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html
elk协议栈介绍
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/
安装>>
https://segmentfault.com/a/1190000010975383
grok学习>>
https://www.elastic.co/guide/en/kibana/7.1/xpack-grokdebugger.html
http://grokconstructor.appspot.com/
http://grokdebug.herokuapp.com/ 调试工具
https://zhuanlan.zhihu.com/p/26399963
http://docs.flycloud.me/docs/ELKStack/logstash/get-start/install.html
Elasticsearch权威指南中文版>>
https://es.xiaoleilu.com/030_Data/25_Update.html
ELK安全加固:https://shuwoom.com/?p=2846
日志收集原理

你可能感兴趣的:(ELK+filebeat+x-pack平台搭建)