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

vai*_*dik 5 nosql elasticsearch

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

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

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

jav*_*nna 8

是的,您可以将复制设置为异步(默认为同步)以便不等待副本,尽管在实践中这并不会给您带来太多帮助.

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

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

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

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


dad*_*net 6

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

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

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

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

如果我错了纠正我。