在某种程度上,你的需要改善数据库性能可能会遇到一个阈值,优化和调优不再足够了。如果你不能改变数据库引擎,可以不再为工作负载调优参数,您需要使用扩展。
众所周知,比例可以是垂直或水平。垂直扩展意味着单个节点添加更多的资源。通常不相关的数据库架构以任何特殊的方式——你只使用更快的存储(与更好的i / o容量驱动器)或使用不同的存储在不同的分区,等。相反,水平扩展(添加和删除节点)都是关于分布式数据库。
所以我们可以说,垂直扩展主要是特定于节点,和水平扩展是特定于数据库架构。这就是为什么我们要处理这篇文章的水平扩展。
水平扩展问题尤为严重的主流数据库管理系统最初设计为单节点用法:存储和计算负载不隔离,通过几个完整的冗余和集群维护相同的数据的副本。
自动化这增添了更多的复杂性,因为数据库前要向外扩展的实际负载的增加和扩展,当负荷降低。
在多大程度上是可能的自动化水平扩展MongoDB, MySQL和PostgreSQL数据库在Kubernetes,你怎么做?我们试着找到答案。
在进入实用的解决方案之前,我们应该记得一些理论:
- 如何规模在回顾了数据库读写请求,以及为什么他们应该分开了吗?
- 的可能性来自动化这些尺度是什么?
扩展写道
数据库的性质扩展分为两个不同的部分:扩展和读取写道。
通常,当改变数据库引擎和调优的范围,写请求不明显可伸缩在关系数据库中,您仍需要编写数据集群中的每个节点。规模水平写的唯一方法是使用数据库碎片当数据跨多个数据库实例,有一些额外的组件,重定向查询需要的实例。
如果你有规模写道,但是数据库引擎变化,调优,和分片不认为,你是垂直扩展节点资源有限。分片可以从几个方面来实现:它可以支持一个特定的本地数据库管理系统;如果没有本地支持,可能会有一个第三方扩展等功能;最后,您可以在应用程序级别实现手动碎片,分离的部分数据,并使用不同的端点/连接。一般来说,值得选择最简单的可用的方法之一,如果没有额外的考虑。

让我们快速列出所有的可能性。
在MongoDB分片是最简单的,因为它是一个本地特性的数据库。Kubernetes, MongoDB支持分片Percona Kubernetes运营商在MongoDB 雷竞技下载官网Percona分布环境中。你可以找到启用这个特性的信息在这里。
在MySQL中切分目前有几个实现:
- 自动化的实现从维塔斯
- MySQL NDB集群从Oracle
- 手动实现基于ProxySQL查询规则(这篇博客解释如何创建一种原始的分片与几个表和猜测用户的级别的用于写)。
在PostgreSQL分片还可以实现自动或手动。
- 您可以实现分片的Citus PostgreSQL扩展(Citus数据背后的公司,2019年被微软收购)。这是一个博客关于数据库分片实施。
- 同样,你可以手动创建一个分片数据库这种方法后,它结合了声明式分区和PostgreSQL对外包装数据。
扩展阅读
当然,切分也帮助很多扩展阅读,但在许多情况下,分片并不是强制的,如果你只需要读没有扩展写。扩展阅读可以与不同的缓存技术。但这是可以做到的更简单:您可以读取通过增加副本数量和规模读写分离。
在MongoDB读写分离可以通过以下方式:
- 由数据库驱动程序如果分片是关闭的,
- 蒙戈如果分片。
如果你使用标准的MongoDB的司机,你已经分裂(只是选择了二次,secondaryPreferred,或最近的阅读的偏好而不是默认的主要一个);你甚至可以控制写问题。
在MySQL读写分离可以做如下:
- 与ProxySQL,
- 在应用程序级别(只使用两个端点,一个写,一个用于读取HAProxy前面的数据库)。
读和写在PostgreSQL分裂:
- 由数据库驱动程序——但不是所有PostgreSQL驱动程序支持读写分离:例如:libpq(本机PostgreSQL驱动)支持它,但是node-postgres(NodeJS应用程序驱动)没有。
- 如果你的PostgreSQL驱动程序不支持分裂,分裂的读和写Pgpool代理。
- 你也可以做不同的连接在应用程序中读取和写入。
自动定量读取
我们如何为读请求做水平扩展?
当你增加的数量在您的集群成员,应该做一个备份,一个成员发送这个备份到一个新的成员,这个备份和恢复(至少,这是目前Kubernetes数据库怎么做)。
例如,您已经配置了reads-writes分裂,你有两个成员的集群。当你规模为3个成员,经历的读性能大量减少(两次当由Kubernetes运营商,因为从捐赠者将路由连接),直到你完成备份保存过程。备份恢复完成后,你会得到实际的读性能增加。
注意:当然你可以调整连接来获得显著的性能降低,但在这种情况下,它将需要更长的时间,直到数据库达到目标业绩,你可能需要尽快。
这就是为什么我们不能自动基于规模超过当前生产力的两名成员。我们应该提前集群规模。但是你可以提前预测你的负载只有你知道将会有一个峰值负载在一些特定的时间,所以你可以扩展之前这一刻。

