栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

用于Elasticsearch的Liquibase或Flyway数据库迁移替代

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用于Elasticsearch的Liquibase或Flyway数据库迁移替代

从这种观点/需求来看,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.mshxw.com
本文地址:https://www.mshxw.com/it/385385.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号