一、ELK日志分析系统
ELK是三个软件的统称,即Elasticsearch、Logstash和Kibana三个开源软件的缩写。这三款软件都是开源软件,通常配合使用,并且都先后归于Elastic.co企业名下,故被简称为ELK协议栈。ELK主要用于部署在企业架构中,收集多台设备上多个服务的日志信息,并将其统一整合后提供给用户。它可以从任何来源、任何格式进行日志搜索、分析与可视化展示。
ELK官网网址如下:https://www.elastic.co/cn/。
1、ELK日志分析系统组成
在ELK架构中,Elasticsearch、Logstash和Kibana三款软件作用如下:
① elasticsearch (es) :通过搭建群集;存储日志数据,索引日志数据
② logstash :收集日志,收集到了后给es存储
③ kibana :视图形式展现日志信息,更加人性化
1.1 Elasticsearch (es)
Elasticsearch是一个高度可扩展的全文搜索和分析引擎,基于Apache Lucence(事实上,Lucence也是百度所采用的搜索引擎)构建,能够对大容量的数据进行接近实时的存储、搜索和分析操作。
1.2 Logstash
Logstash是一个数据收集引擎,它可以动态的从各种数据源搜集数据,并对数据进行过滤、分析和统一格式等操作,并将输出结果存储到指定位置上。Logstash支持普通的日志文件和自定义Json格式的日志解析。
1.3 Kibana
Kibana是一个数据分析和可视化平台,通常与Elasticsearch配合使用,用于对其中的数据进行搜索、分析,并且以统计图标的形式展示。
2、日志处理步骤
- 将日志进行集中化管理
- 将日志格式化(Logstash)并输出到Elasticsearch
- 对格式化后的数据进行索引和存储(Elasticsearch)
- 前端数据的展示(Kibana)
二、Elasticsearch
1、Elasticsearch概述
提供了一个分布式多用户能力的全文搜索引擎
2、Elasticsearch核心概念
2.1 接近实时(NRT)
elasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)
2.2 cluster集群,ES是一个分布式的系统
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。
—个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。es具有集群机制,节点通过集群名称加入到集群中,同时在集群中的节点会有一个自己的唯一身份标识(自己的名称)
2.3 Node节点,就是集群中一台服务器
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。在集群中用于识别服务器对于的节点。
节点可以通过指定集群名字来加入集群中。默认情况,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticserech的集群。
2.4 index索引
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户的数据的索引、一个产品目录的索引、还有个订单数据的索引。一个索引用一个名字来标识(必须全部是小写字母组合),并且当我们要对应的索引中文档进行索引、收缩、更新和删除的时候,都要用到这个名字。在一个集群中,可以定义多个索引。(索引相当于关系型数据库的库)
类型相当于关系数据库的表——》索引(库)-》类型(表)-》文档(记录)
2.5 类型(type)
类型(type)在一个索引中,你可以定义一种或多种类型。一个类型是你的索引一个逻辑上的分类分区,其寓意完全由你来定义。通常,会为具有一组共同字段的文段定义一个类型。比如:我们假设运营一个博客平台并且将所有的数据存储到一个索引中,在一个索引中,你可以为用户数据定义一个类型,为博客数据定义一个类型,也可以为评论数据定义另一个类型(类型相当于关系型数据库的表)
2.6 文档(document)
文档就是最终的数据了,可以认为一个文档就是一条记录。是ES里面最小的数据单元,就好比表里面的一条数据
3、 分片和副本(shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个10亿文档需1TB空间可能不适合存储在单个节点的磁盘上或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
什么是分片?
索引存储的数据可能超过单个节点的硬件限制。
为了解决这个问题,ES提供了将索引分成多个分片的功能,当在创建索引时,可以定义想要的分片数量,每一个分片就是一个全功能独立的索引。为什么要分片?
水平分割扩展,增大存储量
分布式并跨越分片操作, 提高性能和吞吐量什么是副本?
为了健壮性,高可用性,可以故障切换。
es将分片复制一份或多份放在不同的节点主机上,称为分片副本。为什么要副本?
高可用性,以应对分片或者节点故障,出于这个原因,分片副本要在不同的节点上。
性能加强,增强吞吐量,搜索可以并行在所有副本上执行分片的优点
1、允许你水平分割/扩展你的内容容量
2、允许你在分片之上进行分布式的,并行的操作,进而提高性能/吞吐量
3、分片的分布,它的文档怎么聚合回搜索请求,完全有Elasticsearch管理
4、es和传统数据库的区别
① 结构名称不同
关系型数据库:数据库–>表–>行—>列
Elasticsearch:索引—>类型—>文档---->字段
② ES分布式,传统数据库遍历式索引
ES支持分片和复制,从而方便水平分割和扩展,复制保证可es的高可用与高吞吐。
在es中,当你创建一个索引(数据库)的时候,你可以指定你想要的分片的数量,每个分片本身也是一个功能完善并且独立的索引(数据库),索引可以被防止到集群中的任何节点上。
③ ES采用倒排索引,传统数据库采用B+树索引
- 正排索引:id---->values
- 倒排索引:values—>id
④ ES没有用户验证和权限控制
⑤ ES没有事务的概念,不支持回滚,误删不能恢复
⑥ ES免费,完全开源,传统的数据库部分免费
三、Logstash
1、Logstash简介
—款强大的数据处理工具
可实现数据传输、格式处理、格式化输出
数据输入(从业务输入)、数据加工(如过滤、改写等)以及数据输出(输出到Elasticsearch群集)
2、Logstash的主要组件
shipper:日志收集者,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可
indexer:日志存储者,负责接收日志并写入到本地文件
broker:日志hub,负责连接多个shipper和多个indexer
search and storage:允许对事件进行搜索和存储
web interface:基于Web的展示界面
以上组件在Logstash架构中可以独立部署,因此提供了很好的集群扩展性
四、Kibana
1、Kibana简介
一个针对Elasticsearch的开源分析及可视化平台;
搜索、查看存储在Elasticsearch索引中的数据;
通过各种图标进行高级数据分析及展示;
让海量数据更容易理解;
操作简单,基于浏览器地用户界面就可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态;
设置安装Kibana非常简单,无需编写代码,几分钟内就可以完成Kibana安装并启动Elasticsearch监测。
2、Kibana主要功能
(1)Elasticsearch无缝之集成。Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化数据加入Elasticsearch索引。Kibana还充分利用了Elasticsearch强大的搜索和分析功能。
(2)整合数据:Kibana能够更好地处理海量数据,并据此创建柱形图、折线图、散点图、直方图、饼图和地图。
(3)复杂数据分析:Kibana提升了Elasticsearch分析能力,能够更加智能地分析数据,执行数学转换并且根据要求对数据切割分块。
(4)让更多团队成员受益:强大的数据库可视化接口让各业务岗位都能够从数据集合受益。
(5)接口灵活,分享更容易:使用Kibana可以更加方便地创建、保存、分享数据,并将可视化数据快速交流。
(6)配置简单:Kibana的配置和启用非常简单,用户体验非常友好。Kibana自带Web服务器,可以快速启动运行。
(7)可视化多数据源:Kibana可以非常方便地把来自Logstash、ES-Hadoop、Beats或第三方技术的数据整合到Elasticsearch,支持的第三方技术包括Apache Flume、Fluentd等。
(8)简单数据导出:Kibana可以方便地导出感兴趣的数据,与其它数据集合并融合后快速建模分析,发现新结果。
五、ELK架构![](https://i-blog.csdnimg.cn/blog_migrate/b97db0f80009223860735bd0cc1b5211.png)
如上图所示,Logstash安装在各个设备上,用于收集日志信息,收集到的日志信息统一汇总到Elasticsearch上,然后由Kibana负责web端的展示。其中,如果终端设备过多,会导致Elasticsearch过载的现象,此时,我们可以采用一台Redis设备作为消息队列,以暂时缓存数据,避免Elasticsearch压力突发
六、ELK优点
① 处理方式灵活。 Elasticsearch是全文索引,具有强大的搜索能力。
② 配置相对简单。 Kibana的配置非常简单,Elasticsearch则全部使用Json接口,配置也不复杂,Logstash的配置使用模块的方式,配置也相对简单。
③ 检索性能高。 ELK架构通常可以达到百亿级数据的查询秒级响应。
④ 集群线性扩展。 Elasticsearch本身没有单点的概念,自动默认集群模式,Elasticsearch和Logstash都可以
⑤ 灵活扩展。
⑥ 页面美观。 Kibana的前端设计美观,且操作简单
七、部署ELK日志分析系统
1、部署环境
1.1 了解架构部署
主机名 | ip地址 | 主要软件 |
---|---|---|
node1 | 192.168.80.50 | ElasticSearh、Kibana |
node2 | 192.168.80.60 | ElasticSearh |
apache | 192.168.80.70 | Logstash、Apache |
日志分析系统原理
首先有Apache产生大量的日志在本机中,那么Logstash就会input获取日志,然后进行Filter Plugin(过滤日志和格式处理),最后将处理好的日志outpu发送日志到ES的cluster集群中。
ES将收到的日志进行索引和存储。
最后可以使用Kibana进行查看分析日志。
2、在节点1上部署ElasticSearch(ES)
2.1 配置域名及安装 JDK并设置JDK的环境变量
vim /etc/hosts
192.168.80.50 node1
192.168.80.60 node2
192.168.80.70 httpd
上传jdk-8u201-linux-x64.rpm 到/opt/ELK
解压rpm -ivh jdk-8u201-linux-x64.rpm
#查看当前系统环境下java版本
java -version#设置JDK的环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH###加载生效、查看版本
source /etc/profile.d/java.sh
java -version
2.2 部署安装Elasticsearch软件
cd /opt/ELK
上传 压缩包 elasticsearch-5.5.0.rpm
rpm -ivh elasticsearch-5.5.0.rpm 解包
cd /etc/elasticsearch/
cp elasticsearch.yml elasticsearch.yml.bak 备份es配置文件
2.3 配置Elasticsearch主配置文件
vim /etc/elasticsearch/elasticsearch.yml
--17--取消注释,指定集群名字
cluster.name: wang
--23--取消注释,指定节点名字:Node1节点为node1,Node2节点为node2
node.name: node1
--33--取消注释,指定数据存放路径
path.data: /data/elk_data
--37--取消注释,指定日志存放路径
path.logs: /var/log/elasticsearch/
--43--取消注释,改为在启动的时候不锁定内存
bootstrap.memory_lock: false
--55--取消注释,设置监听地址,0.0.0.0代表所有地址
network.host: 0.0.0.0
--59--取消注释,ES 服务的默认监听端口为9200
http.port: 9200
--68--取消注释,集群发现通过单播实现,指定要发现的节点 node1、node2
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
grep -v "^#" /etc/elasticsearch/elasticsearch.yml 查看配置过得信息
2.4、创建数据存放路径并授权并开启服务
mkdir -p /data/elk_data 创建数据存放路径
chown elasticsearch:elasticsearch /data/elk_data/ 修改属主属组
systemctl start elasticsearch 开启服务
netstat -antp | grep 9200 查看端口
systemctl enable --now elasticsearch.service 立即开启服务
netstat -antp | grep 9200
2.5 查看node1节点信息![](https://i-blog.csdnimg.cn/blog_migrate/ad63d2288e8a22d15d053988d7443b8f.png)