Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Elasticsearch的Liquibase或Flyway数据库迁移替代方案_Java_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Migration_Liquibase_Flyway - Fatal编程技术网 elasticsearch,migration,liquibase,flyway,Java,elasticsearch,Migration,Liquibase,Flyway" /> elasticsearch,migration,liquibase,flyway,Java,elasticsearch,Migration,Liquibase,Flyway" />

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

Java Elasticsearch的Liquibase或Flyway数据库迁移替代方案,java,elasticsearch,migration,liquibase,flyway,Java,elasticsearch,Migration,Liquibase,Flyway,我是个新手。我一直试图寻找一个数据库迁移工具很长时间,我找不到一个。我想知道是否有人能帮我指出正确的方向 我将使用Elasticsearch作为项目中的主要数据存储。我想对我在项目中开发新模块时运行的所有映射和配置更改/数据导入/数据升级脚本进行版本设置 过去我使用数据库版本控制工具,如Flyway或Liquibase 是否有任何框架/脚本或方法可用于ES以实现类似的功能 是否有人有使用脚本手动执行此操作的经验,并至少运行迁移脚本升级脚本 提前谢谢 从这个角度/需求来看,ES有很大的局限性:

我是个新手。我一直试图寻找一个数据库迁移工具很长时间,我找不到一个。我想知道是否有人能帮我指出正确的方向

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

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

是否有任何框架/脚本或方法可用于ES以实现类似的功能

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


提前谢谢

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

  • 尽管有动态映射,ES不是无模式的,而是模式密集型的。如果此更改与现有文档冲突,则无法更改映射(实际上,如果任何文档没有新映射影响的空字段,这将导致异常)
  • ES中的文档是不可变的:一旦索引了一个文档,就只能在中检索/删除。围绕这一点的语法是局部更新,它在ES端实现了线程安全的delete+索引(具有相同的id)
就你的问题而言,这意味着什么?基本上,您不可能拥有针对ES的经典迁移工具。以下是使您的ES工作更轻松的方法:

  • 使用严格映射(
    “dynamic”:“strict”
    和/或
    index.mapper.dynamic:false
    ,请查看)。这将保护您的索引/类型不受影响

  • 意外地使用错误的类型动态映射

  • 获取显式错误,以防在数据映射关系中丢失某些错误

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

  • 您可以利用它进行迁移


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

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

  • 尝试放置模型(类型)映射。如果它是在没有错误的情况下完成的,这意味着
    • 放置相同的映射
    • put映射是旧映射的纯超集(只提供了新字段,旧字段保持不变)
    • 受新映射影响的字段中没有文档具有值
    所有这些实际上意味着您可以很好地使用现有的映射/数据,只需一如既往地使用数据即可

  • 如果ES提供有关新映射的异常,则
    • 使用新映射创建新索引/类型(命名为like
      name{revision}{date}
    • 将别名重定向到新索引
    • 启动迁移代码,请求快速重新编制索引 在此重新编制索引期间,您可以正常通过别名安全地为新文档编制索引。缺点是,在重新编制索引期间,历史数据部分可用
    这是经过生产测试的解决方案。关于这种方法的注意事项:

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

    综上所述:

    • 尽量在模型中有好的抽象,这总是有帮助的
    • 试着保持历史数据/字段陈旧。只要记住这个想法来构建代码,这比一开始听起来容易
    • 我强烈建议不要依赖于利用ES实验工具的迁移工具。这些工具可以随时更改,比如
      river-*
      tools
    看一看 虽然这还不是一个真正成熟的项目,但它可能满足您的需求


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

    有没有自动化这个过程的工具?我不知道。Tbh,目前我看不到在ES中以“自动”模式无缝迁移数据的方法。但是如果你的数据是不稳定的——考虑2件事:1——好的RDBMS并不像看上去那么糟糕。2-将索引分为更小的索引(每月、每天、每个用户等),以便能够更快地迁移/切换新数据/活动数据的别名。要添加的小东西是afair,这篇文章撰写时没有。在不需要compex应用程序端转换的迁移情况下,ES端的reindex工作得非常快。在此处添加指向此有用答案的链接: