Elasticsearch 的 Liquibase 或 Flyway 数据库迁移替代方案

问题描述 投票:0回答:1

我对 ES 还很陌生。我一直在寻找数据库迁移工具,但找不到。我想知道是否有人可以帮助我指出正确的方向。

我将使用 Elasticsearch 作为我的项目中的主要数据存储。我想对我在项目中开发新模块时运行的所有映射和配置更改/数据导入/数据升级脚本进行版本控制。

过去我使用 Flyway 或 Liquibase 等数据库版本控制工具。

是否有任何框架/脚本或方法可以与 ES 一起使用来实现类似的功能?

是否有人有使用脚本手动执行此操作并运行迁移脚本至少升级脚本的经验。

提前致谢!

java elasticsearch migration liquibase flyway
1个回答
54
投票

从这个角度/需求来看,ES有巨大的局限性:

  • 尽管有动态映射,ES 不是无模式而是模式密集型。如果此更改与现有文档冲突,则无法更改映射(实际上,如果任何文档具有受新映射影响的非空字段,这将导致异常)
  • ES 中的文档是不可变的:一旦索引了文档,就只能检索/删除。围绕这个的语法糖是部分更新,这使得 ES 端线程安全的删除 + 索引(具有相同的 id)

这对于您的问题意味着什么?基本上,您无法拥有经典的 ES 迁移工具。以下是可以让您更轻松地使用 ES 的工作:

  • 使用严格的映射(
    "dynamic": "strict"
    和/或
    index.mapper.dynamic: false
    ,请查看映射文档)。这将保护您的索引/类型不被意外地动态映射为错误的类型
  • 当您错过数据映射关系中的某些错误时,会出现显式错误

  • 您可以获取实际的 ES 映射并将其与您的数据模型进行比较。如果你的 PL 有足够高级别的 ES 库,这应该很容易

  • 您可以利用索引别名进行迁移


所以,一点经验。对我来说,目前合理的流程是这样的:

  • 所有数据结构在代码中都被描述为模型。这个模型实际上也提供了 ORM 抽象。
  • 索引/映射创建调用是简单模型的方法。
  • 每个索引都有别名(即
    news
    ),它指向实际索引(即
    news_index_{revision}_{date_created}
    )。

每次部署代码时,您

  1. 尝试放置模型(类型)映射。如果完成时没有错误,这意味着您已经完成了
  • 放置相同的映射
  • 将映射作为旧映射的纯超集(仅提供新字段,旧字段保持不变)
  • 受新映射影响的字段中没有文档具有值

所有这些实际上意味着您可以很好地使用现有的映射/数据,只需像往常一样处理数据即可。

  1. 如果 ES 提供有关新映射的异常,您
  • 使用新映射创建新索引/类型(命名为
    name_{revision}_{date}
  • 将您的别名重定向到新索引
  • 启动迁移代码,发出
    bulk
    请求快速重新索引 在此重新索引期间,您可以通过别名正常安全地索引新文档。缺点是在重新索引期间历史数据部分可用。

这是经过生产测试的解决方案。这种方法的注意事项:

  • 如果您的读取请求需要一致的历史数据,则不能这样做
  • 您需要重新索引整个索引。如果每个索引有 1 个类型(可行的解决方案),那么就可以了。但有时你需要多类型索引
  • 数据网络往返。有时会痛

总结一下:

  • 尝试在模型中拥有良好的抽象,这总是有帮助的
  • 尝试保持历史数据/字段陈旧。只需牢记这个想法构建您的代码,这比一开始听起来更容易
  • 我强烈建议避免依赖利用 ES 实验工具的迁移工具。这些可以随时更改,就像
    river-*
    工具一样。
© www.soinside.com 2019 - 2024. All rights reserved.