在ES中,复制可以是同步或异步.在异步的情况下,只要将文档写入主分片,客户端就会返回成功.然后将文档异步推送到其他副本.
当异步编写时,我们如何确保在完成GET时,即使数据没有传播到所有副本,也会返回数据.因为当我们在ES中执行GET时,查询将转发到相应分片的其中一个副本.如果我们异步写入,主分片可能具有文档,但是用于执行GET的所选副本可能尚未接收/写入文档.在Cassandra中,我们可以在写入和读取时指定一致性级别(ONE,QUORUM,ALL).在ES中读取是否可能?
每当您读取数据时,您都可以指定preference参数来控制文档的取自何处.如果您使用首选项:_primary,请确保始终从主分片中获取文档,否则,如果在文档在所有副本上可用之前完成获取,则可能会遇到没有它的分片然而.鉴于get api实时工作,保持复制同步通常是有意义的,这样在索引操作返回后,您总是可以从任何应该包含它的分片中通过id返回文档.尽管如此,如果您在第一次索引文档时尝试取回文档,那么您可能会发现它没有找到它.
elasticsearch中也有一个写一致性参数,但与其他数据存储的工作方式不同,它与复制是同步还是异步无关.使用consistency参数,您可以控制需要多少份数据副本才能允许写入操作.如果没有足够的数据副本可用,则写操作将失败(等待最多1分钟后,您可以通过timeout参数更改的间隔).这只是一个初步检查,以决定是否接受该操作.这并不意味着如果操作在副本上失败,它将被回滚.实际上,如果写操作在副本上失败但在主数据库上成功,则假设副本存在错误(或者正在运行的硬件),因此该分片将被标记为失败并在另一个节点上重新创建.一致性的默认值是仲裁,也可以设置为一个或全部.
也就是说,当谈到get api时,elasticsearch最终并不一致,但只是一致,因为一旦文档被索引,你就可以检索它.
事实上新添加的文档直到下一次刷新操作才能进行搜索,默认情况下每秒自动发生一次,这实际上不是最终的一致性(因为文档在那里并且可以通过id检索),但更多关于如何搜索和lucene工作以及如何通过lucene使文档可见.