7

我是 ElasticSearch 的新手,我正在为一个项目评估它。

在 ES 中,复制可以是同步的,也可以是异步的。在异步的情况下,一旦将文档写入主分片,客户端就会成功返回。然后将文档异步推送到其他副本。

当异步写入时,我们如何确保当 GET 完成时,即使数据没有传播到所有副本也会返回数据。因为当我们在 ES 中执行 GET 时,查询被转发到相应分片的副本之一。假设我们是异步写入的,主分片可能有文档,但执行 GET 的选定副本可能尚未接收/写入文档。在 Cassandra 中,我们可以在写入和读取时指定一致性级别(ONE、QUORUM、ALL)。在 ES 中读取类似的东西是可能的吗?

4

2 回答 2

11

是的,您可以将复制设置为异步(默认为同步)以不等待副本,尽管实际上这不会给您带来太多收益。

每当您读取数据时,您都可以指定首选项参数来控制将从何处获取文档。如果您使用preference:_primary,请确保始终从主分片获取文档,否则,如果在文档在所有副本上可用之前完成获取,则可能会遇到尚未拥有它的分片。鉴于 get api 是实时工作的,保持复制同步通常是有意义的,这样在索引操作返回后,您总是可以通过 id 从任何应该包含它的分片中取回文档。尽管如此,如果您在第一次索引文档时尝试取回文档,那么您可能会找不到它。

elasticsearch 中也有写一致性参数,但与其他数据存储的工作方式不同,与复制是同步还是异步无关。具有一致性参数您可以控制需要多少数据副本才能允许写入操作。如果没有足够的数据副本可用,则写入操作将失败(等待最多 1 分钟后,您可以通过 timeout 参数更改间隔)。这只是决定是否接受操作的初步检查。这并不意味着如果副本上的操作失败,它将被回滚。实际上,如果在副本上的写入操作失败但在主节点上成功,则假设副本(或它正在运行的硬件)有问题,因此分片将被标记为失败并在另一个节点上重新创建. 一致性的默认值为quorum,也可以设置为oneall

也就是说,当涉及到 get api 时,elasticsearch 并不是最终一致的,而是一致的,因为一旦文档被索引,您就可以检索它。

新添加的文档在下一次刷新操作之前不可用于搜索,默认情况下每秒自动发生一次,这与最终的一致性无关(因为文档在那里并且可以通过 id 检索),而是更多关于如何搜索和 lucene 工作以及如何通过 lucene 使文档可见。

于 2014-01-15T13:00:34.453 回答
6

这是我在邮件列表中给出的答案:

据我了解,当您索引文档时,它会写入事务日志中,然后您会从 ES 获得成功的答案。之后,以异步方式,将其复制到其他节点并由 Lucene 索引。

也就是说,您不能立即搜索文档,但可以获取它。如果需要,ES 会在您获取文档时读取 tlog。

我认为(不确定)如果副本不是最新的,则 GET 将在主 tlog 上发送。

如我错了请纠正我。

于 2012-12-29T11:05:14.947 回答