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