Java Elasticsearch的Liquibase或Flyway数据库迁移替代方案
我是个新手。我一直试图寻找一个数据库迁移工具很长时间,我找不到一个。我想知道是否有人能帮我指出正确的方向 我将使用Elasticsearch作为项目中的主要数据存储。我想对我在项目中开发新模块时运行的所有映射和配置更改/数据导入/数据升级脚本进行版本设置 过去我使用数据库版本控制工具,如Flyway或Liquibase 是否有任何框架/脚本或方法可用于ES以实现类似的功能 是否有人有使用脚本手动执行此操作的经验,并至少运行迁移脚本升级脚本Java Elasticsearch的Liquibase或Flyway数据库迁移替代方案,java,
elasticsearch,migration,liquibase,flyway,Java,
elasticsearch,Migration,Liquibase,Flyway,我是个新手。我一直试图寻找一个数据库迁移工具很长时间,我找不到一个。我想知道是否有人能帮我指出正确的方向 我将使用Elasticsearch作为项目中的主要数据存储。我想对我在项目中开发新模块时运行的所有映射和配置更改/数据导入/数据升级脚本进行版本设置 过去我使用数据库版本控制工具,如Flyway或Liquibase 是否有任何框架/脚本或方法可用于ES以实现类似的功能 是否有人有使用脚本手动执行此操作的经验,并至少运行迁移脚本升级脚本 提前谢谢 从这个角度/需求来看,ES有很大的局限性:
提前谢谢 从这个角度/需求来看,ES有很大的局限性:
- 尽管有动态映射,ES不是无模式的,而是模式密集型的。如果此更改与现有文档冲突,则无法更改映射(实际上,如果任何文档没有新映射影响的空字段,这将导致异常)
- ES中的文档是不可变的:一旦索引了一个文档,就只能在中检索/删除。围绕这一点的语法是局部更新,它在ES端实现了线程安全的delete+索引(具有相同的id)
- 使用严格映射(
和/或“dynamic”:“strict”
,请查看)。这将保护您的索引/类型不受影响index.mapper.dynamic:false
- 意外地使用错误的类型动态映射
- 获取显式错误,以防在数据映射关系中丢失某些错误
- 您可以获取实际的ES映射,并将其与数据模型进行比较。如果您的PL具有足够高的ES级别库,那么这应该非常容易
- 您可以利用它进行迁移
所以,有一点经验。对我来说,目前合理的流量是:
- 代码中描述为模型的所有数据结构。这个模型实际上也提供了ORM抽象
- 索引/映射创建调用是简单模型的方法
- 每个索引都有别名(即
),它指向实际索引(即news
)news\u index{revision}{u创建日期}
- 放置相同的映射
- put映射是旧映射的纯超集(只提供了新字段,旧字段保持不变)
- 受新映射影响的字段中没有文档具有值
- 使用新映射创建新索引/类型(命名为like
name{revision}{date}
- 将别名重定向到新索引
- 启动迁移代码,请求快速重新编制索引 在此重新编制索引期间,您可以正常通过别名安全地为新文档编制索引。缺点是,在重新编制索引期间,历史数据部分可用
- 如果读取请求需要一致的历史数据,则无法执行此操作
- 您需要重新编制整个索引的索引。如果每个索引有一种类型(可行的解决方案),那么这很好。但有时您需要多类型索引
- 数据网络往返。有时会很痛苦
综上所述:
- 尽量在模型中有好的抽象,这总是有帮助的
- 试着保持历史数据/字段陈旧。只要记住这个想法来构建代码,这比一开始听起来容易
- 我强烈建议不要依赖于利用ES实验工具的迁移工具。这些工具可以随时更改,比如
toolsriver-*
披露:我是这个项目的维护者;-)有没有自动化这个过程的工具?我不知道。Tbh,目前我看不到在ES中以“自动”模式无缝迁移数据的方法。但是如果你的数据是不稳定的——考虑2件事:1——好的RDBMS并不像看上去那么糟糕。2-将索引分为更小的索引(每月、每天、每个用户等),以便能够更快地迁移/切换新数据/活动数据的别名。要添加的小东西是afair,这篇文章撰写时没有。在不需要compex应用程序端转换的迁移情况下,ES端的reindex工作得非常快。在此处添加指向此有用答案的链接: