目录
一、为什么要使用ELK
二、ELK简介
三、Elaticsearch入门
3.1、什么是elaticsearch
3.2、elaticsearch的底层优点
3.2.1、全文检索
3.2.2、倒排索引
3.3、elaticsearch集群原理
一、为什么要使用ELK
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
-
收集-能够采集多种来源的日志数据
-
传输-能够稳定的把日志数据传输到中央系统
-
存储-如何存储日志数据
-
分析-可以支持 UI 分析
-
警告-能够提供错误报告,监控机制
ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。
二、ELK简介
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash 主要是用来搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat隶属于Beats。目前Beats包含四种工具:
-
-
Packetbeat(搜集网络流量数据)
-
Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
-
Filebeat(搜集文件数据)
-
Winlogbeat(搜集 Windows 事件日志数据)
-
三、Elaticsearch入门
3.1、什么是elaticsearch
用官网的话说就是:Elasticsearch是基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产规模工作负载的速度和相关性进行了优化。使用 Elasticsearch 可以近乎实时地搜索、索引、存储和分析各种形状和大小的数据。
Elasticsearch 是Elastic Stack的核心,为 Elastic Search、可观察性和安全性解决方案提供支持。
Elasticsearch 的使用范围越来越广泛。以下是一些示例:
-
监控日志和事件数据。存储日志、指标和事件数据,以实现可观察性和安全信息和事件管理 (SIEM)。
-
构建搜索应用程序。向应用程序或网站添加搜索功能,或在组织的内部数据源上构建企业搜索引擎。
-
向量数据库。存储和搜索向量化数据,并使用内置和第三方自然语言处理 (NLP) 模型创建向量嵌入。
-
检索增强生成 (RAG)。使用 Elasticsearch 作为检索引擎来增强生成式 AI 模型。
-
应用程序和安全监控。有效监控和分析应用程序性能和安全数据。
-
机器学习。使用机器学习自动实时模拟数据行为。
3.2、elaticsearch的底层优点
3.2.1、全文检索
如在对一个输入框输入东西进行搜索的时候,在使用关系型数据库存储时,那么就需要使用到模糊查询,其SQL语句如下。如果是直接使用SQL的模糊查询对数据进行检索,那么下面这条sql语句,在数据量大的时候,会非常的慢,并且最重要的是,根据B+树的底层数据结构,下面这条SQL不走索引,因此在海量数据检索时,一般不会考虑使用这个SQL
select * from product where name like '%衣服%'
针对上述的问题,就可以引入这个为什么使用elasticSearch了。其底层就是会通过一个程序扫描文本的每一个单词,针对单字或者单词建立索引,并保存该单词在文本中的位置、以及出现的次数。然后在用户查询时,就会通过之前建立好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体的文本位置,所以就可以将具体的内容读取出来了。这样速度就非常的高效,并且底层也使用到了索引,即倒排索引。
3.2.2、倒排索引
首先先说一下什么是正排索引,就是底层不会提前建立好索引,而是在查找时,会去判断数据中是否存在这个关键字,如果存在,那么就会记录这个关键字的位置以及出现的次数,这样又有点类似于这个使用SQL了。
由于正排索引效率并不高,并且查询出来的数据并不完整,因此es底层就参考这个正排索引,设计出了这个倒排索引,主要由id,关键字和这个索引下表index组成。如下有以下数据,都是英文组成,因此关键字就是以一个空格为一个关键字,因此可以对这个倒排索引进行如下的总结:
1,就是会将这些数据进行一个关键字的分词,然后将每一个词建立一个index的下标索引;
2,建立索引之后,就会进行一个去重的操作,根据关键字进行去重,然后再合并,并且将index存放在一起;
3,然后会根据关键字进行一个排序,由于这使用的是英文,所以直接根据首字母进行排序
正排和倒排总结
正排索引就是根据这个关键字去进行一个全文检索的定位,最后再获取到那一条数据的id,然后根据id获取到那一条数据。倒排就是先将关键词进行一个拆分,然后根据拆分的关键词进行一个数据的定位,定位之后再获取到数据的index索引值,这个值对应的就是数据的id,然后根据id去定位那一条数据。
最大的区别就是:正排是后获取id,然后根据id获取整条数据;倒排是先获取id,就是通过关键字单位获取到的index索引值,然后根据这个id获取到文档中的全部数据 ,简单理解就是正向索引是key找value,反向索引就是通过value找key,这个vaue就是对应的id,数据库中被称为id,es中被称为index。
3.3、elaticsearch集群原理
ES天生就是分布式架构的。ES的底层是Lucene,而Lucene只是一个搜索引擎库,没有并发设计 ,没有分布式相关的设计,因此要想使用Lucene来处理海量数据,并利用分布式的能力,就需要在其之上进行分布式的相关设计。ES就是这样一款建立在Lucene基础之上,赋予其分布式能力的存储引擎,说成天生就是分布式架构的一点也不过分。
集群是有多个节点组成的,在ES集群中有多个不同种类型的节点。节点是一个Elasticsearch的实例,本质上是一个Java进程。每个节点上面都保存着集群的状态信息,包括所有的节点信息、所有的索引和相关的Mapping于Setting信息和分片的路由信息等。节点按照角色可以划分为主节点、数据节点、协调节点和预处理节点等。
Master节点负责管理集群状态信息,包括处理创建、删除索引等请求,决定分片被分配到哪个节点,维护和更新集群状态。值得注意的是,只有Master节点才能修改集群的状态信息,并负责同步给其他节点。可见,Master节点非常重要,在部署上需要考虑单点风险。
协调节点负责接收客户端的请求,将请求路由到到合适的节点,并将结果汇集到一起。
数据节点是保存数据的节点,增加数据节点可以解决水平扩展和解决数据单点的问题。
预处理节点是数据前置处理转换的节点,支持 pipeline管道设置,可以对数据进行过滤、转换等操作。
更多关于节点内容参考:
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/modules-node.html
分片是ES分布式存储的基石,是底层的基本读写单元。分片的目的是分割巨大的索引,将数据分散到集群内各处。分片分为主分片和副本分片,一般情况,一个主分片有多个副本分片。主分片负责处理写入请求和存储数据,副本分片只负责存储数据,是主分片的拷贝,文档会存储在具体的某个主分片和副本分片上。
欢迎关注作者的公众号,公众号每天分享运维干货文章