elasticsearch(lucene)索引数据过程

倒排索引存储-分段存储(lucene的功能)
在lucene中:lucene index包含了若干个segment
在elasticsearch中:index包含了若干主从shard,shard包干了若干segment
segment是elasticsearch中存储的最小文件单元,也就是分段存储,segment被设计为不可变的
新增:新建立索引时,新建一个segment存储新的数据
删除:因为segment是只读的,因此在索引文件中新增了.del文件,专门存储被删除的数据id,当查询时被删除的数据仍能被查询,进行查询结果合并时才会过滤掉,merge segment时会真正删除
更新:新增和删除的组合
segment的不可变性的优势服务器

  • 不须要锁(没有直接修改已经存在段的状况)
  • 能够利用内存,因为segment不可变,因此segment被加载到内存后无需改变,只要内存足够,segment就能够长期驻村,大大提高查询性能
  • 更新、新增的增量的方式很轻,性能好

segment的不可变性的缺点异步

  • 删除操做不会立刻删除有必定的空间浪费
  • 频繁更新涉及到大量的删除动做,会有大量的空间浪费
  • segment的数量可能很是多,对服务器的文件句柄消耗很大,查询性能会随着segment的数量增长而增长

新增数据的过程jvm

 

 这个流程的目的是:提高写入性能(异步落盘)elasticsearch

一、保存到index buffer中,同时写入Transaction log(防止内存的数据丢失,有点想redo log)性能

二、当index buffer空间满了(默认占用jvm10%)或每1秒(经过index.refresh_interval 配置)执行Refresh操做,写入segment并清空index buffer(这里的1秒内是查不到刚保存的数据的,因此es也被成为近实时的搜索引擎)搜索引擎

三、于此同时将segment刷入内存,开放查询设计

四、flush操做将segment写入磁盘(默认30分钟执行一次)blog

  flash操做包含:索引

  •     调用一次refresh
  •     fsync:将segment写入磁盘
  •     清空对应的trans log

相关文章
相关标签/搜索