一、案列分析
1.1案列概述
ELK 由 ElasticSearch、Logstash 和 Kiabana 三个开源工具组成,其官方网站为https://www.elastic.co/cn.
- Elasticsearch 是一个开源分布式实时分析搜索引擎,建立在全文搜索引擎库 ApacheLucene 基础上,同时隐藏了 Apache Lucene 的复杂性。Elasticsearch 将所有的功能打包成一个独立的服务,并提供了一个简单的 RESTfuAPI接口。它具有分布式、零配置、自动发现、索引自动分片、索引副本机制、RESTf 风格接口、多数据源、自动搜索负载等特点。
- Logstash 是一个完全开源的工具,主要用于日志收集,同时可以对数据处理,并输出给 Elasticsearch。
- Kibana 也是一个开源和免费的工具,Kibana 可以为 Logstash 和 ElasticSearch 提供图形化的日志分析 Web 界面,可以汇总、分析和搜索重要数据日志。
Logstash 收集 AppServer 产生的 Log,并存放到 ElasticSearch 群集中,而 Kibana 则从 ES 群集中查询数据生成图表,再返回给 Browser。简单来说,进行日志处理分析,一般需要经过以下几个步骤:
(1)将日志进行集中化管理。
(2)将日志格式化(Logstash)并输出到 Elasticsearch。
(3)对格式化后的数据进行索引和存储(Elasticsearch)。
(4)前端数据的展示(Kibana)。
1.2案列前置知识点
1.Elasticsearch 介绍
Elasticsearch 是一个基于 Lucene 的搜索服务器。它稳定、可靠、快速,而且具有比较好的水平扩展能力,为分布式环境设计,在云计算中被广泛应用。Elasticsearch 提供了一个分布式多用户能力的全文搜索引擎,基于 RESTfuWeb 接口。通过该接口,用户可以通过浏览器与 Elasticsearch 通信。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,Wikipedia、Stack、Overflow、GitHub 等都基于 Elasticsearch 来构建搜索引擎,具有实时搜索、稳定、可靠、快速、安装使用方便等特点。
Elasticsearch 的基础核心概念。
- 接近实时(NRT):Elasticsearch 是一个搜索速度接近实时的搜索平台,响应速度非常快,从开始索引一个文档到这个文档能够被搜索到只有一个轻微的延迟(通常是 1s)。
- 群集(cluster):群集就是由一个或多个节点组织在一起,在所有节点上存放用户数据,并一起提供索引和搜索功能。通过选举产生主节点,并提供跨节点的联合索引和搜索的功能。每个群集都有一个唯一标识的名称,默认是 Elasticsearch,每个节点是基于群集名字加入到群集中的。一个群集可以只有一个节点,为了具备更好的容错性,通常配置多个节点,在配置群集时,建议配置成群集模式。
- 节点(node):是指一台单一的服务器,多个节点组织为一个群集,每个节点都存储数据并参与群集的索引和搜索功能。和群集一样,节点也是通过名字来标识的,默认情况下,在节点启动时会随机分配字符名,也可以自定义。通过指定群集名字,节点可以加入到群集中。默认情况,每个节点都已经加入 Elasticsearch 群集。如果群集中有多个节点,它们将会自动组建一个名为 Elasticsearch 的群集。
- 索引(index):类似于关系型数据库中的"库"。当索引一个文档后,就可以使用Elasticsearch 搜索到该文档,也可以简单地将索引理解为存储数据的地方,可以方便地进行全文索引。在 index 下面包含存储数据的类型(Type),Type 类似于关系型数据库中的"表",用来存放具体数据,而 Type 下面包含文档(Document),文档相当于关系型数据库的"记录",一个文档是一个可被索引的基础信息单元。
- 分片和副本(shards&replicas):Elasticsearch 将索引分成若干个部分,每个部分称为一个分片,每个分片就是一个全功能的独立的索引。分片的数量一般在索引创建前指定,且创建索引后不能更改。分片的两个最主要原因如下。
- 水平分割扩展,增大存储量。
- 分布式并行跨分片操作,提高性能和吞吐量,
一个好的数据存储方案要求无论何种故障(如节点不可用)下数据都可用,并且具有较高的存储效率。为此,Elasticsearch将索引分片复制一份或多份,称为副本。副本是索引的另一个备份,用于数据冗余以及负载分担。默认情况下Elasticsearch 自动对索引请求进行负载分担。
总之,索引可以被分为若干个分片。这些分片也可以被复制0次(意思是没有复制)或多次。当有副本存在时,作为复制源的分片称为主分片,而作为复制目标的分片称为副本分片。分片和副本的数量可以在索引创建时指定。在索引创建之后,可以改变副本的数量,但是不能改变分片的数量。默认情况下,Elasticsearch 中的每个索引被分片成5个主分片和1个副本。在两个节点的场景中,每个索引将会有5个主分片和另外5个副本分片,每个索引总共就有 10 个分片。
2.Logstash 介绍
Logstash 由 JRuby 语言编写,运行在 Java虚拟机(JVM)上,是一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出。Logstash 具有强大的插件功能,常用于日志处理。 Logstash 可配置单一的代理端,与其他开源软件结合,以实现不同的功能Logstash 的理念很简单,它只做三件事情:数据输入、数据加工(如过滤,改写等)以及数据输出。通过组合输入和输出,可以实现多种需求。Logstash 处理日志时,典型的部署架构图如图 3.2 所示。
LogStash 的主要组件如下
- Shipper:日志收集者。负责监控本地日志文件的变化,及时收集最新的日志文件内容通常远程代理端(agent)只需要运行这个组件即可。
- Indexer:日志存储者。负责接收日志并写入到本地文件,
- Broker:日志 Hub。负责连接多个 Shipper 和多个 Indexer。
- Search and Storage:允许对事件进行搜索和存储。
- Web Interface:基于 Web 的展示界面。
正是由于以上组件在 LogStash 架构中可独立部署,才提供了更好的群集扩展性。
Logstash 使用管道方式进行日志的搜集处理和输出。有点类似 Linux 系统的管道命令将前一个流程的处理结果发送到后一个流程继续处理。在 Logstash 中,包括了三个阶段分别是输入(Input )、处理(Filter,非必需)和输出(Output),其关系如图 3.3 所示。
在图 3.3 中,整个流程为 Input 收集数据,Filter 处理数据,Output 输出数据。每个阶段也可以指定多种方式,如输出既可以输出到 Elasticsearch 中,也可以指定到 stdout 在控制台打印。这种插件式的组织方式,使得Logstash的扩展和定制非常方便。
3.Kibana 介绍
Kibana 是一个针对 Elasticsearch的开源分析及可视化平台,主要设计用来和Elasticsearch 一起工作,可以搜索、査看存储在 Elasticsearch 索引中的数据,并通过各种图表进行高级数据分析及展示。Kibana 可以让数据看起来一目了然。它操作简单,基于浏览器的用户界面可以让用户在任何位置都可以实时浏览。Kibana 可以快速创建仪表板(dashboard)实时显示 Elasticsearch 査询动态。Kibana 使用非常简单,只需要添加索引就可以监测 Elasticsearch 索引数据。
Kibana 的主要功能如下。
- Elasticsearch 无缝之集成。Kibana 架构是为 Elasticsearch 定制的,可以将任何(结构化和非结构化)数据加入 Elasticsearch 索引。Kibana 还充分利用了 Elasticsearch 强大的搜索和分析功能。
- 整合数据。Kibana 可以让海量数据变得更容易理解,根据数据内容可以创建形象的柱形图、折线图、散点图、直方图、饼图和地图,以方便用户查看。
- 复杂数据分析。Kibana 提升了 Elasticsearch 的分析能力,能够更加智能地分析数据执行数据转换并且根据要求对数据切割分块。
- 让更多团队成员受益。强大的数据库可视化接口让各业务岗位都能够从数据集合受益。
- 接口灵活,分享更容易。使用 Kibana 可以更加方便地创建、保存、分享数据,并将可视化数据快速交流。
- 配置简单。Kibana 的配置和启用非常简单,用户体验非常友好。Kibana 自带Web 服务,可以快速启动运行。
- 可视化多数据源。Kibana 可以非常方便地把来自 Logstash、ES-Hadoop、Beats 或第三方技术的数据整合到 Elasticsearch,支持的第三方技术包括 Apache Flume、Fluentd等
- 简单数据导出。Kibana 可以方便地导出感兴趣的数据,与其他数据整合并融合后快速建模分析,发现新结果。
1.3案列环境
1.实验拓扑图
说明:
新版的logstash自带缓存功能,不需要在使用zookeeper+kafka做消息中间件
elasticsearch服务器的数量需要奇数个,因为有脑裂的问题
2.主机清单
|----------|----------------|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| 主机名 | ip地址 | 操作系统 | 软件包 |
| web01 | 192.168.10.101 | CentOS7.9 | httpd filebeat-7.10.0-linux-x86_64.tar.gz |
| logstash | 192.168.10.102 | CentOS7.9 | java-11 logstash-7.10.0-linux-x86_64.tar.gz |
| elk1 | 192.168.10.103 | CentOS7.9 | java-11 elasticsearch-7.10.0-linux-x86_64.tar.gz kibana-7.10.0-linux-x86_64.tar.gz elasticsearch-head-master.zip phantomjs-2.1.1-linux-x86_64.tar.bz2 |
| elk2 | 192.168.10.104 | CentOS7.9 | java-11 elasticsearch-7.10.0-linux-x86_64.tar.gz |
3.设置主机名
按照主机清单为每一台主机设置主机名
4.在两台ES主机上设置hosts文件
cat <<EOF>>/etc/hosts
192.168.10.103 elk1
192.168.10.104 elk2
EOF
5.关闭所有节点的防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
二、部署ES群集
1.设置两台ES主机的系统环境(以elk1为例)
(1)创建运行用户
[root@elk1 ~]# useradd es
[root@elk1 ~]# passwd es
[root@elk1 ~]# gpasswd -a es wheel
(2)为用户授权
[root@elk1 ~]# visudo
#去掉下面一行前面的注释符号
%wheel ALL=(ALL) NOPASSWD: ALL
(3)安装java环境
[root@elk1 ~]# su - es
[es@elk1 ~]$ sudo yum -y install java-11
[es@elk1 ~]$ java -version
openjdk version "11.0.9.1" 2020-11-04 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.9.1+1-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.9.1+1-LTS, mixed mode, sharing)
(4)为用户设置资源访问限制
[es@elk1 ~]$ sudo vim /etc/security/limits.conf
es soft nofile 65535
es hard nofile 65535
es soft nproc 65535
es hard nproc 65535
es soft memlock unlimited
es hard memlock unlimited
备注:
es soft nofile 65535:一个进程最多能打开的的文件数
es hard nofile 65535
es soft nproc 65535:一个用户最多能创建的进程数
es hard nproc 65535
es soft memlock unlimited:最大锁定内存地址空间(unlimited不限制)
es hard memlock unlimited
[es@elk1 bin]$ sudo vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
备注:
它的默认值是65536
限制一个进程可以拥有的 VMA ( 虚拟内存区域 ) 的数量 。
虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。
这个参数会影响中间件可以开启的线程数量,如果值过小,有时可能会导致有些中间件无法开启足够的线程,进而报错。
将第二台ES主机也设置一下
重启系统
[es@elk1 ~]$ sudo reboot
2.在elk1上部署Elasticsearch软件
注意:elk1节点要做elk的master,需要较大的内存,我设置的是8G,设置4G时elk服务总是宕掉
(1)在elk1上安装Elasticsearch软件
[root@elk1 ~]# su - es
[es@elk1 ~]$ cd /opt
[es@elk1 opt]$ sudo tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz
[root@elk1 opt]$ sudo mv elasticsearch-7.10.0 /etc/elasticsearch
[es@elk1 opt]$ sudo vim /etc/elasticsearch/config/jvm.options
-Xms2g
-Xmx2g
备注:
JVM(java虚拟机)提供了大量的参数配置,可以通过配置这些参数对JVM进行调优。
Xms
英文解释:Initial heap size(in bytes)
中文释义:堆区初始值
使用方法:-Xms2g 或 -XX:InitialHeapSize=2048mXmx
英文解释:Maximum heap size(in bytes)
中文释义:堆区最大值
使用方法:-Xmx2g 或 -XX:MaxHeapSize=2048m
(2)更改Elasticsearch主配置文件
[es@elk1 ~]$ sudo vim /etc/elasticsearch/config/elasticsearch.yml
cluster.name: my-application ##17行,群集名称
node.name: elk1 ##23行,本节点主机名
path.data: /path/to/data ##33行,数据文件路径
path.logs: /path/to/logs ##37行,日志文件路径
bootstrap.memory_lock: false ##43行,锁定物理内存
network.host: 0.0.0.0 ##55行,监听地址
http.port: 9200 ##59行,监听端口
discovery.seed_hosts: ["elk1", "elk2"] ##68行,群集中的主机列表
cluster.initial_master_nodes: ["elk1"] ##72,master主机名称,群集的初始化会将此节点选举为master
http.cors.enabled: true
http.cors.allow-origin: "*"
注释:最后两行是增加的参数,这样head插件可以访问es
如果bootstrap.memory_lock这项使用默认配置true,会导致硬盘频繁读,可以配置为false锁定物理内存地址,防止es内存被交换出去,也就是避免es使用swap交换分区,频繁的交换,会导致IOPS(每秒钟输入输出)变高。
http.cors.enabled 是否支持跨域,默认为false
http.cors.allow-origin 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。
(3)创建数据存放路径并授权
[es@elk1 ~]$ sudo mkdir -p /path/to/data
[es@elk1 ~]$ sudo mkdir -p /path/to/logs
[es@elk1 ~]$ sudo chown -R es:es /path/to
[es@elk1 ~]$ sudo chown -R es:es /etc/elasticsearch/
(4)启动es(启动有点慢)
[es@elk2 root]$ /etc/elasticsearch/bin/elasticsearch &
[es@elk1 ~]$ sudo netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 6987/java
3.在elk2节点上安装Elasticsearch软件
(1)在elk2上安装Elasticsearch软件
[es@elk2 ~]$ cd /opt
[es@elk2 opt]$ sudo tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz
[es@elk2 ~]$ sudo mv elasticsearch-7.10.0 /etc/elasticsearch
[es@elk2 ~]$ sudo vim /etc/elasticsearch/config/jvm.options
-Xms2g
-Xmx2g
(2)更改Elasticsearch主配置文件
[es@elk2 ~]$ sudo vim /etc/elasticsearch/config/elasticsearch.yml
cluster.name: my-application ##17行
node.name: elk2 ##23行
path.data: /path/to/data ##33行
path.logs: /path/to/logs ##37行
bootstrap.memory_lock: false ##43行
network.host: 0.0.0.0 ##55行
http.port: 9200 ##59行
discovery.seed_hosts: ["elk1", "elk2"] ##68行
cluster.initial_master_nodes: ["elk1"] ##72
(3)创建数据存放路径并授权
[es@elk2 ~]$ sudo mkdir -p /path/to/data
[es@elk2 ~]$ sudo mkdir -p /path/to/logs
[es@elk2 ~]$ sudo chown -R es:es /path/to
[es@elk2 ~]$ sudo chown -R es:es /etc/elasticsearch/
(4)启动es(启动有点慢)
[es@elk2 root]$ /etc/elasticsearch/bin/elasticsearch &
4.查看是否开启成功
(1)在elk1上启动
[es@elk1 ~]$ sudo netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 6987/java
(2)在elk2上启动
[es@elk2 ~]$ sudo netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 5991/java
5.查看节点信息
http://192.168.10.103:9200/_cat/nodes
浏览器访问后能看到如下群集信息
192.168.10.104 5 77 12 1.06 0.46 0.47 mdi - elk2
192.168.10.103 5 90 22 0.54 0.41 0.54 mdi * elk1
带有星号的是master节点,
6.在elk1节点上安装head插件
(此步骤需要联网,速度很慢,如果不需要head,此步骤可省去)
elasticsearch-head是一个数据可视化工具
配置好阿里的yum源
[es@elk1 ~]$ sudo yum -y install npm bzip2 nodejs
备注:
NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块的标准。2020年3月17日,Github宣布收购npm,GitHub现在已经保证npm将永远免费。
[es@elk1 elasticsearch-head-master]$ sudo npm install
在该目录下启动
[es@elk1 elasticsearch-head-master]$ sudo npm run start &
[es@elk1 elasticsearch-head-master]$ sudo netstat -anpt | grep 9100
在elk1节点上打开网页,访问http://192.168.10.103:9100/,验证插件安装结果
三、安装logstash
1.在logstash服务器上安装logstash
[root@localhost ~]# hostnamectl set-hostname losstash
[root@localhost ~]# bash
[root@losstash ~]# systemctl stop firewalld
[root@losstash ~]# setenforce 0
[root@losstash ~]# yum -y install java-11
[root@losstash ~]# tar zxvf logstash-7.10.0-linux-x86_64.tar.gz
[root@losstash ~]# mv logstash-7.10.0 /etc/logstash
[root@losstash ~]# chmod -R 777 /etc/logstash/data/
2.测试安装结果
(1)直接将消息输出到屏幕
[root@losstash ~]# /etc/logstash/bin/logstash -e 'input { stdin { } } output { stdout {codec => rubydebug} }'
注意:执行该命令后稍微等一下,会出现一个消息格式,可以输入一些字符串,作为该消息的内容
退出按Ctrl+C,如果命令失败,删除logstash目录的的data子目录
例如下列显示:
nihao
{
"@timestamp" => 2020-03-14T03:20:24.229Z,
"@version" => "1",
"host" => "elk1",
"message" => "nihao "
}
(2)将消息输出到es(如果没有安装head组件,此步骤省去)
[root@losstash ~]# /etc/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["192.168.10.103:9200"] } stdout { codec => rubydebug }}'
稍等一下可以输入一些字符串作为消息
再打开http://192.168.10.103:9100/查看消息内容
3.使用Logstash采集系统日志并输出到elk
注意:logstash可以直接采集业务主机上的个服务的日志,也可以作为其他服务器的日志集中器,将日志进行过滤后再转发给es主机
利用logstash采集本主机的日志(以messages为例)
[root@losstash ~]# chmod o+r /var/log/messages
[root@losstash ~]# vim /etc/logstash/config/system.conf
input {
file {
path=>"/var/log/messages"
type=>"system"
start_position=>"beginning"
}
}
output {
elasticsearch {
hosts=>["192.168.10.103:9200"]
index=>"system-%{+YYYY.MM.dd}"
}
}
注释:index=>"system-%{+YYYY.MM.dd}"为日志的索引名称,前缀为system-
[root@losstash ~]# /etc/logstash/bin/logstash -f /etc/logstash/config/system.conf &
打开http://192.168.10.103:9100/,查看system日志,如下图(如果没有安装head组件,此步骤省去)
四、在产生日志的客户端服务器上安装filebeat
在web01
1.安装httpd,模拟一个产生日志的服务
[root@localhost ~]# hostnamectl set-hostname web01
[root@localhost ~]# bash
[root@web01 ~]# yum -y install httpd
[root@web01 ~]# systemctl start httpd
[root@web01 ~]# echo 'www.benet.com' > /var/www/html/index.html
[root@web01 ~]# curl 192.168.10.101
[root@web01 ~]# cat /var/log/httpd/access_log
[root@web01 ~]# cat /var/log/httpd/error_log
2.安装filebeat
[root@web01~]# tar zxvf filebeat-7.10.0-linux-x86_64.tar.gz
[root@web01 ~]# mv filebeat-7.10.0-linux-x86_64 /etc/filebeat
3.配置web01服务器filebeat的输出
(1)修改filebeat文件,将filebeat输出的日志输入到远程的logstash
[root@web01 ~]# cd /etc/filebeat/
[root@web01 filebeat]# mv filebeat.yml filebeat.yml.bak
[root@web01 filebeat]# vim filebeat.yml
filebeat.inputs:
- type: log
paths:
- /var/log/httpd/access_log
output.logstash:
hosts: ["192.168.10.102:5044"]
(2)启动filebeat服务
[root@web01 ~]# /etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml &
备注:
关闭filebeat
[root@localhost filebeat]# jobs -l
然后杀死对应的进程ID
4.修改logstash的配置文件,使日志输出到 elasticsearch
如果发现logstash属于开启状态,就先关闭掉
可以先查一下logstash的进程,netstat -anpt | grep 5044,再杀死这个进程
如果要把日志提交给ES,可以使用如下内容
[root@logstash ~]# vim /etc/logstash/config/beats.conf
input {
beats {
port => "5044"
codec => "json"
}
}
output{
elasticsearch {
hosts => ["192.168.10.103:9200"]
index => "weblog-beat-%{+YYYY.MM.dd}"
}
}
备注:
Codec 是 logstash 从 1.3.0 版开始新引入的概念(Codec 来自 Coder(编码)/decoder(解码) 两个单词的首字母缩写)。
在此之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。但现在,我们可以在输入 期处理不同类型的数据,这全是因为有了 codec 设置。
所以,Logstash 不只是一个input | filter | output 的数据流,而是一个 input | decode | filter | encode | output 的数据流!codec 就是用来 decode、encode 事件的。
codec 的引入,使得 logstash 可以更好更方便的与其他有自定义数据格式的运维产品共存,比如 graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用数据格式的其他产品等。
5.运行logstash
/etc/logstash/bin/logstash -f /etc/logstash/config/beats.conf --path.data=/etc/logstash/config.d/web01 &
备注:
如果需要同时运行多个logstash,需要使用不同的路径保存不同的日志数据。--path.data用来指定数据文件路径访问一下web01的网站,产生一个日志
6.打开 http:// 192.168.10.103 :9100/ , 查看日志,如下图
(如果没有安装head组件,此步骤省去)
五、安装Kibana
用es用户身份运行
1.在elk1上安装Kibana
[es@elk1 opt]$ sudo tar zxvf kibana-7.10.0-linux-x86_64.tar.gz
[es@elk1 opt]$ sudo mv kibana-7.10.0-linux-x86_64 /etc/kibana
[es@elk1 opt]$ sudo chown -R es:es /etc/kibana/
2.修改Kibana主配置文件
[es@elk1 opt]$ sudo vim /etc/kibana/config/kibana.yml
server.port: 5601 ##2行,监听端口
server.host: "0.0.0.0" ##7行,监听地址
elasticsearch.hosts: "http://192.168.10.103:9200" ##28行,ES主机的IP地址
kibana.index: ".kibana" ##32行
3.启动Kibana服务
[es@elk1 opt]$ /etc/kibana/bin/kibana &
4.验证Kibana
(1)浏览器访问
(2)将elk1主机的系统日志添加到kibana
在主菜单中,找到Discover,
备注:如果看不到日志,可以访问一下网站,生成日志信息后,刷新一下kibana就可以看到日志了
备注:如果想添加第二个日志,在主菜单中找到Management--》Stack Management,然后点击Kibana下的Index Patterns,再点击右上角的++++Create index pattern++++
KQL:
(1)显示某一个时间范围内的日志消息
@timestamp > "2023-10-24T11:53:34" and @timestamp < "2023-10-24T11:53:39"