ES基础学习

1.分片控制

用户可以访问任何一个节点来获取数据,这个节点我们称为协调节点。一般情况下我们采用轮询的方法来进行操作。

2.数据写流程

1.客户端请求集群节点(任意)-协调节点

2.协调节点将请求转换到指定节点

3主分片需要将数据保存

4.主分片需要将数据发送给各个副本

5.副本保存后进行反馈

6.主分片进行反馈

7.客户端进行反馈

可以通过参数调整,控制以上流程。

参数 含义

timeout 等待时间

consistency 一致性,默认设置下,即使仅仅是在执行一个写操作之前,主分片都要求必须要有规定数量的分片副本处于活跃可用的状态,才回去执行写操作。这是为了避免在发生网络分区故障的时候进行写操作,进而导致数据的不一致。(超过半数)

参数可设置为One 只要主分片状态ok就允许执行写操作,all必须左右的主分片和所有的副分片的状态都没有问题,才允许执行写操作。或者是quorum即为默认模式,超过一半即可。

3.数据读流程

1.客户端发送查询请求到协调节点

2.协调节点计算数据所在的分片以及全部的复本位制。

3.为了能够负载均衡,可以轮询所有节点

4.将请求转发给具体的节点

5.节点返回查询结果,将结果返回给客户端

4.数据更新流程

1.客户端向Node1发送一个更新请求

2.它将请求转发到主分片所在的Node3

3.不断(可能要和其他更新操作抢占锁的资源)更新Node3上的数据

4.同步副本

5.分片原理

分片是ES最小的工作单元。

传统的数据库每个字段存储单个值,但这对于全文检索并不够。文本字段中的每个单词需要被搜索,对数据库意味着需要单个字段有索引多值的能力。最好的支持是一个字段多个值需求的数据结构就是倒排索引。

5.1倒排索引

ES使用一种称之为倒排索引的结构,它适用于快速的全文搜索。

分词器:Keyword 关键词,完全匹配才会被查询

text文本,可以进行分词查询

ik_max_word 细粒度的划分

ik_smart 粗粒度的划分

词条:索引中最小的存储和查询单元

词典:字典,词条的集合,B+Tree,HashMap

倒排表: 表中通过词条对应,关键位置。

倒排项:倒排表中的一行数据,称之为倒排项。

5.2文档搜索

早期的全文检索回味整个文档建立一个很大的倒排索引,并将其写入到磁盘。一旦新的索引就绪,旧的就会被其替换,这样最近的变化便可以被检索到。

倒排索引被写出磁盘时候是不可改变的:他永远不会修改。

不变性有重要的价值:

1.不需要锁。如果你从来不更新索引,你就不需要担心多进程同时修改数据的问题。

2.一旦索引被读入内核的文件系统缓存,便会留在哪里,由于其不变性。只要文件系统缓存中还有足够的空间,那么大部分读请求会直接请求内存,而不会命中磁盘。这提供了很大的性能提升。

3.其他缓存,在索引的生命周期内始终有效。它们不需要在每次数据修改时被重建,因为数据不会变化。

4.写入单个大的倒排索引允许数据被压缩,减少磁盘I/O和需要被缓存到内存的索引的使用量。

5.3动态索引更新

如何在保留不变性的前提下实现倒排索引的更新?

使用更多的索引。通过增加新的补充索引来反映新的最近的修改,而不是直接重写整个倒排索引。每一个倒排索引都会被轮流查询到,从最早的开始查询完后,再对结果进行合并。

ES基于Lucene,这个java库引入了按段搜索的概念。每一段本身都是一个倒排索引,但索引的Lucence中除了表示所有段的集合外,还增加了提交点的概念,一一列出了所有已知的字段文件。

5.4近实时搜索

随着按段搜索的发展,一个新的文档从索引到可被搜索的延迟显著降低了。新文档在几分钟之内即可被检索,但这样还是不够快。磁盘在这里成为了瓶颈。提交了一个新的字段到磁盘需要一个fsync来确保段被物理性的写入磁盘,这样在断电的时候也不会丢失数据。但是fsync操作代价很大;如果每次索引一个文档都去实行一次的话会造成很大的性能问题。

我们需要一个更加轻量的方式来使一个文档可被搜索,这意味着fsnc要从整个过程中被移除。在ES和磁盘之间是文件系统缓存。像之前描述的一样,在内存索引缓冲区中的文档会被写入到一个新的字段中。但是这里的新段会被先写入到文件系统缓存——这一步带教会比较低,稍后再被刷新到磁盘-这一步代价比较高。不过只要文件已经存在缓存中,就可以想其他文件一样被打开和读取了。

6.文档分析

分析包含下面的过程:

1.将一块文本分成适合于倒排索引的独立的词条

2.将这些词条统一化为标准格式以提高它们的“可搜索性”,或者recall

分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里:

字符过滤器:

首先字符串按顺序通过每个字符过滤器。它们的任务是在分此前整理一个字符串。一个字符过滤器可以用来去掉HTML或者将&转化为and。

分词器:

其次,字符串被分词器分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分为词条。

Token过滤器:
最后,词条按顺序通过每个token过了不起。这个过程会改变词条,删除词条,或者增加词条。

7.文档处理

7.1文档冲突

乐观并发控制

ES中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。然而,如果源数据在读写当中被修改,更新将会失败。应用程序,接下来将觉得该如何解决冲突。例如,可以重试共享,使用新的数据,或者将相关情况报告给用户。

ES也支持外部的版本控制。