ElasticSearch基础概念及工作流程

注: 部分概念介绍来源于网络

一、Elasticsearch的基本概念
Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。Elasticsearch还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,ES能够横向扩展至数以百计的服务器存储以及处理PB级的数据。可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。

1、NRT
Near Realtime,近实时,有两个层面的含义,一是从写入一条数据到这条数据可以被搜索,有一段非常小的延迟(大约1秒左右),二是基于Elasticsearch的搜索和分析操作,耗时可以达到秒级。
2、集群(cluster)
对外提供索引和搜索的服务,由一个或多个节点组成, 并通过集群名称与其他集群进行区分,在多节点的集群上,同样的数据可以在多台服务器上传播。这有助于性能。这同样有助于稳定性,如果每个分片至少有一个副本分片,那么任何一个节点宕机后,Elasticsearch依然可以进行服务,返回所有数据。
但是它也有缺点:必须确定节点之间能够足够快速地通信,并且不会产生脑裂(集群的2个部分不能彼此交流,都认为对方宕机了)。
3、节点(node)
单独一个Elasticsearch服务器实例称为一个node,node是集群的一部分,每个node有独立的名称,默认是启动时获取一个UUID作为名称,也可以自行配置,node名称特别重要,Elasticsearch集群是通过node名称进行管理和通信的,一个node只能加入一个Elasticsearch集群当中,集群提供完整的数据存储,索引和搜索的功能,它下面的每个node分摊上述功能(每条数据都会索引到node上)。
4、分片(shard)
集群允许系统存储的数据总量超过单机容量。为了满足这个需求,Elasticsearch将数据散布到多个物理的Lucene索引上去。这些Lucene索引被称为分片,而散布这些分片的过程叫作分片处理(sharding)。Elasticsearch会自动完成分片处理,并在必要的时候对分片数据进行再平衡分配,并且让用户看来这些分片更像是一个大的索引。除了Elasticsearch本身自动进行分片处理外,用户为具体的应用进行参数调优也是至关重要的,因为分片的数量在创建索引的时就被配置好了,之后无法改变,除非创建一个新索引并重新索引全部数据。(同分片的主从分片不能在同节点上,防止节点故障数据丢失),一个分片是一个 Lucene 的实例
5、副本(replica)
副本则解决了访问压力过大时单机无法处理所有请求的问题。
分片可以是主分片,也可以是副本分片,其中副本分片是主分片的完整副本。
shard故障或宕机时,其中一个replica可以升级成shard。
replica保证数据不丢失(冗余机制),保证高可用。
replica可以分担搜索请求,提升整个集群的吞吐量和性能。
shard的全称叫primary shard,replica全称叫replica shard,primary shard数量在创建索引时指定,后期不能修改,replica shard后期可以修改。默认每个索引的primary shard值为5,replica shard值为1,含义是5个primary shard,5个replica shard,共10个shard。
因此Elasticsearch最小的高可用配置是2台服务器。
6、索引(index)
索引是映射类型的容器。一个Elasticsearch索引是独立的大量的文档集合。 每个索引存储在磁盘上的同组文件中,索引存储了所有映射类型的字段,还有一些设置。
7、类型 (type)
类型,原本是在索引(Index)内进行的逻辑细分,但后来发现企业研发为了增强可阅读性和可维护性,制订的规范约束,同一个索引下很少还会再使用type进行逻辑拆分(如同一个索引下既有订单数据,又有评论数据),因而在6.0.0版本之后,此定义废弃。
8、文档(document)
Elasticsearch是面向文档的,这意味着索引和搜索数据的最小单位是文档。
在Elasticsearch中文档有几个重要的属性。
它是自我包含的。一篇文档同时包含字段和它们的取值。
它可以是层次的。文档中还包含新的文档,字段还可以包含其他字段和取值。例如,“location”字段可以同时包含“city”和“street“两个字段。
它拥有灵活的结构。文档不依赖于预先定义的模式。并非所有的文档都需要拥有相同的字段,它们不受限于同一个模式。
9、映射(mapping)
所有文档在写入索引前都将被分析,用户可以设置一些参数,决定如何将输入文本分割为词条,哪些词条应该被过滤掉,或哪些附加处理有必要被调用(比如移除HTML标签)。这就是映射扮演的角色:存储分析链所需的所有信息。

