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

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

这意味着有这些要求:

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

这导致我处理模式创build和迁移的问题:

  1. 如果我有一个使用MySQL或Postgres作为数据存储的服务,如何在首次启动时创build表/模式? 我应该只使用CREATE IF NOT EXIST语句,让实例在启动时“打出来”? 我无法设置一个环境variables来为实例中的一个请求创build表/模式。

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

您需要使用能够支持数据库迁移的工具。 我build议在Java空间的两个将是:

  • liquibase
  • 飞路

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


  • 为不同数据库生成脚本的最佳select

我个人认为DB迁移不应该成为微服务的责任。

前段时间我读了很多关于蓝/绿部署和数据库迁移的内容,最后的决定是在需要时触发数据库迁移。

我现在没有链接,但它们很容易被使用。

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

您也可以考虑实施一些类似断路器的方法,这样微型服务将在数据库模式问题的情况下停止访问数据库。