我正在为一个可以更新文档的博客实施弹性搜索。
我需要在 Elastic Search 中执行无中断重新索引,以避免竞争并保持一致性。(就一致性而言,我的意思是,如果应用程序在执行写入操作后执行查询,则即使在重新索引期间,查询也应该显示更改)。
我能找到的最好的建议是,您使用别名来自动切换应用程序正在使用的索引,并且应用程序在写入时同时写入旧索引(通过 )write_alias和新索引(通过特殊write_next_version别名)在重新索引操作期间,并从旧索引中读取(通过 a read_alias)。只要应用程序首先写入旧索引,然后写入新索引,重新索引和应用程序之间的并发写入中的任何竞争都可以通过文档版本号解决。重建索引完成后,只需原子地将应用程序的读写别名切换到新索引并删除write_next_version别名即可。
然而,仍然存在比赛和表现问题。
我的应用程序不知道正在发生重新索引,reindex并且涉及的别名切换是一个单独的长时间运行的过程。我可以使用HEAD命令来查找是否write_next_version存在特殊别名,并且仅在存在时才写入。然而,这是到 ES 服务器的额外往返。HEAD 命令和上述删除第二write_next_version个别名的重新索引过程之间仍然存在竞争。我可以每次都进行两次写入,然后默默地处理通常不存在的write_next_version别名的错误。如果我的文档很小,我会通过批量API 来完成此操作,但它们是博客条目,它们可能相当大。
那么我应该每次只写两次并在第二次写入时吞下错误吗?或者我应该使用HEADAPI 来确定应用程序是否需要执行第二次写入以保持一致性?或者有更好的方法来做到这一点吗?
本文显示了该策略的总体轮廓。这篇较旧的文章也展示了如何做到这一点,但他们不使用别名,这是不可接受的。Elastic Search github 上有一个相关问题,但他们没有解决需要完成两次写入才能保持一致性的问题。他们也不解决比赛或表现问题。(他们关闭了这个问题......)
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |