一尘不染

ElasticSearch中的GET一致性(和法定人数)

elasticsearch

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

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

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


阅读 240

收藏
2020-06-22

共1个答案

一尘不染

没错,您可以将复制设置为异步(默认为同步),以不等待副本,尽管实际上这样做并不会给您带来多少好处。

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

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

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

新添加的文档直到下一次刷新操作(默认情况下默认每秒自动发生)才可供搜索的事实,实际上与最终的一致性(因为文档在那里并且可以通过id检索)无关,而是有关如何搜索的更多信息。和lucene的工作以及如何通过lucene使文档可见。

2020-06-22