ES 写入一条文档后为什么不能马上搜到?数据会不会丢?
先自己想一想,再看参考要点
参考要点
- Lucene 的索引由不可修改的段组成,搜索只能搜已经打开的段,新文档先放在内存缓冲区
- refresh 把缓冲区写成一个新段并打开,默认每 1 秒一次,所以写入后约 1 秒才能搜到,称为近实时
- 按 ID 读取是实时的,不受 refresh 影响
- 要求写完立即可见时用 refresh=wait_for 等下一次 refresh 再返回,或者 refresh=true 立即刷新,频繁使用会产生大量小段
- refresh 出的段还在文件系统缓存中,不丢数据靠 translog:默认每个写请求返回前主分片和副本都把 translog fsync 到磁盘,设为 async 则每 5 秒一次,宕机会丢最近的写入
- flush 执行 Lucene 提交,把段 fsync 到磁盘并开始新的 translog,重启时从提交点重放 translog
- 段越来越多由后台合并,合并时才真正清除已删除的旧版本