在ElasticSearch中获得一致性(和法定人数)

时间:2012-12-29 10:32:07

标签: nosql elasticsearch

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

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

当异步编写时,我们如何确保在完成GET时,即使数据没有传播到所有副本,也会返回数据。因为当我们在ES中执行GET时,查询将转发到相应分片的其中一个副本。如果我们异步写入,主分片可能具有文档,但是用于执行GET的所选副本可能尚未接收/写入文档。在Cassandra中,我们可以在写入和读取时指定一致性级别(ONE,QUORUM,ALL)。在ES中读取是否可以这样?

2 个答案:

答案 0 :(得分:8)

是的,您可以将replication设置为异步(默认为同步),而不是等待副本,但实际上这并不会给您带来太大的影响。

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

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

也就是说,当谈到get api时,elasticsearch最终并不一致,但只是一致,因为一旦文档被索引,你就可以检索它。

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

答案 1 :(得分:4)

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

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

也就是说,你不能立即搜索文件,但你可以 GET 它。 当您获取文档时,ES将根据需要读取tlog。

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

如果我错了,请纠正我。