我有一个运行多个应用程序(服务(的 Kubernetes 环境。现在我有点困惑如何设置 MySQL 数据库实例。
根据不同的来源,每个微服务都应该有自己的数据库。我应该在运行多个数据库的 HA 模式下创建单个 MySQL 状态集,还是应该为每个运行一个数据库的应用程序(服务(部署一个单独的 MySQL 实例。
我的第一个想法是第一个选择,因此HA应该在哪里有用?想听听对此的一些不同看法。
有点主观的问题,但这是我们的设置。希望这能帮助您建立一个案例。我相信有人会有不同的意见,这可能也同样有效:
我们部署了大约 70 个微服务,每个微服务都有自己的数据库("模式"(和自己的 JDBC URL(通过服务定义(。每个微服务都有自己的终结点和凭据,我们不会在微服务之间共享这些终结点和凭据。因此,实际上,就架构而言,我们保持了设计在微服务中完全独立。
但是,在部署方面,我们选择使用单个数据库实例来托管所有数据库(或"模式"(。虽然从技术上讲,我们可以将每个数据库部署在其自己的数据库实例上,但我们选择不这样做有几个主要原因:
成本- 开销:为每个微服务运行单独的数据库实例会增加大量"固定"成本。如果您只是将数据库作为 MySQL Docker 容器启动(我们使用单独的数据库服务,例如 RDS 或 Google Cloud SQL(,这可能与您没有直接关系。但是,即使在MySQL作为Docker容器的情况下,如果您运行70个单独的容器,例如,每个微服务一个,您最终也可能会产生不平凡的成本。 管理
- 开销:鉴于数据库通常涉及大量事务(磁盘空间、IIOP、备份/归档、清除、升级和其他管理活动(,拥有单独的数据库实例(或 Docker 容器实例(可能会给您的管理员或运营团队带来重大损失,尤其是在您有大量微服务的情况下 安全性
- :在安全性方面,数据库通常也至关重要,因为"真相"通常在数据库中。如果数据库实例过多,将加密、TLS 配置和凭据的优势放在一边(因为无论您的部署模型如何,它们都应该至关重要(、安全注意事项、审查、审核和日志记录将带来重大挑战。
- 易于开发:在宏伟的计划中相对不那么重要,但仍然很重要。除非您正在考虑提出不同的开发模型(从而打破"dev-prod 奇偶校验"(,否则您的开发人员可能很难找出用于调试的数据库端点,即使他们只是偶尔需要该信息。
因此,我的建议是使用单个数据库实例(Docker或其他实例(,但保持数据库/模式完全独立,并且除了"所有者"微服务之外的任何微服务都无法访问。
如果要将 MySQL 部署为 Docker 容器,请使用持久性StatefulSet
。定义外部pvc
以便无论 Pod 甚至集群发生什么情况,您都可以始终保留数据。当然,如果您运行"主动-主动",则需要确保节点之间的集群,但我们确实在"主动-被动"模式下运行它,因此我们将replica
计数保持在 1,因为我们只在测试环境中使用 MySQL Docker 容器替代方案,以节省不需要的外部 DBaaS 服务的成本。