ELK(ElasticSearch, Logstash, Kibana)从入门到精通

简介

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第1张图片

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

原理图

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第2张图片
如图:Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。

ELK组件介绍

Elasticsearch

Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene基础上的搜索引擎,使用Java语言编写

主要特点 实时分析 分布式实时文件存储,并将每一个字段都编入索引 文档导向,所有的对象全部是文档 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)。支持 JSON。
ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第3张图片
ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第4张图片

Logstash

Logstash 是一个具有实时渠道能力的数据收集引擎。使用 JRuby 语言编写。其作者是世界著名的运维工程师乔丹西塞 (JordanSissel)

主要特点

  • 几乎可以访问任何数据
  • 可以和多种外部应用结合
  • 支持弹性扩展

它由三个主要部分组成:

  • Shipper-发送日志数据
  • Broker-收集数据,缺省内置 Redis
  • Indexer-数据写入

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第5张图片

Kibana

Kibana是一款基于 Apache开源协议,使用 JavaScript语言编写,为 Elasticsearch提供分析和可视化的 Web 平台。它可以在Elasticsearch的索引中查找,交互数据,并生成各种维度的表图.

Filebeat

ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder源代码开发,是对它的替代。在需要采集日志数据的 server 上安装Filebeat,并指定日志目录或日志文件后,Filebeat就能读取数据,迅速发送到Logstash进行解析,亦或直接发送到 Elasticsearch进行集中式存储和分析。

常用架构

beats+elasticsearch+kibana模式

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第6张图片

如上图所示,该ELK框架由beats(日志分析我们通常使用filebeat)+elasticsearch+kibana构成,这个框架比较简单,入门级的框架。其中filebeat也能通过module对日志进行简单的解析和索引。并查看预建的Kibana仪表板。

该框架适合简单的日志数据,一般可以用来玩玩,生产环境建议接入logstash

beats+logstash+elasticsearch+kibana模式

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第7张图片
该框架是在上面的框架的基础上引入了logstash,引入logstash带来的好处如下:

  • 通Logstash具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻背压
  • 从其他数据源(例如数据库,S3或消息传递队列)中提取
  • 将数据发送到多个目的地,例如S3,HDFS或写入文件
  • 使用条件数据流逻辑组成更复杂的处理管道

filebeat结合logstash带来的优势:

1、水平可扩展性,高可用性和可变负载处理:filebeat和logstash可以实现节点之间的负载均衡,多个logstash可以实现logstash的高可用

2、消息持久性与至少一次交付保证:使用Filebeat或Winlogbeat进行日志收集时,可以保证至少一次交付。从Filebeat或Winlogbeat到Logstash以及从Logstash到Elasticsearch的两种通信协议都是同步的,并且支持确认。Logstash持久队列提供跨节点故障的保护。对于Logstash中的磁盘级弹性,确保磁盘冗余非常重要。

3、具有身份验证和有线加密的端到端安全传输:从Beats到Logstash以及从 Logstash到Elasticsearch的传输都可以使用加密方式传递 。与Elasticsearch进行通讯时,有很多安全选项,包括基本身份验证,TLS,PKI,LDAP,AD和其他自定义领域

当然在该框架的基础上还可以引入其他的输入数据的方式:比如:TCP,UDP和HTTP协议是将数据输入Logstash的常用方法(如下图所示):
ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第8张图片

beats+缓存/消息队列+logstash+elasticsearch+kibana模式

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第9张图片
在如上的基础上我们可以在beats和logstash中间添加一些组件redis、kafka、RabbitMQ等,添加中间件将会有如下好处:

第一,降低对日志所在机器的影响,这些机器上一般都部署着反向代理或应用服务,本身负载就很重了,所以尽可能的在这些机器上少做事;

第二,如果有很多台机器需要做日志收集,那么让每台机器都向Elasticsearch持续写入数据,必然会对Elasticsearch造成压力,因此需要对数据进行缓冲,同时,这样的缓冲也可以一定程度的保护数据不丢失;

第三,将日志数据的格式化与处理放到Indexer中统一做,可以在一处修改代码、部署,避免需要到多台机器上去修改配置

ELK环境搭建完整说明

环境说明:
    系统:centos7.5
    ElasticSerach:6.4.2
    Logstash:6.4.2
    Kibana:6.4.2
    Filebeat:6.4.2

elk各个组件的网址可以在官网下载:https://www.elastic.co/cn/

或者在中文社区下载:https://elasticsearch.cn/download/

部署架构图
ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第10张图片
流程说明:

  1. 业务请求到达nginx-server机器上的Nginx;
  2. Nginx响应请求,并在access.log文件中增加访问记录;
  3. FileBeat搜集新增的日志,通过LogStash的5044端口上传日志;
  4. LogStash将日志信息通过本机的9200端口传入到ElasticSerach;
  5. 搜索日志的用户通过浏览器访问Kibana,服务器端口是5601;
  6. Kibana通过9200端口访问ElasticSerach;

