elasticsearch,Nosql,elasticsearch" /> elasticsearch,Nosql,elasticsearch" />

Nosql 在ElasticSearch中获得一致性(和仲裁)

Nosql 在ElasticSearch中获得一致性(和仲裁),nosql,elasticsearch,Nosql,elasticsearch,我是ElasticSearch的新手,我正在为一个项目评估它 在ES中,复制可以是同步的,也可以是异步的。在异步的情况下,一旦文档写入主分片,客户端就会返回success。然后将文档异步推送到其他副本 异步写入时,我们如何确保在完成GET后,即使数据尚未传播到所有副本,也会返回数据。因为当我们在ES中执行GET时,查询被转发到相应碎片的一个副本。如果我们是异步写入的,那么主碎片可能拥有文档,但用于执行GET的选定副本可能尚未接收/写入文档。在Cassandra中,我们可以在写入和读取时指定一致性

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

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


异步写入时,我们如何确保在完成GET后,即使数据尚未传播到所有副本,也会返回数据。因为当我们在ES中执行GET时,查询被转发到相应碎片的一个副本。如果我们是异步写入的,那么主碎片可能拥有文档,但用于执行GET的选定副本可能尚未接收/写入文档。在Cassandra中,我们可以在写入和读取时指定一致性级别(一、仲裁、全部)。ES中的reads是否可以这样做?

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

据我所知,当你为一个文档编制索引时,它会写在事务日志中,然后你会从ES那里得到一个成功的答案。 之后,它以异步方式复制到其他节点上,并由Lucene编制索引

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

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

如果我错了,请纠正我。

对,您可以设置为异步(默认为同步)以不等待复制副本,尽管在实践中这并不能为您带来多少好处

无论何时读取数据,都可以指定参数来控制从何处获取文档。如果使用
首选项:_primary
请确保始终从主碎片获取文档,否则,如果在文档在所有副本上可用之前完成获取,则可能会命中尚未获取的碎片。鉴于get api是实时工作的,因此保持复制同步通常是有意义的,这样在返回索引操作后,您就可以始终按id从任何应该包含该文档的碎片中获取该文档。尽管如此,如果您在第一次为文档编制索引时试图取回文档,那么可能会出现找不到的情况

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

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


新添加的文档在下一次刷新操作(默认情况下每秒自动刷新一次)之前不可用于搜索,这一事实实际上与最终的一致性无关(因为文档存在并且可以通过id检索),但更多关于搜索和lucene如何工作以及如何通过lucene查看文档的信息。

谢谢@jvanna的回答。解释了很多事情。@javanna例如,我有一个主碎片和6个副本碎片,默认写一致性参数(应该是4),当索引文档时,说它在主碎片上成功,在5个副本碎片上成功,但在1个副本碎片上失败。ES将返回索引请求的成功,我的理解正确吗?假设碎片“6”失败,则标记为失败。但在它被替换之前,可能有一个GET请求试图获取新的索引文档,并且请求转到碎片“6”,那么客户端将什么也得不到,对吗?期待您的回复:)