elasticsearch为啥快
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch为啥快相关的知识,希望对你有一定的参考价值。
参考技术A 首先,es有term dictionary,可以用logN次磁盘查找到目标term,但磁盘的随机读操作仍然非常耗时,所以尽可能少的读磁盘就是nosql的初衷,而想要将数据放至缓存中,term dictionary又太大了,于是就有了term index,它是term diction的索引,即es中数据索引的索引,比如:A开头的term在第几页,B开头的term又在第几页,这棵树不会包含所有的term,它包含的是term的一些前缀。通过term index可以快速的定位到term dictionary的某个offset,然后再从这个位置往后顺序查找,再加上一些压缩技术(Lucene Finite State Transducers)trem index的尺寸可以只有所有term的几十分之一,使得用内存缓存所有term index变成可能,其结构如下:为什么es检索比mysql快,mysql只有term dictionary这一层(索引),是以b+tree排序的方式存储在磁盘上,检索一个term需要若干次的磁盘随机访问,而lucene在term dictionary的基础上又添加了term index来加速检索,其以树的形式缓存在内存里,从term index查到对应的term dictionary的block位置后,再去磁盘上找term,大大减少了磁盘的随机访问次数,再加上其以FST形式保存,非常节省空间,Term dictionary在磁盘上是以分block的方式保存的,一个block内部利用公共前缀压缩,比如都是Ab开头的单词就可以把Ab省去。这样term dictionary可以比b-tree更节约磁盘空间。
Elasticsearch为啥这么快
1.1 Node节点维度
参考博客:https://www.jianshu.com/p/b50d7fdbe544
1、多节点的集群方案
1. 路由一个文档到一个分片中:当索引一个文档的时候,文档会被存储到一个主分片中。
2. Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?实际上,这个过程是根据下面这个公式决定的:
shard = hash(routing) % number_of_primary_shards
3. routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。
4. 这就解释了为什么我们要在创建索引的时候就确定好主分片的数量,并且永远不会改变这个数量
5. 因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。
6. 确定了在哪个分片中,继而可以判定其在哪个节点上。
7. 那么主分片数确定的情况下,如果做集群扩容呢?
1)下图是一种主分片的扩容办法,开始设置为5个分片,在单个节点上,后来扩容到5个节点,每个节点有一个分片。
2)也就是说单个分片的容量变大了,但是数量并不增加。
以上是关于elasticsearch为啥快的主要内容,如果未能解决你的问题,请参考以下文章