Elasticsearch CRUD 需要刷新吗?

2023-12-31

我需要将 RDBS 数据与 Elasticsearch 同步。实现此目的的常见方法是在 RDBS 上应用更改,然后使用消息队列(或用于 ETL 的表)在 ES 上应用相同的更改。

同一个 Elasticsearch 博客建议从队列中弹出 1000 条消息,并通过插入、更新和删除将它们推送到批量请求中。

众所周知,ES 是近乎实时的,需要刷新才能让搜索请求看到更改。

鉴于这一事实,问题是:做CRUD操作与显式ID(GET、INSERT、UPDATE、DELETE)如果在行中执行,需要刷新吗?换句话说:行中的 CRUD 是实时的吗?

通过阅读几篇文章,看起来它们不需要刷新并且是实时应用的,但我想得到确认。

更清楚地说:我don’t需要执行search请求(需要刷新才能使更改可见),但仅使用显式 ID 访问。我不介意当这些更改对搜索可见时。

如果在ES上连续执行两个CRUD请求:

  1. id=1 的索引文档

  2. 更新(或删除) id=1 的文档

2)是否需要等待刷新才能看到1)?

如果是的话,我找不到一种方法来实现 RDBS 和 ES 之间的一致性,因为行中的相同操作最终会在 RDBS 上得到更新(或删除)的文档,但在 ES 上会由于缺乏刷新而失败。


简短回答:

你不需要刷新。它将是一致的意味着操作按顺序执行。 ES 确保最新的请求始终成功。它使变化持续存在index/update/delete要求。

如果在不同的网络分区接收到一个 ID 的两个写请求,并且后面的一个首先成功,那么前面的一个将不会被更新,因为通过版本控制实现了一致性。最新版本数据总是成功。

长答案:

您需要了解许多概念,例如translog, fsync, consistency at ES, 'optimistic concurrency control', versioning, partitioning, availability.

ES 使用版本控制来实现一致性。所以当你发送index/update/delete要求它在高层做以下事情。

  1. 将其写入 translog
  2. 使其持久化 - 有一个默认的间隔属性。当该间隔过去时或每次之后index/delete/update手术
  3. 向节点发送请求
  4. 接收到请求的节点识别数据所属分区的领导者。
  5. 分区领导节点写入数据并转发到应复制该分区的其他副本节点。
  6. 一旦所有内容都被确认,通过接收请求的初始节点将状态返回给客户端。

其中有许多概念/算法使其成为强大的分布式系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch CRUD 需要刷新吗? 的相关文章

随机推荐