一、ElasticSearch高可用

  1. 数据首先写入到 Index buffer(内存) 和 Transaction log(磁盘) 中,即便内存数据丢失,也可读取磁盘中的 Transaction log;
  2. 默认 1s 一次的 refresh 操作将 Index buffer 中的数据写入 segments(内存),此时数据可查询
  3. 默认30分钟执行一次的 flush 操作,将 segments 写入磁盘,同时清空 Transaction log。若Transaction log 满(默认512M),也会执行此操作;
  4. 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(内存)中,此时数据不可被查询到;
    image.png
    将 Index buffer 写入 Segment 的过程叫Refresh。Refresh 不执行 fsync 操作,此操作不会将数据写入磁盘;

image.png

  • Refresh 频率:默认 1 秒发生⼀次,可通过 index.refresh_interval 配置。Refresh 后,数据就可以被搜索到了。这也是为什么 Elasticsearch 被称为近实时搜索

    3、Transaction log

    image.png

  • Segment 写⼊磁盘的过程相对耗时,借助⽂件系统缓存,Refresh 时,先将 Segment 写入缓存以开放查询;

  • 为了保证数据不会丢失。所以在 Index 文档时,同时写 Transaction Log,高版本开始,Transaction Log 默认落盘。每个分片有⼀个 Transaction Log;
  • 在 ES Refresh 时,Index Buffer 被清空,Transaction log 不会清空;

    4、Flush

    image.png
    ES Flush & Lucene Commit

  • 实际影响:调用 Refresh,Index Buffer 清空,调⽤ fsync,将缓存中的 Segments写⼊磁盘,清空(删除)Transaction Log;

  • 调用时机:默认 30 分钟调用⼀次,或者 Transaction Log 满 (默认 512 MB);


    5、Merge

    image.png

  • Segment 很多,需要被定期被合并:减少 Segments / 删除已经删除的文档

  • ES 和 Lucene 会自动进行 Merge 操作:POST my_index/_forcemerge