有状态集最佳实践的动态扩展

Posted

技术标签:

【中文标题】有状态集最佳实践的动态扩展【英文标题】:Dynamic scaling for statefulset best practices 【发布时间】:2020-11-14 02:57:48 【问题描述】:

背景

我的应用程序使用分片 mongodb 和 elasticsearch statefulsets 在 kubernetes 集群中运行。我为我的应用程序中的部署组件设置了水平 pod 自动缩放器,一切正常。

问题

流量增加时会出现问题。我的服务器部署可以很好地扩展,但是 mongodb 分片和弹性搜索节点无法处理这么多的流量并限制整体响应时间。

简单的解决方案是为这些 statefulset 配置更多的分片、更多的副本。让我烦恼的是,每天 3-4 小时的流量高峰会发生,因此让所有这些男孩一整天都无所事事地坐着有点浪费。

我做了一些研究,看起来数据库一般不应该动态扩展/扩展,因为它会消耗大量的网络和磁盘 io 只是为了在它们之间进行复制。此外,在纵向扩展和缩减过程中还存在数据丢失和不一致的可能性。

问题

如果可能,在 mongodb、elasticsearch 和一般数据库中处理动态缩放的正确方法是什么? 如果没有,我可以做些什么来节省我的云费用,因为我们每天只需要数据库 pod 的最大功率。

【问题讨论】:

我想 MongoDB/Elasticsearch Operators 有扩展 Statefulsets 的机制。我没有这方面的经验,但我会查看这些运营商支持的自定义资源以确定它们提供的功能。 【参考方案1】:

您应该阅读有关 Kubernetes 自动缩放的信息 - HPA。

Horizo​​ntal Pod Autoscaler 会根据观察到的 CPU 利用率(或者,通过自定义指标支持,根据其他一些应用程序提供的指标)自动扩展复制控制器、部署、副本集或有状态集中的 pod 数量。请注意,Pod 水平自动缩放不适用于无法缩放的对象,例如 DaemonSet。

Horizo​​ntal Pod Autoscaler 被实现为 Kubernetes API 资源和控制器。资源决定了控制器的行为。控制器会定期调整复制控制器或部署中的副本数量,以将观察到的平均 CPU 利用率与用户指定的目标相匹配。

使用 HPA,您还应该注意卷安装和数据延迟。


正如 @Serge 在 cmets 中提到的,我建议检查 MongoDB 和 Elasticsearch 本身提供的本机扩展集群选项。

看看

MongoDB 运算符documentation Elasticsearch 运算符documentation Elasticsearch 未来版本autoscaling

我对 MongoDB 和 Kubernetes 的 Elasticsearch 不是很熟悉,但也许这些教程对你有帮助:

https://medium.com/faun/scaling-mongodb-on-kubernetes-32e446c16b82 https://www.youtube.com/watch?v=J7h0F34iBx0 https://kubernetes.io/blog/2017/01/running-mongodb-on-kubernetes-with-statefulsets/ https://sematext.com/blog/elasticsearch-operator-on-kubernetes/#toc-what-is-the-elasticsearch-operator-1

如果您使用helm,请查看banzaicloud Horizontal Pod Autoscaler operator

您可能不想也不能仅仅为了添加自动缩放功能而编辑 Helm 图表。几乎所有图表都支持自定义注释,因此我们认为,只需在部署中添加一些简单的注释即可设置自动缩放。

我们开源了一个 Horizo​​ntal Pod Autoscaler 算子。如果您提供正确的自动缩放注释,此运算符会监视您的 Deployment 或 StatefulSet 并自动创建 Horizo​​ntalPodAutoscaler 资源。


希望你觉得这很有用。

【讨论】:

以上是关于有状态集最佳实践的动态扩展的主要内容,如果未能解决你的问题,请参考以下文章

使用程序集属性的最佳实践是啥?

哪种子集化方法是最佳实践? [复制]

BigQuery AEAD 功能的密钥集管理最佳实践 [关闭]

在 CodeIgniter 中处理动态内容(最佳实践)

django 设计模式/最佳实践:过滤查询集

ASP.NET 应用程序可伸缩性最佳实践指南