Elasticsearch 底层如何执行文档的更新和删除操作?详细流程是什么?

Sherwin.Wei Lv8

Elasticsearch 底层如何执行文档的更新和删除操作?详细流程是什么?

回答重点

Elasticsearch 底层是通过一种叫做 “近实时搜索(NRT - Near Real-Time Search)” 的方式来处理文档的更新和删除操作的。具体来说:
1)更新操作实际上是先删除旧文档,然后插入新文档。
2)删除操作并不会立即将文档从磁盘中移除,而是标记为“已删除”。

更新操作详细流程:

1)客户端发起更新请求。
2)Elasticsearch 接收到更新请求,将请求转发到负责该文档的主分片。
3)主分片进行版本控制,确保数据的一致性。
4)Elasticsearch 先将旧文档标记为删除,然后创建一个新版本的文档。
5)主分片将更改记录到事务日志(Translog)中,确保数据在故障恢复时不丢失。
6)最后,将更新同步到副本分片,确保高可用性。

删除操作详细流程:

1)客户端发起删除请求。
2)Elasticsearch 将该请求转给相应的主分片。
3)主分片检查文档的版本信息,确保没有并发冲突。
4)不是立即删除文档,而是将其标记为“已删除”状态。
5)将删除操作记录到事务日志(Translog)中。
6)在适当的时间,经过段合并(Segment Merge)操作,彻底从磁盘上移除标记为删除的文档。

扩展知识

1)文档版本控制

  • Elasticsearch 使用的是乐观并发控制(Optimistic Concurrency Control)来实现文档的版本控制。在插入或更新文档时,版本号都会自动递增。

2)事务日志(Translog)

  • Translog 是 Elasticsearch 保证数据可靠性的关键。当数据写入时,除了写入内存还会写入 Translog,这样即使发生故障,系统也可以根据 Translog 进行数据恢复。

3)段合并(Segment Merge)

  • 当文档被标记为删除或者数据更新后,原来的文档不会立刻从磁盘中移除。Elasticsearch 会在适当的时间进行“段合并”,将标记为删除的文档实际从磁盘移除并合并小段为大段,以提高查询效率。

4)近实时搜索(NRT)

  • Elasticsearch 的更新和删除操作并不是立刻可见的,而是近实时的。通常会有一个很短的延迟(默认值是 1 秒),数据才会被刷新到搜索索引中。

5)副本分片同步

  • 主分片处理完操作后,会将更改同步到所有副本分片。这是为了保证高可用性,当主分片失效时,副本分片可以立刻顶上,不会影响数据的可用性。
Comments