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

时间:2014-06-01 07:33:53

标签: java elasticsearch migration liquibase flyway

我对ES很新。我一直在尝试搜索数据库迁移工具很长时间,我找不到一个。我想知道是否有人可以帮我指出正确的方向。

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

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

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

有没有人有任何使用脚本和至少升级脚本运行迁移脚本的经验。

提前致谢!

2 个答案:

答案 0 :(得分:28)

从这个角度来看,ES有很大的局限性:

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

这对你的问题有什么意义?基本上,您无法为ES提供经典的迁移工具。以下是什么可以让您更轻松地使用ES:

  • 使用严格映射("dynamic": "strict"和/或index.mapper.dynamic: false,查看mapping docs)。这将保护您的索引/类型

    • 意外动态映射错误类型
    • 如果您错过了数据映射关系中的某些错误,则会出现显式错误
  • 您可以获取实际的ES映射并将其与数据模型进行比较。如果您的PL具有足够高的ES级别库,这应该非常简单

  • 您可以利用index aliases进行迁移

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

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

每次部署代码时,

  1. 尝试放置模型(类型)映射。如果它完成没有错误,这意味着您

    • 使用相同的映射
    • 将映射作为旧映射的纯超集(仅提供新字段,旧保持不变)
    • 没有文档在受新映射影响的字段中具有值

    所有这些实际上意味着您可以使用您拥有的mappping /数据,只需像往常一样处理数据

  2. 如果ES提供有关新映射的例外,那么您
    • 使用新映射创建新索引/类型(命名为name_{revision}_{date}
    • 将您的别名重定向到新索引
    • 启动迁移代码,使bulk请求快速重建索引 在重建索引期间,您可以通过别名安全地索引新文档。缺点是历史数据在重建索引期间部分可用。
  3. 这是经过生产测试的解决方案。围绕这种方法的注意事项:

    • 如果您的阅读请求需要一致的历史数据,则无法执行此操作
    • 您需要重新索引整个索引。如果每个索引有1种类型(可行的解决方案),那就好了。但有时您需要多类型索引
    • 数据网络往返。有时可能会疼痛

    总结一下:

    • 尝试在模型中使用良好的抽象,这总是有帮助
    • 尝试保持历史数据/字段陈旧。只需记住这个想法就可以构建代码,这比起初的声音更容易
    • 我强烈建议您不要依赖使用ES实验工具的迁移工具。这些可以随时更改,例如river-*工具。

答案 1 :(得分:0)

看看https://github.com/hatala91/ES-MaMa 尽管这不是一个真正成熟的项目,但它可能会满足您的需求。

披露:我是该项目的维护者;-)