你能在Kubernetes中横向扩展一个运行关系数据库的StatefulSet吗?



为什么我想有我的数据库的多个副本?

  1. 冗余:I have>我的应用程序代码的1副本。为什么?如果一个节点发生故障,另一个节点可以在负载均衡器后面运行时填补它的位置。
  2. Load:负载均衡器可以将流量分配给应用的多个实例。
  3. A/B测试。我可以让一个节点服务一个版本的应用程序,而另一个服务不同的版本。
  4. 维护。我可以关闭一个实例进行维护,并保持另一个实例的运行,没有停机时间。

所以,如果可能的话,我也想对后台数据库做同样的事情。

我意识到许多nosql数据库可以更好地配置为多个实例,但我对关系数据库更感兴趣。

我玩过这样和这样的操作符,但发现文档存在问题,无法使它们启动并运行,并且发现社区有点缺乏。在生产中依赖这种东西让我很紧张。Mysql操作符甚至有一个注释,说它不是用于生产的。

我看到原生k8s的状态集有伸缩性,但是这些文档根本不是针对dbs的。我认为复杂之处在于dbs需要通过卷持久地写入磁盘,并且如果您有多个实例,则必须以某种方式同步和路由数据。

这是我自己做的重要的事情吗?或者,我最好有一个在集群中使用一个副本db映像的开发环境,以便节省账单,而一个使用完全托管db的生产环境,就像这样,为我照顾扩展/HA吗?然后我将使用customize来管理yaml差异。

编辑:

我实际上找到了一个postgres操作符,它工作得很好。按照文档做了一遍,它都工作了,它来自postgres文档。

我创建了这个社区维基答案来总结这个主题,并使相关信息更容易看到。

正如图灵85在评论中提到的:

不要将一个pvc共享给多个db实例。即使使用正确的备份卷(必须是基于对象的存储,才能进行读写操作),如果有足够的可伸缩性,性能也会受到影响(毕竟,所有内容都集中到一个文件系统中,这会给FS带来压力)。正确的方法是配置集群。所有主要的关系数据库(mssql、mysql、postgres、oracle等)都支持集群。但是,为了安全起见,我建议购买可扩展的数据库"即服务"。除非你很清楚自己在做什么。

好的解决方案可能是使用单个副本StatefulSet进行开发,以避免计费,并在prod中使用完全托管的基于云的sql解决方案。除非您具备部署集群dbms的知识或足够专业的操作员。

另一个解决方案可能是像Aaron那样使用不同的操作符:

我实际上找到了一个postgres操作符,它工作得很好。按照文档一遍,它都工作了,它来自postgres: https://www.kubegres.io/doc/getting-started.html

参见同样的问题