在启动容器化的微服务的多个实例时处理数据库模式创build和迁移
我想在Docker容器中部署我的微服务。 我希望这些微服务尽可能无状态,只保持状态到数据库。
这意味着有这些要求:
- 这些服务被部署为docker容器,并使用kubernetes进行编排。
- 每个服务都可以部署并扩展到多个实例。
- 服务的每个实例都是相同的。 这意味着它们都必须具有相同的环境variables和传递给它的configuration。
- 每个实例不应该关心或了解另一个实例。
- 这些情况应该是无国籍的,不应选举领导人或法定人数。
这导致我处理模式创build和迁移的问题:
-
如果我有一个使用MySQL或Postgres作为数据存储的服务,如何在首次启动时创build表/模式? 我应该只使用
CREATE IF NOT EXIST
语句,让实例在启动时“打出来”? 我无法设置一个环境variables来为实例中的一个请求创build表/模式。 -
如何处理具有上述约束的模式迁移? 有许多操作,比如删除/添加无法封装在事务中的列。
您需要使用能够支持数据库迁移的工具。 我build议在Java空间的两个将是:
- liquibase
- 飞路
这些绝不是这一类的唯一工具。 他们所做的是logging已经应用到数据库实例的模式更改,确保模式与您的版本控制系统中捕获的所需状态相匹配。
例
- 为不同数据库生成脚本的最佳select
我个人认为DB迁移不应该成为微服务的责任。
前段时间我读了很多关于蓝/绿部署和数据库迁移的内容,最后的决定是在需要时触发数据库迁移。
我现在没有链接,但它们很容易被使用。
我提到了Blue / Green部署,因为基于微服务的方法和容器使得它更简单,所以如果你正朝着这个方向发展,你可能应该考虑蓝/绿部署,如果你决定从容器中运行迁移将会困难得多。
您也可以考虑实施一些类似断路器的方法,这样微型服务将在数据库模式问题的情况下停止访问数据库。