Kubernetes多个数据库实例或HA单个实例

时间:2018-08-12 18:55:22

标签: mysql database kubernetes high-availability statefulset

我有一个运行multipe应用程序(服务)的Kubernetes环境。现在,我有点困惑如何设置MySQL数据库实例。

根据不同的来源,每个微服务都应该有自己的数据库。我应该在HA模式下创建一个运行多个数据库的MySQL状态集还是为每个运行一个数据库的应用程序(服务)部署一个单独的MySQL实例。

我的第一个想法将是第一个选择,因此HA在其他方面应该有用吗?希望听到一些与此不同的看法。

1 个答案:

答案 0 :(得分:5)

有点主观的问题,但这是我们设置的内容。希望这可以帮助您建立案例。我敢肯定有人会有不同的看法,这也许同样有效:

我们部署了大约70个微服务,每个微服务都有自己的数据库(“架构”)和自己的JDBC URL(通过服务定义)。每个微服务都有其自己的端点和凭据,我们不会在微服务之间共享这些凭据。因此,实际上,就模式而言,我们一直使设计在微服务之间完全独立。

但是,在部署方面,我们选择使用单个数据库实例来托管所有数据库(或“方案”)。从技术上讲,我们可以将每个数据库部署在其自己的数据库实例上,但出于以下几个主要原因,我们选择不这样做:

  1. 成本开销:为每个微服务运行单独的数据库实例将增加很多“固定”成本。如果您只是将数据库作为MySQL Docker容器启动(我们使用单独的数据库服务,例如RDS或Google Cloud SQL),则这可能与您没有直接关系。但是即使在将MySQL作为Docker容器的情况下,例如,如果每个微服务运行70个单独的容器,您可能最终也要付出不小的代价。
  2. 管理开销:鉴于数据库通常涉及很多(磁盘空间,IIOP,备份/归档,清除,升级和其他管理活动),它们具有单独的数据库实例-或Docker容器实例- -可能会对您的管理员或运营团队造成重大损失,尤其是在您拥有大量微服务的情况下
  3. 安全性:对于安全性而言,数据库通常也很关键,因为“真相”通常会进入数据库。不考虑加密,TLS配置和凭据的强度(无论部署模式如何,它们都至关重要),如果数据库实例太多,安全性考虑,检查,审核和日志记录将带来重大挑战。
  4. 易于开发:在总体规划中相对不太重要,但仍然很重要。除非您正在考虑提出不同的开发模型(从而打破“ dev-prod奇偶校验”),否则开发人员可能很难找出数据库端点进行调试,即使他们一次只需要该信息也是如此。 -一会儿。

因此,我的建议是使用单个数据库实例(Docker或其他),但保持数据库/方案完全独立,并且除“所有者”微服务外,任何微服务都无法访问。

如果要将MySQL部署为Docker容器,请使用StatefulSet来保持持久性。定义一个外部pvc,以便您可以始终保存数据,无论吊舱甚至集群发生什么情况。当然,如果您运行“主动-主动”,则需要确保节点之间的集群,但是我们确实在“主动-被动”模式下运行它,因此我们仅将replica的计数保持为1在我们的测试环境中使用MySQL Docker容器替代方案,以节省不需要的外部DBaaS服务的成本。