是的,您可以将复制设置为异步(默认为同步)以不等待副本,尽管实际上这不会给您带来太多收益。
每当您读取数据时,您都可以指定首选项参数来控制将从何处获取文档。如果您使用preference:_primary
,请确保始终从主分片获取文档,否则,如果在文档在所有副本上可用之前完成获取,则可能会遇到尚未拥有它的分片。鉴于 get api 是实时工作的,保持复制同步通常是有意义的,这样在索引操作返回后,您总是可以通过 id 从任何应该包含它的分片中取回文档。尽管如此,如果您在第一次索引文档时尝试取回文档,那么您可能会找不到它。
elasticsearch 中也有写一致性参数,但与其他数据存储的工作方式不同,与复制是同步还是异步无关。具有一致性参数您可以控制需要多少数据副本才能允许写入操作。如果没有足够的数据副本可用,则写入操作将失败(等待最多 1 分钟后,您可以通过 timeout 参数更改间隔)。这只是决定是否接受操作的初步检查。这并不意味着如果副本上的操作失败,它将被回滚。实际上,如果在副本上的写入操作失败但在主节点上成功,则假设副本(或它正在运行的硬件)有问题,因此分片将被标记为失败并在另一个节点上重新创建. 一致性的默认值为quorum
,也可以设置为one
或all
。
也就是说,当涉及到 get api 时,elasticsearch 并不是最终一致的,而是一致的,因为一旦文档被索引,您就可以检索它。
新添加的文档在下一次刷新操作之前不可用于搜索,默认情况下每秒自动发生一次,这与最终的一致性无关(因为文档在那里并且可以通过 id 检索),而是更多关于如何搜索和 lucene 工作以及如何通过 lucene 使文档可见。