ElasticSearch笔记总结介绍

ElasticSearch简介
ElasticSearch是一个高性能,基于Lucene的全文检索服务,是一个分布式的Restful风格的搜索和数据分析引擎,也可以作为NoSQL数据库使用。
对Lucene进行了扩展
原型环境和生产环境可无缝切换
能够水平扩展
支持结构化和非结构化数据
(Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎(搜索引擎和检索程序库不完全等同)。
lucene,最先进、功能最强大的搜索库,直接基于lucene开发,非常复杂,api复杂(实现一些简单的功能,写大量的java代码),需要深入理解原理(各种索引结构)。elasticsearch,基于lucene,隐藏复杂性,提供简单易用的restful api接口、java api接口

ElasticSearch特点
高性能
能立即获得搜索结果。我们通过有限状态转换器实现了用于全文检索的倒排索引,
实现了用于存储数值数据和地理位置数据的 BKD 树,以及用于分析的列存储
可扩展性
能够水平扩展,每秒钟可处理海量事件,同时能够自动管理索引和
查询在集群中的分布方式,以实现极其流畅的操作。
相关度
搜索所有内容。找到所需的具体信息。基于各项元素(从词频或近因到热门度等)
对搜索结果进行排序。将这些内容与功能进行混合和匹配,以对向用户显示结果的方式进行微调。Elasticsearch 功能齐全,
可以处理包括各种复杂情况(例如拼写错误)在内的人为错误
可靠性
硬件故障。网络分割。Elasticsearch 为您检测这些故障并确保您的集群(和数据)的安全性和可用性。跨集群复制功能,辅助集群可作为热备份随时投入使用。Elasticsearch 
运行在一个分布式的环境中,从设计之初就考虑到了这一点,目的就是让您永远高枕无忧

ElasticSearch应用场景
用于日志搜索和分析、时空检索、时序检索、智能搜索等场景。
检索的数据类型复杂:如需要查询的数据有结构化数据、半结构化数据、非结构化数据等,ElasticSearch可以对以上数据类型进行清洗、分词、建立倒排索引等一系列操作,然后提供全文检索的能力。
检索条件多样化:全文检索条件可以包括词或短语。
边写边读:写入的数据可以实时的进行检索。

时空检索,针对时空数据:
时空数据是同时具有时间和空间维度的数据,现实世界中的数据超过80%与地理位置有关。
时空大数据包括时间、空间、专题属性三维信息,具有多源、海量、更新快速的综合特点。

时序检索,针对是时序数据:
时序数据是指时间序列数据。时间序列数据是同一统一指标按时间顺序记录的数据列。在同一数据列中的各个数据必须是同口径的,要求具有可比性。时序数据可以是时期数,也可以时点数。时间序列分析的目的是通过找出样本内时间序列的统计特性和发展规律性,构建时间序列模型,进行样本外预测。
传感器数据,温度等

ElasticSearch生态圈
用户接入层
Kibana
开源的分析和可视化平台,数据主要由es提供;基于es的搜索与分析能力,
拿到用于上层分析和可视化需要的结果;开发者或运维人员可以轻松地执行高级数据分析,
并在各种图表、表格和地图中可视化数据

数据持久化与分析层
ElasticSearch

数据接入层
Logstash Beats
Logstash:具备实时数据传输能力的管道,着重日志相关处理;负责将数据信息从管道的输入端传输到管道的输出端;支持灵活根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景
Beats:专门用于发送数据的平台,可以将数据无缝传输给logstash或是es;轻量级代理机制安装,类似于hadoop集群安装时候的ambari或cdh manager;可将数以百千计算机中的数据发送到logstash或是es中。

ElasticSearch整体结构
Cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
EsNode:ElasticSearch节点,一个节点就是一个ElasticSearch实例。    
EsMaster:主节点,可以临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。主节点不参与文档级别的变更或搜索,在流量增长时,该主节在流量增长时,该主节点不会成为集群的瓶颈。    
shards:代表索引分片,ElasticSearch可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。
replicas:代表索引副本,ElasticSearch可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高Elasticsearch的查询效率,Elasticsearch会自动对搜索请求进行负载均衡。    
高性能:虚拟内存设计;磁盘缓存相关参数;swap调优;replica数目;refresh时间间隔;merge相关参数;mapping设置;定期清理cache
多租户:支持多租户;ES实例数根据服务器内存设置,ES单节点实例数 = ES的可用的内存 / 64GB;服务器逻辑磁盘数要跟ES实例数一致,因此ES服务器需要按照实例数做Raid,例如推荐配置256G内存,24块磁盘,那么ES实例数 = 4,需要做4组Raid,每组6块磁盘


ElasticSearch核心概念
Index 索引,是ElasticSearch中的一个逻辑命名空间
Type 文档类型,用于存储不同类型的文档
Document 文档,是可以被索引的基本单位
Mapping 映射,用来约束字段的类型


ElasticSearch内部架构
接口:通过java ,restful api 提供丰富接口,底层基于lucence,通过本地文件,共享文件,hdfs完成索引存储
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
Lucence Directory:  是lucene的框架服务发现以及选主 ZenDiscovery: 用来实现节点自动发现,还有Master节点选取,假如Master出现故障,其它的这个节点会自动选举,产生一个新的MasterPlugins:插件可以通过自定的方式扩展加强Elasticsearch的基本功能,比如可以自定义类型映射,分词器,本地脚本,自动发现等Scripting:使用脚本语言可以计算自定义表达式的值,比如计算自定义查询相关度评分。支持的脚本语言有groovy,js,mvel(1.3.0废弃),python等Disovery:该模块主要负责集群中节点的自动发现和Master节点的选举。节点之间使用p2p的方式进行直接通信,不存在单点故障的问题。Elasticsearch中,Master节点维护集群的全局状态,比如节点加入和离开时进行shard的重新分配River:代表es的一个数据源,也是其它存储方式(如:数据库,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia等)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中。
gateway: 代表Elasticsearch索引快照的存储方式,Elasticsearch默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个Elasticsearch集群关闭再重新启动时就会从gateway中读取索引备份数据。Elasticsearch支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。    
transport: 代表Elasticsearch内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

ElasticSearch缓存机制
ElasticSearch缓存主要分三种:Query Cache、Fielddata Cache、Request Cache。
Query Cache:属于Node级别的缓存,是对一个查询中包含的过滤器执行结果进行缓存。
Fielddata Cache:Fielddata是专门针对分词的字段在查询期间的数据结构的缓存。
Request Cache:Shard级别的缓存,是为了缓存“分片级”的本地结果集。

ElasticSearch倒排索引
正排索引:是通过Key寻找Value,即从关键点出发,然后再通过关键点找到信息中满足搜索条件的特定信息。
倒排索引:ElasticSearch所采用得排序方式,是通过Value找Key。而在全文搜索中Value就是要搜索的关键词,通过Value找到对应的文档。

ElasticSearch索引流程
R表示replica shard 。P表示primary shard 。
阶段1:客户端发送一个索引请求给任意节点,假设是Node 1。
阶段2:Node 1通过请求判断出该文档应该被存储的分片,假设是shard 0 这个分片中,因此Node 1会把请求转发到shard 0的primary shard P0存在的Node 3节点上。
阶段3:Node 3在shard 0 的primary shard P0上执行请求。如果请求执行成功,Node 3并行地将该请求发给shard 0的所有存在于Node 1和Node 2中的replica shard R0上。如果所有的replica shard都成功地执行了请求,那么将会向Node 3回复一个成功确认,当Node 3收到了所有replica shard的确认信息后,则向用户返回一个Success消息。

ElasticSearch批量索引流程
阶段1:客户端向Node 1发送大量(bulkv)请求。
阶段2:Node 1为每个分片构建批量请求,然后转发到这些请求所需的主分片上。
阶段3:主分片一个接一个的按序执行操作。当一个操作执行完,主分片转发新文档(或者删除部分)给对应的复制节点,然后
执行下一个操作。复制节点为报告所有操作完成,节点报告给请求节点,请求节点整理响应并返回给客户端

ElasticSearch搜索流程
查询阶段:
阶段1:客户端发送一个检索请求给任意节点,假设是Node 3。
阶段2:Node 3将检索请求发送给该index中的每一个shard,此时会采取轮询策略,在primary shard及其所有replica中随机选择一个,让读请求负载均衡。每个shard在本地执行检索,并将结果排序添加到本地。
阶段3:每个shard返回本地所记录的结果,发送给Node 3。Node 3将这些值合并,做全局排序。
获取阶段:
阶段1:Node 3获取了所有待检索数据的定位之后,发送请求给与数据相关的shard。
阶段2:每个收到Node 3请求的shard,将读取相关文档中的内容,并将它们返回给Node 3。
阶段3:当Node 3获取到了所有shard返回的文档后,Node 3将它们合并成一条汇总结果,返回给客户端。

ElasticSearch批量搜索流程
客户端发送批量搜索请求至任意节点,该节点为每个分片分别构建一个多条数据检索请求,然后转发至主分片或副本分片。当所有请求执行完成后,请求节点汇总记录并返回给客户端。
阶段1:客户端向Node 1 发送mget 请求。
阶段2:Node 1 为每个分片构建一个多条数据检索请求,然后转发到这些请求所需的主分片或副本分片上。当所有回复被接收,Node 1 构建响应并返回给客户端。
ElasticSearch其他特性:
单节点多实例部署、副本自动跨节点分配策略、路由算法、平衡算法

ElasticSearch性能优化 - 分片副本策略
索引一旦创建好后,就无法调整分片的数量,而ElasticSearch一个分片实际上对应一个存储数据Lucene索引,Lucene索引的读写会占用很多的系统资源,因此,分片副本数需要合理的配置:
分片数不超过节点数的3倍,用较少的分片获得更佳的性能。
副本数建议设置为1,过多的副本需要更多存储空间。
分片最大容量不要超过ElasticSearch推荐的最大JVM堆空间32G

ElasticSearch性能优化 - 快速平衡
集群扩容后新旧节点之间数据不均衡,可通过修改参数加快数据平衡过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值