Elasticsearch 底层如何执行文档的更新和删除操作?详细流程是什么?
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