一、ElasticSearch高可用
- 数据首先写入到 Index buffer(内存) 和 Transaction log(磁盘) 中,即便内存数据丢失,也可读取磁盘中的 Transaction log;
- 默认 1s 一次的 refresh 操作将 Index buffer 中的数据写入 segments(内存),此时数据可查询;
- 默认30分钟执行一次的 flush 操作,将 segments 写入磁盘,同时清空 Transaction log。若Transaction log 满(默认512M),也会执行此操作;
- merge 操作,定期合并 segment;
三、写入过程
写Index Buffer 内存 —-Refresh—-> 写入Segment ,数据可查—-Flush—-> 硬盘—-Merge—->合并分片
1、Lucene Index
- 在 Lucene 中,单个倒排索引⽂件被称为Segment。Segment 是⾃包含的,不可变更的,多个 Segments 汇总在⼀起,称为 Lucene 的 Index,其对应的就是 ES 中的 Shard(分片),另外使用一个 commit 文件,记录索引内所有的 segment;
- 当有新文档写⼊时,会生成新 Segment,查询时会同时查询所有 Segments,并且对结果汇总。Lucene 中有⼀个⽂件,用来记录所有 Segments 信息,叫做 Commit Point;
- 删除的⽂档信息,保存在“.del”文件中;
2、Refresh
数据首先写入到 Index buffer(内存)中,此时数据不可被查询到;
将 Index buffer 写入 Segment 的过程叫Refresh。Refresh 不执行 fsync 操作,此操作不会将数据写入磁盘;
Refresh 频率:默认 1 秒发生⼀次,可通过 index.refresh_interval 配置。Refresh 后,数据就可以被搜索到了。这也是为什么 Elasticsearch 被称为近实时搜索;
3、Transaction log
Segment 写⼊磁盘的过程相对耗时,借助⽂件系统缓存,Refresh 时,先将 Segment 写入缓存以开放查询;
- 为了保证数据不会丢失。所以在 Index 文档时,同时写 Transaction Log,高版本开始,Transaction Log 默认落盘。每个分片有⼀个 Transaction Log;
在 ES Refresh 时,Index Buffer 被清空,Transaction log 不会清空;
4、Flush
ES Flush & Lucene Commit实际影响:调用 Refresh,Index Buffer 清空,调⽤ fsync,将缓存中的 Segments写⼊磁盘,清空(删除)Transaction Log;
调用时机:默认 30 分钟调用⼀次,或者 Transaction Log 满 (默认 512 MB);
5、MergeSegment 很多,需要被定期被合并:减少 Segments / 删除已经删除的文档
- ES 和 Lucene 会自动进行 Merge 操作:POST my_index/_forcemerge