自动伸缩
伸缩是调整可用资源以满足客户端需求的能力。服务可以通过以编程方式调用 API 或在 UI 上更改设置来手动伸缩系统资源。或者,可以自动伸缩服务以满足应用程序需求。
伸缩仅适用于生产环境层级的服务。开发环境层级的服务不进行伸缩。您可以将服务从开发环境层级升级到生产环境以进行伸缩。一旦开发环境服务升级,就无法降级。
ClickHouse Cloud 中的伸缩工作原理
生产环境服务可以垂直伸缩(通过切换到更大的副本),也可以水平伸缩(通过添加相同大小的副本)。默认情况下,ClickHouse Cloud 生产环境服务在 3 个不同的可用区中运行 3 个副本。垂直伸缩通常有助于需要大量内存来长时间运行插入/读取的查询,而水平伸缩可以帮助并行化以支持并发查询。
目前,ClickHouse Cloud 仅垂直自动伸缩服务。要水平伸缩服务(目前处于私有预览阶段),您需要使用 ClickHouse Cloud 控制台或 Cloud API。要在您的服务上启用水平伸缩,请联系 [email protected],并查看“自助水平伸缩”部分。
垂直自动伸缩
生产环境服务基于 CPU 和内存使用率进行自动伸缩。我们持续监控服务在回顾窗口(跨越过去 30 小时)的历史使用情况,以做出伸缩决策。如果使用率上升到高于或低于某些阈值,我们将适当地伸缩服务以匹配需求。
当 CPU 使用率超过 50-75% 范围内的上限阈值时(实际阈值取决于集群的大小),基于 CPU 的自动伸缩会启动。此时,集群的 CPU 分配将翻倍。如果 CPU 使用率降至上限阈值的一半以下(例如,在 50% 上限阈值的情况下为 25%),则 CPU 分配将减半。
基于内存的自动伸缩将集群伸缩到最大内存使用率的 125%,如果遇到 OOM(内存不足错误),则最多伸缩到 150%。
选择 CPU 或内存建议中较大者,并且分配给服务的 CPU 和内存以 1 个 CPU 和 4 GiB 内存的步长增量同步伸缩。
注意:在当前的实现中,垂直自动伸缩在内存和 CPU 需求缓慢增长的情况下效果良好,并且趋于保守。我们正在努力改进它,使其更具动态性,以便我们更好地处理工作负载突增,为伸缩使用更积极的 CPU/内存阈值,以及使用适当的回顾窗口在两个方向上做出垂直伸缩决策。
配置垂直自动伸缩
具有管理员角色的组织成员可以调整 ClickHouse Cloud 生产环境服务的伸缩。要配置垂直自动伸缩,请转到服务详情页面上的“设置”选项卡,并调整最小和最大内存以及 CPU 设置,如下所示。

将副本的“最大内存”设置为高于“最小内存”的值。然后,服务将在这些范围内根据需要进行伸缩。这些设置在初始服务创建流程中也可用。您的服务中的每个副本都将分配相同的内存和 CPU 资源。
您也可以选择将这些值设置为相同,实际上是将服务固定到特定配置。这样做将立即强制伸缩到您选择的所需大小。重要的是要注意,这将禁用集群上的任何自动伸缩,并且您的服务将不会受到超出这些设置的 CPU 或内存使用量增加的保护。
自助水平伸缩
ClickHouse Cloud 水平伸缩处于私有预览阶段。一旦在服务上启用水平伸缩,您可以使用 ClickHouse Cloud 公共 API,通过更新服务的伸缩设置来伸缩您的服务。
- 如果该功能尚未在服务上启用,则请求将被拒绝,并显示错误“BAD_REQUEST: 您的实例未启用调整副本数”。如果您看到此错误并且您认为伸缩已在您的服务上启用,请联系 ClickHouse Cloud 支持。
- 生产环境 ClickHouse 服务必须至少有 3 个副本。目前,生产环境服务可以扩展到的最大副本数为 20 个。这些限制将随着时间的推移而增加。如果您现在需要更高的限制,请联系 ClickHouse Cloud 支持团队。
- 目前,对于在缩减操作期间正在删除的副本,其系统表数据不会被保留。这可能会影响任何可能正在利用系统表数据的仪表板或其他功能。
通过 API 进行水平伸缩
要水平伸缩集群,请通过 API 发出 PATCH 请求以调整副本数。以下屏幕截图显示了一个 API 调用,将 3 副本集群扩展到 6 副本,以及相应的响应。

更新 numReplicas 的 PATCH 请求

来自 PATCH 请求的响应
如果您在一个伸缩请求正在进行时发出新的伸缩请求或多个连续请求,伸缩服务将忽略中间状态并收敛到最终副本计数。
通过 UI 进行水平伸缩
要从 UI 水平伸缩服务,您可以在“设置”页面上调整服务的节点数。

来自 ClickHouse Cloud 控制台的服务伸缩设置
一旦服务完成伸缩,云控制台中的指标仪表板应显示服务的正确分配。以下屏幕截图显示集群已伸缩到总内存 96 GiB,即 6 个副本,每个副本分配了 GiB 内存。

自动空闲
在“设置”页面中,您还可以选择是否允许在服务处于非活动状态时自动空闲您的服务,如上图所示(即当服务未执行任何用户提交的查询时)。自动空闲降低了您的服务成本,因为在服务暂停时,您无需为计算资源付费。
在某些特殊情况下,例如当服务具有大量 parts 时,服务将不会自动空闲。
服务可能会进入空闲状态,在此状态下,它会暂停可刷新物化视图的刷新、来自 S3Queue 的消费以及新合并的调度。现有合并操作将在服务转换为空闲状态之前完成。为确保可刷新物化视图和 S3Queue 消费的持续运行,请禁用空闲状态功能。
仅当您的用例可以处理响应查询之前的延迟时,才使用自动空闲,因为当服务暂停时,与服务的连接将超时。自动空闲非常适合不经常使用且可以容忍延迟的服务。不建议用于为经常使用的面向客户的功能提供支持的服务。
处理突发性工作负载
如果您预计工作负载即将出现峰值,您可以使用 ClickHouse Cloud API 抢先扩展您的服务以处理峰值,并在需求消退后缩小服务规模。要了解每个副本当前正在使用的 CPU 核心和内存,您可以运行以下查询
SELECT *
FROM clusterAllReplicas('default', view(
SELECT
hostname() AS server,
anyIf(value, metric = 'CGroupMaxCPU') AS cpu_cores,
formatReadableSize(anyIf(value, metric = 'CGroupMemoryTotal')) AS memory
FROM system.asynchronous_metrics
))
ORDER BY server ASC
SETTINGS skip_unavailable_shards = 1