前言
为什么学习ElasticSearch?
1、ElasticSearch具备非常强的大数据分析能力。虽然Hadoop也可以做大数据分析,但是ElasticSearch的分析能力非常高,具备Hadoop不具备的能力。比如有时候用Hadoop分析一个结果,可能等待的时间比较长。
2、ElasticSearch可以很方便的进行使用,可以将其安装在个人的笔记本电脑,也可以在生产环境中,将其进行水平扩展。
3、在当今大数据时代,掌握近实时的搜索和分析能力,才能掌握核心竞争力,洞见未来。
ElasticSearch是最受欢迎的企业级搜索引擎。
介绍
ElasticSearch是一款非常强大的、基于Lucene的开源搜索及分析引擎;它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。
它被用作全文检索、结构化搜索、分析以及这三个功能的组合:
- Wikipedia 使用 Elasticsearch 提供带有高亮片段的全文搜索,还有 search-as-you-type 和 did-you-mean 的建议。
- 卫报 使用 Elasticsearch 将网络社交数据结合到访客日志中,为它的编辑们提供公众对于新文章的实时反馈。
- Stack Overflow 将地理位置查询融入全文检索中去,并且使用 more-like-this 接口去查找相关的问题和回答。
- GitHub 使用 Elasticsearch 对1300亿行代码进行查询。
除了搜索,结合Kibana、Logstash、Beats开源产品,Elastic Stack(简称ELK)还被广泛运用在大数据近实时分析领域,包括:日志分析、指标监控、信息安全等。它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,通过使用机器学习,自动识别异常状况。
**ElasticSearch是基于Restful WebApi,使用Java语言开发的搜索引擎库类,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。**其客户端在Java、C#、PHP、Python等许多语言中都是可用的。
为什么不是直接使用Lucene
由于ElasticSearch是基于Lucene的开发的,但是为什么不直接使用Lucene?
Lucene 可以说是当时当下最先进、高性能、全功能的搜索引擎库。但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 但其内部非常复杂需要获得信息检索学位才能了解其工作原理。
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
- 一个分布式的实时文档存储,每个字段 可以被索引与搜索
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
ElasticSearch的主要功能及应用场景
- 主要功能:
1)海量数据的分布式存储以及集群管理,达到了服务与数据的高可用以及水平扩展;
2)近实时搜索,性能卓越。对结构化、全文、地理位置等类型数据的处理;
3)海量数据的近实时分析(聚合功能)
- 应用场景:
1)网站搜索、垂直搜索、代码搜索;
2)日志管理与分析、安全指标监控、应用性能监控、Web抓取舆情分析;
ElasticSearch的基础概念
Near Realtime(NRT) 近实时。数据提交索引后,立马就可以搜索到。
Cluster 集群,一个集群由一个唯一的名字标识,默认为“elasticsearch”。集群名称非常重要,具有相同集群名的节点才会组成一个集群。集群名称可以在配置文件中指定。
Node 节点:存储集群的数据,参与集群的索引和搜索功能。像集群有名字,节点也有自己的名称,默认在启动时会以一个随机的UUID的前七个字符作为节点的名字,你可以为其指定任意的名字。通过集群名在网络中发现同伴组成集群。一个节点也可是集群。
Index 索引: 一个索引是一个文档的集合(等同于solr中的集合)。每个索引有唯一的名字,通过这个名字来操作它。一个集群中可以有任意多个索引。
Type 类型:指在一个索引中,可以索引不同类型的文档,如用户数据、博客数据。从6.0.0 版本起已废弃,一个索引中只存放一类数据。
Document 文档:被索引的一条数据,索引的基本信息单元,以JSON格式来表示。
Shard 分片:在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。
Replication 备份: 一个分片可以有多个备份(副本)
普通数据库对比
Elastic Stack生态(日志收集)
一个典型的日志系统包括:
(1)收集:能够采集多种来源的日志数据
(2)传输:能够稳定的把日志数据解析过滤并传输到存储系统
(3)存储:存储日志数据
(4)分析:支持 UI 分析
(5)警告:能够提供错误报告,监控机制
ELK演变:
1) beats+elasticsearch+kibana
Beats采集数据后,存储在ES中,有Kibana可视化的展示。
2) Beats + Logstash + ElasticSearch + Kibana
Beats采集数据后,通过Logstash传输转换,存储在ES中,有Kibana可视化的展示。
引入logstash带来的好处如下:
(1)Logstash具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻背压。
(2)从其他数据源(例如数据库,S3或消息传递队列)中提取。
(3)将数据发送到多个目的地,例如S3,HDFS或写入文件。
(4)使用条件数据流逻辑组成更复杂的处理管道。
beats结合logstash带来的优势:
**(1)水平可扩展性,高可用性和可变负载处理。**beats和logstash可以实现节点之间的负载均衡,多个logstash可以实现logstash的高可用
**(2)消息持久性与至少一次交付保证。**使用beats或Winlogbeat进行日志收集时,可以保证至少一次交付。从Filebeat或Winlogbeat到Logstash以及从Logstash到Elasticsearch的两种通信协议都是同步的,并且支持确认。Logstash持久队列提供跨节点故障的保护。对于Logstash中的磁盘级弹性,确保磁盘冗余非常重要。
**(3)具有身份验证和有线加密的端到端安全传输。**从Beats到Logstash以及从 Logstash到Elasticsearch的传输都可以使用加密方式传递 。与Elasticsearch进行通讯时,有很多安全选项,包括基本身份验证,TLS,PKI,LDAP,AD和其他自定义领域
增加更多的数据源 比如:TCP,UDP和HTTP协议是将数据输入Logstash的常用方法
3)beats+MQ+logstash+elasticsearch+kibana
Beats采集数据后,加入的消息队列中可以进行流量肖峰,再通过Logstash传输转换,存储在ES中,有Kibana可视化的展示。
当然也可以在beats和logstash中间添加一些组件redis、kafka、RabbitMQ等,添加中间件将会有如下好处:
(1)**降低对日志所在机器的影响,**这些机器上一般都部署着反向代理或应用服务,本身负载就很重了,所以尽可能的在这些机器上少做事;
(2)**降低日志写入压力。**如果有很多台机器需要做日志收集,那么让每台机器都向Elasticsearch持续写入数据,必然会对Elasticsearch造成压力,因此需要对数据进行缓冲,同时,这样的缓冲也可以一定程度的保护数据不丢失;
(3)将日志数据的格式化处理,独立出来,避免需要到多台机器上去修改配置;
Beats
Beats是一个面向轻量型采集器的平台,这些采集器可以从边缘机器向Logstash、ElasticSearch发送数据,它是由Go语言进行开发的,运行效率方面比较快。且不同Beats的套件是针对不同的数据源。
Logstash
**Logstash是动态数据收集管道,拥有可扩展的插件生态系统,支持从不同来源采集数据,转换数据,并将数据发送到不同的存储库中。**其能够与ElasticSearch产生强大的协同作用,后被Elastic公司在2013年收购。
它具有如下特性:
1)实时解析和转换数据;
2)可扩展,具有200多个插件;
3)可靠性、安全性。Logstash会通过持久化队列来保证至少将运行中的事件送达一次,同时将数据进行传输加密;
4)监控;
ElasticSearch
**ElasticSearch对数据进行搜索、分析和存储,其是基于JSON的分布式搜索和分析引擎,**专门为实现水平可扩展性、高可靠性和管理便捷性而设计的。
它的实现原理主要分为以下几个步骤:
1)首先用户将数据提交到ElasticSearch数据库中;
2)再通过分词控制器将对应的语句分词;
3)将分词结果及其权重一并存入,以备用户在搜索数据时,根据权重将结果排名和打分,将返回结果呈现给用户;
Kibana
**Kibana实现数据可视化,其作用就是在ElasticSearch中进行民航。Kibana能够以图表的形式呈现数据,并且具有可扩展的用户界面,可以全方位的配置和管理ElasticSearch。**Kibana最早的时候是基于Logstash创建的工具,后被Elastic公司在2013年收购。
1)Kibana可以提供各种可视化的图表;
2)可以通过机器学习的技术,对异常情况进行检测,用于提前发现可疑问题;
安装注意事项
1、平台确认好。确认好安装的平台,以备后续的安装。
2、安装Java。安装之前,需要安装最新版的JDK版本。
3、安装成功之后,需要新增一个非Root用户,并授予相关文件操作权限以及配置相关的信息等。(ElasticSearch5及以上版本,基于安全考虑,强制规定不能以root身份运行)。
3-1)修改data和log路径。
vi /opt/elasticsearch-7.12.0/config/elasticsearch.yml
3-2)修改Linux系统的限制配置。
**1)修改系统中允许应用最多创建多少文件等的限制权限。**Linux默认来说,一般限制应用最多创建的文件是65535个。但是ES至少需要65536的文件创建权限。
**2)修改系统中允许用户启动的进程开启多少个线程。**默认的Linux限制root用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启1024个线程。必须修改限制数为4096+。因为ES至少需要4096的线程池预备。ES在5.x版本之后,强制要求在linux中不能使用root用户启动ES进程。所以必须使用其他用户启动ES进程才可以。
**3)Linux低版本内核为线程分配的内存是128K。**4.x版本的内核分配的内存更大。如果虚拟机的内存是1G,最多只能开启3000+个线程数。所以至少为虚拟机分配1.5G以上的内存。
3-3)配置密码访问。
使用基本许可证时,默认情况下禁用Elasticsearch安全功能。由于我测试环境是放在公网上的,所以需要设置下密码访问。
总结
ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎。同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能够横向扩展至数以百计的服务器存储以及处理PB级的数据。
另外可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。所以也常用于做日志追踪分析。
ES就是为高可用和可扩展而生的。一方面可以通过升级硬件来完成系统扩展,称为垂直或向上扩展(Vertical Scale/Scaling Up)。另一方面,增加更多的服务器来完成系统扩展,称为水平扩展或者向外扩展(Horizontal Scale/Scaling Out)。
尽管ES能够利用更强劲的硬件,但是垂直扩展毕竟还是有它的极限。**真正的可扩展性来自于水平扩展,通过向集群中添加更多的节点来分担负载,增加可靠性。ES天生就是分布式的,它知道如何管理多个节点来完成扩展和实现高可用性。**意味应用不需要做任何的改动。