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

启动容器化微服务的多个实例时处理数据库模式创建和迁移

岳英锐
2023-03-14

我想在docker容器中部署我的微服务。我希望这些微服务尽可能无状态,只将状态保存到数据库中。

这意味着有以下要求:

  • 这些服务被部署为docker容器,并使用kubernetes进行编排
  • 每个服务都可以部署并扩展到多个实例
  • 服务的每个实例都是相同的。这意味着它们必须都具有相同的环境变量和传递给它的配置
  • 每个实例都不应该关心或知道另一个实例
  • 这些实例应该是无状态的,不应该选举领导人或达到法定人数

这导致了我在处理架构创建和迁移时遇到的问题:

>

  • 如果我有一个使用MySQL或Postgres作为数据存储的服务,我如何在第一次启动时创建表/模式?我应该只使用<code>CREATE IF NOT EXIST</code>语句,让实例在引导过程中“一决雌雄”吗?我无法设置一个环境变量来要求仅为其中一个实例创建表/模式。

    如何处理具有上述约束的架构迁移?有许多操作,例如删除/添加无法封装在事务中的列。

  • 共有2个答案

    阎承
    2023-03-14

    在我个人看来,数据库迁移不应该是一个微服务的责任。

    前段时间我读了很多关于Blue/Green部署和DB迁移的文章,我们的最终决定是在需要时触发DB迁移。

    我现在没有链接,但它们很容易谷歌搜索。

    我提到了蓝/绿部署,因为基于微服务的方法和容器使它变得更简单,所以如果你正朝着这个方向前进,你可能应该考虑蓝/绿部署,如果你决定从容器运行迁移,这将更加困难。

    您还可以考虑实现一些类似断路器的方法,以便在出现数据库模式问题时,微服务将停止访问数据库。

    沈宏朗
    2023-03-14

    您需要使用能够支持数据库迁移的工具。我在Java领域推荐的两个是:

    • 液化酶
    • 飞机跑道

    这些绝不是这个类别中唯一的工具。它们所做的是记录已经应用到您的数据库实例的模式更改,确保模式与您的版本管理系统中捕获的所需状态相匹配。

    • 为不同数据库生成脚本的最佳选择
     类似资料:
    • 问题内容: 我正在使用Docker,并且拥有PHP,MySQL,Apache和Redis的堆栈。我现在需要添加MongoDB,因此我正在检查Dockerfile中的最新版本以及MongoDB Dockerhub中 的docker- entrypoint.sh 文件,但是我找不到设置默认数据库,管理员用户/密码以及可能进行身份验证的方法文件中容器的方法。 在MySQL中,您可以设置一些ENV变量,例

    • 这更多的是一个系统设计问题。 让我们假设我有一个微服务体系结构,我有X个实例(用于负载平衡对服务的HTTP请求)。但是,也是Kafka主题的消费者。如何避免将同一消息处理X次(X是的实例数)<如果处理是幂等的,至少一次就可以了。它不需要是,但不能是。 服务A可以是订单服务。它生成关于用户向订单主题下单的消息。 服务B可以是支付服务。它使用订单主题中的消息向用户收费。 支付订单可能是幂等操作。但是,

    • testcontainers oracleContainer在Dokerfile中定义的entrypoint发生更改之前启动,以完成并创建测试所需的用户。 容器运行后,将执行一些sql脚本创建表并用数据填充表。这些脚本失败,因为脚本中提到的用户尚未创建。 testcontainers没有等待完成安装。 通过使用以下命令检查日志: 我可以看到testcontainers从不等待它完成。 关于这个“b

    • 我想在Docker容器中启动两个不同的服务,并在其中一个退出后立即退出容器。我查看了supervisor,但找不到如何让它在一个托管应用程序退出后立即退出。它试图重启它们多达三次,就像标准设置一样,然后什么也不做。主管是否能够做到这一点,或者是否有其他工具可以做到这一点?如果还有一种方法可以让两个托管程序都写入到stdout,并标记它们的应用程序名,则会有好处,例如:

    • 我正在使用Spark,Flink创建流式分析应用程序 我在简单的Scala应用程序中完美地运行Spark/Flink作业,并通过Spark提交此作业 如何整合我的Spark 到目前为止,我尝试了Lagom Microservice,但我发现了很多问题,您可以检查 在Lagom Microservice中摄取流式数据的最佳方法 我认为我没有为流处理微服务应用程序选择正确的方向。正在寻找正确的方向来通

    • 使用 LiquiBase 管理数据库变更 数据库通常不能够与它们支持的应用程序保持同步,从管理方面来讲,将数据库和数据置于一个已知状态是个很大的挑战。在本期的 让开发自动化中,自动化专家 Paul Duvall 演示了如何使用开源的 LiquiBase 数据库迁移工具轻松地处理数据库和应用程序的频繁变更。 在过去几年中,我使用过的大多数应用程序都是需要管理大量数据的企业应用程序。从事这类项目的开发