面试题答案
一键面试版本控制机制
- 工作原理:Elasticsearch 为每个文档分配一个版本号。当一个写入操作到达主分片时,它会携带当前文档的版本号(若为新文档则版本号为 1)。主分片在处理写入操作前,会对比请求中的版本号与当前存储文档的版本号。如果请求版本号等于当前版本号(对于新文档,当前版本号为 0 且请求版本号为 1 时也满足条件),则允许写入操作,并将文档版本号加 1。如果请求版本号小于当前版本号,说明文档已经被其他操作更新,此次写入操作被视为冲突,操作失败,Elasticsearch 会返回版本冲突错误信息给客户端。
乐观并发控制
- 工作原理:基于上述版本控制机制,Elasticsearch 采用乐观并发控制策略。它假设大多数情况下写入操作不会发生冲突,因此不会在写入前对文档进行锁定。当多个写入操作同时到达主分片时,每个操作都尝试更新文档,只有版本号匹配的操作才能成功更新文档,不匹配的操作会因版本冲突失败。这种方式提高了系统的并发处理能力,减少了锁带来的性能开销,但需要客户端处理版本冲突错误,通常客户端会重新获取最新版本的文档,修改后再次尝试写入。
文档级锁
- 工作原理:虽然 Elasticsearch 主要依赖乐观并发控制,但在某些特殊情况下(如批量操作等),也会使用文档级锁来辅助处理冲突。当一个操作需要对多个文档进行写入且这些文档之间存在依赖关系时,为了确保数据一致性,Elasticsearch 会对涉及的文档加锁。在加锁期间,其他试图修改这些文档的操作会被阻塞,直到锁被释放。这种锁机制能够防止并发操作导致的数据不一致问题,但会影响系统的并发性能,因此使用场景相对较少,并且锁的持有时间也会尽量缩短。