稻田代码

ES分片原理

Es分片原理

分片的原因

倒排索引是不可更改的,一旦它被建立了,里面的数据就不会再进行更改。这样做就带来了以下几个好处:

  1. 没有必要给逆向索引加锁,因为不允许被更改,只有读操作,所以就不用考虑多线程导致互斥等问题。
  2. 索引一旦被加载到了缓存中,大部分访问操作都是对内存的读操作,省去了访问磁盘带来的io开销。
  3. 因为逆向索引的不可变性,所有基于该索引而产生的缓存也不需要更改,因为没有数据变更。
  4. 使用逆向索引可以压缩数据,减少磁盘io及对内存的消耗

而倒排不可更改,新增文档时怎么能搜到新文档,删除时怎么搜不到已删除文档,更新文档时怎么才能根据最新文档内容来搜索呢?

新增文档

1.当有新文档时,会把新文档收集到内存缓存
2.当缓存文档数到达一定数量时或到达一定时间时,就会对缓存进行提交(commit)
3.此时生成一个新的倒排索引段(segment)并写入磁盘(es整个倒排索引由很多个段组成,每个段都是一个小的倒排索引)
4.一个包含新段写入提交点被写入磁盘(commit-point,一个列出所有已知段的文件,存在磁盘中)
5.清空已生成段的缓存文档
6.es进行搜索时,会扫描所有的提交点文件里的段最后把每个段里的文档进行合并。

删除文档

每个提交点会包含一个 .del 文件,文件中会列出这些被删除文档的段信息。
当一个文档被 “删除” 时,它实际上只是在 .del 文件中被 标记 删除。一个被标记删除的文档仍然可以被查询匹配到, 但它会在最终结果被返回前从结果集中移除。

更新文档

文档更新也是类似的操作方式:当一个文档被更新时,旧版本文档被标记删除,文档的新版本被索引到一个新的段中。 可能两个版本的文档都会被一个查询匹配到,但被删除的那个旧版本文档在结果集返回前就已经被移除。





本原创文章未经允许不得转载 | 当前页面:稻田代码 » ES分片原理