所以,只有计划的扩展是有意义的。
卧式自动定量——Kubernetes方式
如果你使用一个专用的操作与数据库集群等雷竞技下载官网Percona Kubernetes运营商为Percona XtraDB集群,比例可以更简化。让我们看看一个例子做了MySQL集群管理的Percona XtraDB集群运营商。雷竞技下载官网
你可以扩展集群使用下面的命令:
|
1
|
kubectl
规模
- - -
副本
=
5
pxc
/
cluster1
|
注意:确保kubectl规模命令支持的操作符使用,如果有的话。例如,Percona Xt雷竞技下载官网raDB集群运营商支持它只有在per-namespace / non-clusterwide模式,从1.8.0版开始,和其他一些运营商可能缺乏这一特性。此外,这是一个好主意请参考运营商文档任何scaling-related细节可能会影响自动定量。例如,Percona XtraDB 雷竞技下载官网Percona服务器集群算子和Percona算子对MongoDBallowUnsafeConfigurations打开选项,该选项应该防止操作员改变实例的数量安全的默认值(运营商小心防止所有潜在的不安全的组合,如奇数或偶数的实例,等等,这可能与自动定量冲突)。
最后,如果临时性能下降不是一个问题在你的情况下,您可以尝试使用水平吊舱自动定量将动态数据库集群规模,基于一些指标(如CPU利用率),而不是预定的尺度。雷竞技下载官网Percona XtraDB集群运营商允许你用一个配置类似于下一个:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
apiVersion
:
自动定量
/
v2beta1
类
:
HorizontalPodAutoscaler
元数据
:
的名字
:
cluster1
规范
:
minReplicas
:
3
maxReplicas
:
5
指标
:
- - - - - -
资源
:
的名字
:
cpu
targetAverageUtilization
:
2
类型
:
资源
scaleTargetRef
:
apiVersion
:
pxc
。
雷竞技下载官网
。
com
/
v1
类
:
雷竞技下载官网PerconaXtraDBCluster
的名字
:
cluster1
|
结论
我们已经证明,水平扩展传统数据库分为两个不同的任务:扩展的读和写。规模水平写的唯一方法是使用数据库分片。水平扩展阅读涉及读/写分裂。分片和读/写分裂可以以不同的方式考虑数据库,和一般来说,本机方式实现你选择越少,可能需要更多的努力来把它。
自动定量水平而言,这是一个可能的选项,但比例与临时大性能下降。因此,它通常是有意义的作为scale-on-schedule计划相关负载变化。
最后,Kubernetes可以自动缩放,但是任何数据库相关运营商使用应该检查他们的兼容本地Kubernetes缩放功能。





