ElasticSearch:如果在更新期间未设置自定义路由,则更新现有记录(设置了自定义路由参数)会导致重复记录

kwvwclae  于 2023-02-18  发布在  ElasticSearch
关注(0)|答案(1)|浏览(104)

环境详细信息:ElasticSearch7.8.1版路由参数是索引设置中的可选参数。
根据ElasticSearch文档-https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html

  • 当索引指定custom _routing的文档时,_id的唯一性在索引中的所有分片中是不保证的。事实上,如果使用不同的_routing值索引,具有相同_id的文档可能会在不同的分片上结束。*

我们遇到了之前使用自定义路由参数(比如说customerId)的相同场景。由于某种原因,我们现在需要删除自定义路由。这意味着现在docId将用作默认路由参数。这是在索引操作期间在不同的碎片上创建具有相同ID的重复记录。以前(在删除自定义路由之前),它会导致记录更新(预期)
我正在考虑以下方法来走出这一点,请告知如果你有更好的方法建议,这里的关键是避免停机。

**方法1:**当我们收到更新请求时,创建重复记录。一旦创建了没有自定义工艺路线的记录,就发出删除具有自定义工艺路线的记录的请求。

缺点:如果没有更新记录,那么所有这些记录将徘徊在自定义路由,我们希望避免这种情况,因为这可能会导致不可预见的情况在未来。

方法2我们使用Re-Index API将数据迁移到新索引(迁移期间关闭自定义路由)。成功迁移后,应用程序将使用新索引。

缺点:我们的一些索引是巨大的,他们需要12小时以上的重新索引操作,由于ElasticSearch重新索引API不会迁移在这12小时窗口之间创建的新记录,因为它使用快照机制。这需要一个停机时间的方法。
如果您以前遇到过这种情况,请提出替代方案。

jexiocij

jexiocij1#

感谢@瓦尔,他还发现了一些其他的方法,比如同时写入两个索引并从旧的索引中读取。然后在重新索引完成后转换为读取新的索引。
1.创建指向旧索引的别名(_v1)
1.将应用程序指向这些别名而不是实际索引
1.使用相同的Map创建新索引(
_v2
1.将数据从旧的索引到新的使用重新索引,并确保我们不保留自定义路由在此期间。
1.重新建立索引后,将别名更改为指向新索引而不是旧索引(尽管需要验证这一点,但如果这不起作用,也有简单的替代方法)
1.验证完成后,删除旧索引

我们在过渡期(从重新建立索引开始到重新建立索引完成之间的窗口)做什么-

写入两个索引(旧索引和新索引),并通过别名从旧索引读取

相关问题