二、Elasticsearch的工作流程
(一)启动过程
当Elasticsearch节点启动时,它使用发现(discovery)模块来发现同一个集群中的其他节点(这里的关键是配置文件中的集群名称)并与它们连接。默认情况下,Elasticsearch节点会向网络中发送广播请求,以找到拥有相同集群名称的其他节点。集群中有一个节点被选为主(master)节点。该节点负责集群的状态管理以及在集群拓扑变化时做出反应,分发索引分片至集群的响应节点上去。管理节点读取集群的状态信息,如有必要,它会进行恢复处理。在该阶段,管理节点会检查有哪些索引分片,并决定哪些分片将做主分片。此后,整个集群进入黄色状态。这意味着集群可以执行查询,但是系统的吞吐量以及各种可能的状况是未知的(可以简单理解为所有的主分片已经被分配了,但是副本没有被分配)。下面的事情就是寻找到冗余的分片用作副本分片。如果某个主分片的副本数过少,管理节点将决定基于某个主分片创建分片和副本。如果一切顺利,集群将进入绿色状态(这意味着所有主分片及副本分片均已分配好)。
(二)故障检测
集群正常工作时,管理节点会监控所有可用节点,检查它们是否正在工作。如果任何节点在预定义的超时时间内不响应,则认为该节点已经断开,然后错误处理过程开始启动。这意味着可能要在集群 — 分片之间重新做平衡,选择新的主节点,对每个丢失的主分片,将从它的副本分片中选出来作为新的主分片。
管理节点会发送ping请求至其他节点,然后等待响应。如果没有响应,则该节点会被从集群中移出去。相反地,所有节点也会向主节点发送ping请求来检查主节点是否在正常工作。节点之间的相互探测

三、Elasticsearch的节点类型主要包含以下几类:
Master-eligible Node
每个节点启动后,默认是一个 Master-eligible 节点,Master-eligible的节点可参加选主流程,成为Master节点,通过配置项 node.master:falase 可以禁用节点的Master-eligible职责,禁止后当前节点就不会参加选主流程
Master Node     创建/删除/分配切片
ES集群中虽然每个节点都保存了集群状态,但是只有Master节点才有修改集群状态的权限,集群状态包括:集群中节点信息、所有索引和其相关的Mapping和Setting信息、分片的路由信息。在集群启动时,第一个启动的Master-eligible节点会将自己选举为主节点。
Data Node  数据查询/数据写入
保存数据的节点,负责保存分片数据,对数据扩展有重要作用
Coordinating Node
负责接受Client请求,将请求分发到合适的节点获取响应后,将结果最终汇集在一起,每个节点默认都有Coordinating节点的职责
Machine Learning Node
负责运行机器学习的Job,用来做异常检测
Ingest Node
数据预处理的节点,支持Pipeline管道设置,可以使用Ingest对数据进行过滤、转换等操作

每个ES节点可以承担多个职责,具体配置如下:
Master-eligible节点配置:node.master,默认值是true
Data节点配置:node.data,默认值是true
Ingest节点配置:node.ingest 默认值是true
Machine Learning节点配置:node.ml 在enable X-pack的前提下默认是true
Coordinating节点配置:无需配置每个节点都是Coordinating节点

四、Elasticsearch写入数据流程
ES在写入(index)数据的时候,是先写入到缓存中。这时候数据还不能被搜索到。默认情况下ES每隔1秒会执行refresh操作,从内存buffer中将数据写入os cache(操作系统的内存),产生一个segment file文件。同时建立倒排索引,这个时候文档是可以被搜索到的。
每次refresh都会生成一个新的segment,那么segment的数量很快就会爆炸。另外就是每次搜索请求都必须访问segment,理论上segment越多,搜索请求就会变的越慢。
ES有一个后台进程专门负责segment的合并,它会把小segments合并成更大的segments。这个merge操作大部分时候我们并不需要关心,ES自动处理什么时候merge。只要不影响查询性能,我们也不需要关系分片上有多少个segment。(合并可能非常耗费资源,特别是在磁盘I / O方面)
不过对于一些业务场景,索引是按照天,周,或者月建立的,如果一些老的索引已经停止写入或者更新,我们可以通过执行一次force merge来强制该索引合并到一个大的segment上,提高搜索的效率。

注1:由于每个分片的开销取决于分段的数量和大小,因此通过 forcemerge 操作强制将较小的分段合并为较大的分段,这样可以减少开销并提高查询性能。 理想情况下,一旦不再向索引写入数据,就应该这样做。 请注意,这是一项比较耗费性能和开销的操作,因此应该在非高峰时段执行。
注3:我们可以在节点上保留的分片数量与可用的堆内存成正比,但 Elasticsearch 没有强制的固定限制。 一个好的经验法则是确保每个节点的分片数量低于每GB堆内存配置20到25个分片。 因此,具有30GB堆内存的节点应该具有最多600-750个分片,但是低于该限制可以使其保持更好。这通常有助于集群保持健康。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值