当前位置: 首页 > 知识库问答 >
问题:

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

江睿
2023-03-14

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

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

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

有没有任何框架/脚本或方法可以与ES一起使用来实现类似的目标?

有没有人有过手动使用脚本和运行迁移脚本至少升级脚本的经验?

提前感谢!

共有1个答案

端木淇
2023-03-14

从这个观点/需求来看,ES有一个巨大的局限性:

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

这在你的问题中是什么意思?基本上,你不能拥有用于ES的经典迁移工具。以下是可以让您更轻松地使用ES的方法:

>

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

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

    在数据映射关系中遗漏某些错误的情况下获得显式错误

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

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

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

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

    每次部署代码时,您

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

    所有这些实际上意味着你可以很好地使用你拥有的映射/数据,就像往常一样使用数据。

    • 使用新的映射创建新的索引/类型(如name{revision}{date}
    • 将别名重定向到新索引
    • 激发迁移代码,使批量请求快速重新编制索引在此重新编制索引期间,您可以通过别名安全地为新文档编制索引。缺点是历史数据在重新编制索引期间部分可用

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

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

    总结一下:

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

  •  类似资料:
    • 问题内容: 我对ES非常陌生。我一直在尝试搜索数据库迁移工具,但找不到。我想知道是否有人可以帮助我指出正确的方向。 我将使用Elasticsearch作为项目中的主要数据存储。我想对我在项目中开发新模块时运行的所有映射和配置更改/数据导入/数据升级脚本进行版本控制。 过去,我使用过数据库版本控制工具,例如Flyway或Liquibase。 我可以在ES中使用任何框架/脚本或方法来实现类似目的吗?

    • 我正在尝试使用flyway,但是我有一个不知道如何解决的情况: 当我应用STANDARD脚本时,我必须运行V1.0__create_table_TAB1.sql当我将脚本应用到customer1时,TAB1表是一个视图,因此我必须运行V1.0__creaate_view_TAB1_to_schema1.sql。 实际: 应始终应用sql_common文件夹的脚本,但不应应用 V1.0(创建表 TA

    • 我陷入了关于是否使用MongoDB或Cassandra来满足我的数据库需求的具体决定之间,并希望对我的用例进行输入以指导我的决定。 要求: 数据源 X个包含Y个服务器的数据中心。 每个服务器有N个网络和M个统计数据。 e、 g.目前(3个数据中心、50台服务器、19个网络和10个统计数据)。这些数字会随着时间的推移而增加。 数据获取: 每小时为每台服务器解析一个xml页面(约20kb/页)。(~2

    • 我正在尝试配置Spring Boot和Flyway,以便使用Spring Boot 2.2.6和Flyway 5.2.3对两个不同的数据源应用单独的迁移。 主要数据源: 第二个数据源: 数据源连接属性: Flyway迁移: 目录结构: 迁移脚本仅正确应用于数据库。 问题是,和中的脚本被应用到数据库,而只应用主目录中的脚本。 如何配置Flyway以仅将目录中的迁移脚本应用于数据库?

    • 问题内容: 我正在使用Java开发数据库迁移工具。该工具将数据库表及其数据复制到目标数据库。但是我希望它可以在不同的数据库上工作。从mysql复制并在derby等中创建。使用JDBC,我们可以收集有关表及其列的足够信息。但是我要问的是,是否可以使用sql free在Java上重新创建表。我的意思是不同的数据库具有不同的数据类型,有时它们在sql语法上也有所不同。那么JDBC或任何其他库(可以是开放

    • 在开发和维护一个数据库驱动的应用程序时, 数据库的结构会像代码一样不断演变。 例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变, Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。 如下的步骤向我们展示了