Elasticsearch 简介

什么是Elasticsearch

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,能够达到实时、稳定、可靠、快速搜索。也可以看做是布式的实时文件存储,每个字段都能被索引并可被搜索。

目前大多数公司把elasticsearch作为elk日志系统中日志数据储存和实时搜索工具。这一部分用户,他们注重的是数据的实时写入,在大量日志数据产生时,不堆积。另一部分公司,把elasticsearch作为全文搜索工具,一次会在几千万上亿条数据中进行搜索、聚合,对数据写入效率要求不高,注重的是搜索效率。

Elasticsearch的基础概念

Lucene

Lucene是一个开放源代码的全文检索引擎工具包,其中封装了很多建立倒排索引的规则和搜索排序的算法。

倒排索引

在Elasticsearch中,字段的数据可被分词工具分为多个词,这些词存在索引表中都会标记对应的docID,在进行搜索的时elasticsearch 根据我们输入的词(word1)去匹配索引表中的词(word2),根据搜索结果返回相应docID的数据。

例如:我们在Elasticsearch存入以下数据

id

Field

1

分词工具

2

搜索工具

3

搜索运算工具

分词在索引表中会存入以下数据

Term

id

工具

1、2 、3

分词

1

搜索

1、2

运算

3

当我们查询‘搜索’时,Elasticsearch 就会用‘搜索’去匹配索引表中的term,从索引表得知,1、 2两条数据包含‘搜索’,就会返回1 、2两条数据。

Elasticsearch Template

Elasticsearch Template 用于规定index中字段的存储格式、index的设置参数等,template 分为两部分,一是setting,主要用于规定index的参数,例如number_of_shards(分片数)、number_of_replicas(副本数)。还有就是设置一些优化index的参数。另一部分是mapping,elasticsearch的mapping类似于数据库的表结构,用于设置字段格式,假如elasticsearch不提前设置mapping,系统会以该字段接收到的第一个数据的类型作为默认字段类型。新建elasticsearch template可以直接在kibana dev tools上执行命令

例如:

 

新建index以test*为名的,都会使用此template,其中设置新建index为3个分片1个副本。Location字段数据为geo_point类型,url为text类型,并url使用ik分词。

副本与分片

shards(分片)可以看做是elasticsearch在物理机上的最大存储单位。每个索引有一个或多个分片,索引的数据被分配到各个分片上,相当于一桶水用了N个杯子装,而index默认shards为5。

关于如何规划shards的问题,主要从index数据量和集群节点数这两方面来考虑。一个shards最大的数据存储量建议在20G-50G,在实际规划中就可以根据此来划分shards数量。当index的数据量过小,设置多个shards显然没有任何意义,反而在查询的时候会影响效率。

replicas(副本)可以理解为备份分片,备分片不会同主分片出现在同一个节点上,当主分片故障,副本分片会自动转化为主分片继续工作。当有副本分片无法分配的时候(unassigned),集群健康值会变成yellow,当主分片无法分配时(unassigned)集群健康值变为red,此时集群不可用。

关于如何规划replicas的问题,如果单节点elasticsearch,不用多说,0副本,不然集群会一直显示为yellow。如果是多机集群,建议设置1副本,当主分片down掉的时候,副本分片会自动切换为主分片。至于为什么不是2副本、3副本。因为副本数+1 ,相应的磁盘中的数据量也会+1,副本数过多,浪费磁盘空间。

 

如上图所示,source_vid_log_201801,为3分片1副本,三个主分片(带黑框)分布于三台data node中。副本分片也分布于不同的data node中

Elasticsearch 节点角色

Elasticsearch 节点角色分为三种, node.master、 node.data、node.ingest ,每个elasticsearch节点可以担任多重角色,但是在生产环节中,建议角色分离。

node.master:控制Elasticsearch集群,负责集群中的操作,比如创建/删除一个索引,跟踪集群中的节点,分配分片到节点。主节点处理集群的状态并广播到其他节点,并接收其他节点的确认响应。建议master节点不参与数据的接收、处理和存储,避免节点oom造成集群瘫痪。node.master 默认开启,在配置文件中设置 node.master:false 关闭

node.data:存储数据和倒排索引,进行搜索操作时,data node接收到路由节点的请求,在本节点查询数据并做运算、排序,返回给路由节点。elasticsearch节点的元数据是存储在各种data node上的。data node 默认开启,在配置文件中设置 data node:false 关闭

node.ingest:数据转换功能节点,通过定义管道,实现在索引之前对文档进行预处理。一般来说这个节点角色很少用到。node.ingest 默认开启,在配置文件中设置 node.ingest:false 关闭

Elasticsearch 还有一种角色 node.client,client是作为数据接收、任务分发、返回结果,是整个集群和外部通讯的中转站。每个节点都可以作为client使用,但是为了避免在聚合时造成节点宕机影响集群的使用,建议client节点关闭上面三个角色。

集群

集群(cluster):集群中有多个节点(node),其中有一个为主节点,这个主节点是可以通过选举产生的。

节点(node):就是运行的Elasticsearch实例,一台服务器可以部署多个节点。

索引(index):ElasticSearch将它的数据存储在一个或多个索引(index)中。用SQL领域的术语来类比,索引就像数据库。

文档(document):是ElasticSearch中的主要实体,对所有使用ElasticSearch的案例来说,他们最终都可以归结为对文档的搜索。每一条数据,就是一个document。

Elasticsearch的工作流

数据写入

Client 接收数据,向master发出请求,master根据相应的template,建立index,这里就涉及到index的mapping、副本数、分片数以及分片分别在哪些节点。Client就将数据路由到对应的节点上,写入分片。这里是先写入主分片,主分片写入完成后再写入副本分片。写入操作结束后,datanode会向client返回结果,client汇总后再返回给用户。如果index 是已存在的,省略建index操作,其他同上

数据查询

Client接收到查询请求,向master询问查询的index分片分布情况,得到请求后,就把查询请求路由给各个data node,datanode在各自节点上进行查询、相关度评分、排序后,将数据返回给client,client将数据进行二次聚合、封装后,返回给用户。

未经允许严禁转载,欢迎加入elk交流群探讨问题,群号:433418690

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值