1.安装java环境

因为ElasticSerach运行需要java环境支持,所以首先要配置java环境,具体操作方法自行百度吧,网上比较多。

2.下载ELK安装包

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

手动下载ELK安装的tag.gz文件,这里我们放入/usr/local/work/下,并解压缩,最终效果如下:

在这里插入图片描述

3.创建用户

因为ElasticSerach运行时不允许以root用户身份的,所以这里需要手动创建用户并分配权限,具体如下:

  1. 创建用户组:

     groupadd elasticsearch
    
  2. 创建用户加入用户组:

     useradd elasticsearch -g elasticsearch
    
  3. 设置ElasticSerach文件夹为用户elasticsearch所有:

     chown -R elasticsearch.elasticsearch /usr/local/work/elasticsearch-6.4.2
    

4.系统设置部分

  1. 打开文件/etc/security/limits.conf,添加下面4处内容:

     soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096
    
  2. 打开文件/etc/sysctl.conf,添加下面内容:

     vm.max_map_count=655360
    
  3. 加载sysctl配置,执行命令:sysctl -p

  4. 重启电脑,执行命令:reboot

5.启动ElasticSerach

  1. 切换到用户elasticsearch:su elasticsearch
  2. 进入目录/usr/local/work/elasticsearch-6.4.2
  3. 执行启动命令:bin/elasticsearch -d,此时会在后台启动elasticsearch(如果启动报错没有权限的话,重新执行上面的chown那部分命令设置权限)
  4. 查看启动日志可执行命令:tail -f /usr/local/work/elasticsearch-6.4.2/logs/elasticsearch.log
  5. 执行curl命令检查服务是否正常响应:curl 127.0.0.1:9200,收到响应如下:

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第11张图片
具体效果
ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第12张图片
ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第13张图片

6.配置启动Logstash

1.在目录/usr/local/work/logstash-6.4.2下创建文件default.conf,内容如下:

监听5044端口作为输入 input { beats { port => “5044” } } # 数据过滤 filter { grok { match => { “message” => “%{COMBINEDAPACHELOG}” } } geoip { source => “clientip” } } # 输出配置为本机的9200端口,这是ElasticSerach服务的监听端口 output { elasticsearch { hosts => [“127.0.0.1:9200”] } }

  1. 后台启动Logstash服务:

     nohup bin/logstash -f default.conf –config.reload.automatic &
    
  2. 查看启动日志:tail -f logs/logstash-plain.log,启动成功的信息如下:

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第14张图片

7.Kibana

  1. 打开Kibana的配置文件/usr/local/work/kibana-6.4.2-linux-x86_64/config/kibana.yml,找到下面这行:

#server.host: “localhost”

改成如下内容:

server.host: “192.168.21.128”

  1. 进入Kibana的目录:

/usr/local/work/kibana-6.4.2-linux-x86_64

  1. 执行启动命令:

nohup bin/kibana &

  1. 查看启动日志:

tail -f nohup.out
5.在浏览器访问http://192.168.21.128:5601,看到如下页面:
https://ask.qcloudimg.com/http-save/yehe-1141560/si85o0ggj6.png?imageView2/2/w/1620

注意:
这里访问5601的时候可能访问不通,centos有自己的防火墙及端口限制,参考以下做法

关闭swap分区
内存 2G
iptables -nL
iptables -F
iptables -X
iptables -Z
iptables -nL
#关闭selinux
临时⽣效:
setenforce 0
getenforce
永久⽣效:
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

8.配置Filebeat,传送nginx日志至LogStash

  1. 打开文件/usr/local/work/filebeat-6.4.2-linux-x86_64/filebeat.yml,找到如下图的位置并设置:
    ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第15张图片

  2. 继续修改filebeat.yml文件,找到下图中的内容并设置:

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第16张图片
3. 启动FileBeat:

nohup ./filebeat -e -c filebeat.yml -d “publish” &

  1. 验证kibana是否能显示nginx的日志

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第17张图片

备注

配置加密通信证书

方法一:

./bin/elasticsearch-certutil ca -out config/elastic-certificates.p12 -pass “password”

查看config目录,有elastic-certificates.p12文件生成

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第18张图片
方法二:

./bin/elasticsearch-certutil ca #创建集群认证机构,需要交互输入密码
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 #为节点颁发证书,与上面密码一样
执行./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password 并输入第一步输入的密码
执行./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 并输入第一步输入的密码
将生成的elastic-certificates.p12、elastic-stack-ca.p12文件移动到config目录下

head插件安装

https://github.com/mobz/elasticsearch-head #head官网
https://nodejs.org/zh-cn/download/ #nodejs下载

官方说明,elasticsearch7有三种方式使用head插件,这里我只试过两种:

第一种:使用谷歌浏览器head插件,这个直接在谷歌浏览器上面安装插件就可以使用了

第二种:使用head服务(把head当做一个服务来使用),安装如下

#Running with built in server
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
open http://localhost:9100/

如果在如上的安装过程中报错,可以尝试下这个命令再继续安装npm install [email protected] --ignore-scripts

实战案例分析

我们弄一个beats+缓存/消息队列+logstash+elasticsearch+kibana的实例:

中间组件我们使用kafka,我们看下filebeat把kafka作为output的官网:https://www.elastic.co/guide/en/beats/filebeat/7.7/kafka-output.html

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第19张图片

假如你已经有kafka集群了,我这里安装的是一个单机版本(1.1.1):

数据集我们采用apache的日志格式,下载地址:https://download.elastic.co/demos/logstash/gettingstarted/logstash-tutorial.log.gz

日志格式如下:

[elk@gk ~]$ tail -3 logstash-tutorial.log 
86.1.76.62 - - [04/Jan/2015:05:30:37 +0000] "GET /projects/xdotool/ HTTP/1.1" 200 12292 "http://www.haskell.org/haskellwiki/Xmonad/Frequently_asked_questions" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140205 Firefox/24.0 Iceweasel/24.3.0"
86.1.76.62 - - [04/Jan/2015:05:30:37 +0000] "GET /reset.css HTTP/1.1" 200 1015 "http://www.semicomplete.com/projects/xdotool/" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140205 Firefox/24.0 Iceweasel/24.3.0"
86.1.76.62 - - [04/Jan/2015:05:30:37 +0000] "GET /style2.css HTTP/1.1" 200 4877 "http://www.semicomplete.com/projects/xdotool/" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140205 Firefox/24.0 Iceweasel/24.3.0"

1. 首先我们配置filebeat的配置文件filebeat.yml

#=========================== Filebeat inputs =============================

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /data/elk/logstash-tutorial.log  #这里使用的是apache的日志格式
    #- c:\programdata\elasticsearch\logs\*

  # Exclude lines. A list of regular expressions to match. It drops the lines that are
  # matching any regular expression from the list.
  #exclude_lines: ['^DBG']

  # Include lines. A list of regular expressions to match. It exports the lines that are
  # matching any regular expression from the list.
  #include_lines: ['^ERR', '^WARN']

  # Exclude files. A list of regular expressions to match. Filebeat drops the files that
  # are matching any regular expression from the list. By default, no files are dropped.
  #exclude_files: ['.gz$']

  # Optional additional fields. These fields can be freely picked
  # to add additional information to the crawled log files for filtering
  #fields:
  #  level: debug
  #  review: 1

  ### Multiline options

  # Multiline can be used for log messages spanning multiple lines. This is common
  # for Java Stack Traces or C-Line Continuation

  # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
  #multiline.pattern: ^\[

  # Defines if the pattern set under pattern should be negated or not. Default is false.
  #multiline.negate: false

  # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
  # that was (not) matched before or after or as long as a pattern is not matched based on negate.
  # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
  #multiline.match: after
#================================ Outputs =====================================
output.kafka:
  hosts: ["192.168.110.130:9092"]   #配置kafka的broker
  topic: 'filebeat_test'   #配置topic 名字
  partition.round_robin:
    reachable_only: false
  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000

2.然后使用命令后台启动:

cd filebeat-7.7.0-linux-x86_64 && nohup ./filebeat -e &

3.接下来我们配置logstash的配置文件

cd logstash-7.7.0/ && mkidr conf.d
cd conf.d
vim apache.conf 
################apache.conf文件中填入如下内容##############################
input {
        kafka{
                bootstrap_servers => "192.168.110.130:9092"
                topics => ["filebeat_test"]
                group_id => "test123"
                auto_offset_reset => "earliest"
        }
    }
filter {
json
        {
                source => "message"
        }
        grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
        remove_field => "message"
    }
}
output {
    stdout { codec => rubydebug }
    elasticsearch {
                    hosts => ["192.168.110.130:9200","192.168.110.131:9200","10.18.126.224:9200","192.168.110.132:9200"]
                    index => "test_kakfa"
                    user => "elastic"
                    password => "${ES_PWD}"
                }
}

4.然后后台启动logstash命令

cd logstash-7.7.0/ && nohup ./bin/logstash -f conf.d/apache.conf &

5.然后我们查看elasticsearch集群查看该索引

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第20张图片
ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第21张图片

6. 接下来我们登录到kibana查看该索引的分析

ELK(ElasticSearch, Logstash, Kibana)从入门到精通_第22张图片

你可能感兴趣的:(运维,elasticsearch,搜索引擎,ELK)