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也支持外部的版本控制。