什么是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将数据进行二次聚合、封装后,返回给用户。