Elastic Cloud Enterprise 和 Elastic Cloud Hosted 中的自动缩放
首次创建部署时,很难确定数据节点所需的存储空间。同样,也很难确定要为机器学习节点分配多少内存和 CPU。预测未来数周或数月的这些需求更是难上加难。在理想情况下,应合理调整这些资源的大小,既能确保高效的性能和弹性,又能避免额外的成本。自动缩放可以通过随着负载的变化自动调整部署可用的资源来帮助保持这种平衡,从而减少监控和手动干预的需求。
要了解有关配置和管理自动缩放的更多信息,请查看以下章节
您还可以查看我们的自动缩放示例,以及通过 API 创建启用自动缩放的部署的示例请求。
对于新部署,机器学习层默认启用自动缩放。
目前,自动缩放行为如下
数据层
- 每个 Elasticsearch 数据层都会根据可用存储量向上扩展。当检测到需要更多存储空间时,自动缩放将独立扩容各个数据层,以确保您可以继续将更多数据写入热层和内容层,或将数据移动到温层、冷层或冻结层。
- 除了扩容现有数据层外,根据您的索引生命周期管理策略,必要时还会自动添加新的数据层。
- 要控制每个数据层的最大容量并确保其不会扩展到超过特定大小,您可以使用“每个区最大容量”(maximum size per zone)字段。
- 目前暂不支持基于内存或 CPU 的自动缩放以及自动缩容(向下缩放)。如果您想调整数据层的大小以添加更多内存或 CPU,或者删除了数据并希望将其缩容,您可以手动设置每个数据层的“每个区当前容量”。
机器学习节点
- 机器学习节点可以根据已配置的机器学习任务向上或向下缩放。
- 当打开机器学习任务或部署机器学习已训练模型时,如果您的部署中没有机器学习节点,自动缩放机制将自动添加机器学习节点。类似地,在一段时间内没有活动的机器学习任务后,任何已启用的机器学习节点都将自动禁用。
- 要控制机器学习节点的最大容量并确保其不会扩展到超过特定大小,您可以使用“每个区最大容量”字段。
- 要控制机器学习节点的最小容量并确保自动缩放机制不会将机器学习缩减到特定大小以下,您可以使用“每个区最小容量”字段。
- 何时缩放的判断是基于当前配置的机器学习任务和已训练模型的预期内存与 CPU 需求。
对于任何 Elasticsearch 组件,可用区数量都不会受到自动缩放的影响。您始终可以手动设置可用区数量,自动缩放机制会为每个可用区增加或减少容量。
有多个因素决定何时对数据层或机器学习节点进行缩放。
对于数据层,可以在以下情况下触发自动缩放事件
基于对分片当前分配情况以及当前可用存储和缓冲区空间量的评估。
通过 ILM 策略。例如,如果部署仅包含热节点且启用了自动缩放,而 ILM 策略尝试将数据从热节点移动到温节点或冷节点,则系统会自动创建温节点或冷节点。
在机器学习节点上,缩放取决于对当前配置的任务和已训练模型所需内存与 CPU 需求的估计。当新的机器学习任务尝试启动时,它会查找具有足够本地内存和 CPU 容量的节点。如果找不到,它将保持在 opening(正在打开)状态。如果此等待任务超过了机器学习决策器中设置的排队限制,则会请求扩容。反之,随着机器学习任务的运行,其内存和 CPU 使用率可能会降低,或者其他正在运行的任务可能会完成或关闭。在这种情况下,如果资源使用率降低的持续时间超过为 down_scale_delay 设置的值,则会请求缩容。请参阅机器学习决策器了解更多细节。要了解有关机器学习任务的一般信息,请参阅创建异常检测任务。
在高可用部署上,自动缩放事件始终同时应用到每个可用区中的实例,以确保一致性。
如果数据层或机器学习节点扩展到了最大可能容量,您将收到一封电子邮件,并且部署概览页面上也会显示通知,提示您调整自动缩放设置以确保最佳性能。
在 Elastic Cloud Enterprise 部署中,ECE 的 service-constructor 日志中还会发出警告,字段为 labels.autoscaling_notification_type,值为 data-tier-at-limit(针对扩容达到极限的数据层)或 ml-tier-at-limit(针对扩容达到极限的机器学习节点)。警告会在 logging-and-metrics 部署中建立索引,因此您可以利用该事件来配置邮件通知。
以下是自动缩放的已知限制和约束
- 如果集群处于不健康状态或上次 Elasticsearch 计划失败,自动缩放将不会运行。
在 Elastic Cloud Hosted 中,还适用以下额外限制
试用部署不能配置为超出常规试用部署大小限制的自动缩放。当您转换为付费订阅时,每个区的最大容量将自动从试用限制进行提升。
可配置的最大节点数为 32。这意味着自动缩放中的
Maximum size per zone(每个区最大容量)限制为所用实例配置的最大 RAM 容量乘以 32。例如,对于实例配置
aws.es.datahot.c6gd,最大 RAM 容量为 60GB。因此,自动缩放中的Maximum size per zone限制为60GB x 32 = 1.875TB(在 Elastic Cloud 控制台 UI 中显示为1.88TB)。有关更多细节,请参阅限制和已知问题 > 节点数量与容量。
在 Elastic Cloud Enterprise 中,还适用以下额外限制
- 如果通过 Instance Overrides API 为实例设置了实例容量或磁盘配额倍数的覆盖设置,自动缩放将被实质性禁用。建议避免为使用自动缩放的实例调整实例容量或磁盘配额倍数,因为该设置会阻止自动缩放。
要在部署上启用或禁用自动缩放
登录到 Elastic Cloud 控制台 或 ECE Cloud UI。
在主页上找到您的部署。
提示如果您有多个部署,也可以转到 Hosted deployments(托管部署,Elastic Cloud Hosted)或 Deployments(部署,Elastic Cloud Enterprise)页面。在该页面上,您可以按名称、ID 缩小部署范围,或者选择其他几种筛选条件。
选择 Manage(管理)。
- 从导航菜单中选择 Edit(编辑)。
- 使用 Enable Autoscaling for:(启用自动缩放:)下拉菜单,为此部署选择所需的自动缩放配置。
- 选择 Confirm(确认)以使自动缩放更改以及任何其他设置生效。所有计划变更都会显示在部署的 Activity(活动)页面上。
启用自动缩放后,自动缩放节点将根据自动缩放设置调整大小。当前大小显示在部署概览页面上。
禁用自动缩放后,您需要手动调整数据层和机器学习节点的大小。
每个自动缩放设置都配置了默认值。如有必要,您可以按以下方式调整它们
登录到 Elastic Cloud 控制台 或 ECE Cloud UI。
在主页上找到您的部署。
提示如果您有多个部署,也可以转到 Hosted deployments(托管部署,Elastic Cloud Hosted)或 Deployments(部署,Elastic Cloud Enterprise)页面。在该页面上,您可以按名称、ID 缩小部署范围,或者选择其他几种筛选条件。
选择 Manage(管理)。
从导航菜单中选择 Edit(编辑)。
更新数据层
- 使用下拉框将 Maximum size per zone(每个区最大容量)设置为应自动分配给数据层的最大资源量。资源不会扩展到超过此值。
- 您还可以更新 Current size per zone(每个区当前容量)。如果您更新此设置以使其与 Maximum size per zone 相同,数据层将固定在该容量大小。
- 对于热数据层,您还可以调整 Forecast window(预测窗口)。这是评估截至目前的过去存储使用量的时间跨度,用于预测何时需要额外的存储。
- 选择 Save(保存)以将更改应用到您的部署。
更新机器学习节点
- 使用下拉框将 Minimum size per zone(每个区最小容量)和 Maximum size per zone(每个区最大容量)分别设置为应自动分配给节点的最少和最多资源量。分配给机器学习的资源不会超出这些值。如果您将这两个设置设为相同的值,机器学习节点将固定在该容量大小。
- 选择 Save(保存)以将更改应用到您的部署。
在 Elastic Cloud Enterprise 上,系统拥有的部署模板包含所有部署自动缩放设置的默认值。
为了帮助您更好地理解可用的自动缩放设置,本示例介绍了示例 Elastic Cloud Enterprise 或 Elastic Cloud Hosted 部署上的典型自动缩放工作流。
启用自动缩放
在现有部署上,打开部署的 Edit(编辑)页面以查找开启自动缩放的选项。
当您创建新部署时,可以在 Advanced settings(高级设置)下找到自动缩放选项。
确认更改或创建新部署后,系统默认设置的自动缩放将被激活,您可以根据需要进行调整(不过对于大多数使用场景,默认设置通常足够)。
查看并调整数据层上的自动缩放设置
打开部署的 Edit 页面,获取每个 Elasticsearch 数据层的每个区当前容量和最大容量。在本示例中,热数据和内容层具有以下设置
每个区当前容量 每个区最大容量 45GB 存储空间 1.41TB 存储空间 1GB RAM 32GB RAM 最高 2.5 vCPU 5 vCPU 数据层的容错能力设置为 2 个可用区。
使用下拉框调整数据层的当前和/或最大容量。根据过去和现在的存储使用情况,在需要时将向热内容和数据层添加容量,直到达到每个区最大容量。任何缩放事件都会在各个可用区之间同时应用。在本例中,相对于其当前大小,该层有充足的扩展空间,并且不会扩展到超过最大容量设置。由于数据层目前不支持向下缩容,因此没有最小容量设置。
查看并调整机器学习实例上的自动缩放设置
在部署的 Edit 页面中,您可以检查部署的机器学习实例的最小和最大容量。在本示例中,机器学习实例具有以下设置
每个区最小容量 每个区最大容量 1GB RAM 64GB RAM 0.5 vCPU 最高至 8 vCPU 32 vCPU 机器学习实例的容错能力设置为 1 个可用区。
使用下拉框调整最小和/或最大容量。将根据需要向机器学习实例添加或从中移除容量。是否需要进行缩放事件取决于当前配置的机器学习任务的预期内存和 vCPU 需求。任何缩放事件都会在各可用区之间同时应用。请注意,与数据层不同,机器学习节点没有 Current size per zone(每个区当前容量)设置。不需要该设置,因为机器学习节点同时支持向上扩容和向下缩容。
随着时间的推移,部署中的数据量和任何机器学习任务的大小可能会增长。假设为了满足存储需求,您的热数据层已扩容至允许的最大尺寸 64GB RAM 和 32 vCPU。此时,部署概览页面上会出现一条通知,指示该层已扩展至最大容量。
如果您预计存储、内存或 vCPU 需求将继续增加,您可以使用 Maximum size per zone 下拉框适当地调整数据层和机器学习实例的最大容量设置。而且,如果需求发生改变,您随时可以重新向下调整这些级别。
正如您所看到的,自动缩放大大减少了管理部署涉及的手动工作。部署容量在您定义的边界内根据需求变化自动调整。请查看我们的主部署自动缩放页面以了解更多信息。
本示例演示如何使用 Elastic Cloud RESTful API 创建已启用自动缩放的部署。
示例部署包含热数据和内容层、温数据层、冷数据层以及机器学习节点,所有这些组件都将在定义的参数范围内进行缩放。要了解自动缩放设置,请查看部署自动缩放和自动缩放示例。
要了解有关 Elastic Cloud Enterprise API 的更多信息,请参阅 RESTful API 文档。有关 Elastic Cloud Hosted API 的详细信息,请查看 RESTful API。
运行此 API 请求时,请注意以下要求
请求中必须包含所有 Elasticsearch 组件,即使它们未启用(即,容量大小为零)。本示例包含了所有组件。
该请求需要支持数据层的格式。具体来说,所有 Elasticsearch 组件都必须包含以下属性
idnode_attributesnode_roles
必须根据以下规则指定
size、autoscaling_min和autoscaling_max属性。这是因为- 目前在数据层上仅支持向上扩容。
- 在机器学习节点上同时支持向上扩容和向下缩容。
- 目前在所有其他组件上均不支持自动缩放。
在 Elastic Cloud Enterprise 上,2.12 及以上版本的自定义部署模板支持自动缩放。要了解更多信息,请参阅更新自定义模板以支持
node_roles和自动缩放。
size |
autoscaling_min |
autoscaling_max |
|
|---|---|---|---|
| 数据层 | ✓ | ✕ | ✓ |
| 机器学习节点 | ✕ | ✓ | ✓ |
| 协调节点和主节点 | ✓ | ✕ | ✕ |
| Kibana | ✓ | ✕ | ✕ |
| APM | ✓ | ✕ | ✕ |
✓ = 包含该属性。
✕ = 不包含该属性。
这些规则与 Elastic Cloud Hosted 和 Elastic Cloud Enterprise 用户控制台的行为相匹配。
elasticsearch对象必须包含属性"autoscaling_enabled": true。
虽然自动缩放可以根据 CPU 对某些层进行缩放,但层容量的主要衡量标准是内存。对层容量的限制是以内存为单位的。
运行此示例 API 请求以创建启用自动缩放的部署
本页上的 curl 示例使用 HTTPS。如果远程端点使用的是非公信的证书(例如由私有 CA 或公司 CA 签发的证书),请使用 --cacert /path/to/ca.pem 提供相应的 CA 证书,以便 curl 可以验证它。有关更多细节,请参阅管理安全证书。
仅用于测试时,您可以使用 --insecure(或 -k)跳过证书验证。此标志会关闭 TLS 信任检查,不应在生产环境中使用。
curl -X POST -H "Authorization: ApiKey $ECE_API_KEY" https://$COORDINATOR_HOST:12443/api/v1/deployments -H 'content-type: application/json' -d '
{
"name": "my-first-autoscaling-deployment",
"resources": {
"elasticsearch": [
{
"ref_id": "main-elasticsearch",
"region": "ece-region",
"plan": {
"autoscaling_enabled": true,
"cluster_topology": [
{
"id": "hot_content",
"node_roles": [
"master",
"ingest",
"remote_cluster_client",
"data_hot",
"transform",
"data_content"
],
"zone_count": 1,
"elasticsearch": {
"node_attributes": {
"data": "hot"
},
"enabled_built_in_plugins": []
},
"instance_configuration_id": "data.default",
"size": {
"value": 4096,
"resource": "memory"
},
"autoscaling_max": {
"value": 2097152,
"resource": "memory"
}
},
{
"id": "warm",
"node_roles": [
"data_warm",
"remote_cluster_client"
],
"zone_count": 1,
"elasticsearch": {
"node_attributes": {
"data": "warm"
},
"enabled_built_in_plugins": []
},
"instance_configuration_id": "data.highstorage",
"size": {
"value": 0,
"resource": "memory"
},
"autoscaling_max": {
"value": 2097152,
"resource": "memory"
}
},
{
"id": "cold",
"node_roles": [
"data_cold",
"remote_cluster_client"
],
"zone_count": 1,
"elasticsearch": {
"node_attributes": {
"data": "cold"
},
"enabled_built_in_plugins": []
},
"instance_configuration_id": "data.highstorage",
"size": {
"value": 0,
"resource": "memory"
},
"autoscaling_max": {
"value": 2097152,
"resource": "memory"
}
},
{
"id": "coordinating",
"node_roles": [
"ingest",
"remote_cluster_client"
],
"zone_count": 1,
"instance_configuration_id": "coordinating",
"size": {
"value": 0,
"resource": "memory"
},
"elasticsearch": {
"enabled_built_in_plugins": []
}
},
{
"id": "master",
"node_roles": [
"master"
],
"zone_count": 1,
"instance_configuration_id": "master",
"size": {
"value": 0,
"resource": "memory"
},
"elasticsearch": {
"enabled_built_in_plugins": []
}
},
{
"id": "ml",
"node_roles": [
"ml",
"remote_cluster_client"
],
"zone_count": 1,
"instance_configuration_id": "ml",
"autoscaling_min": {
"value": 0,
"resource": "memory"
},
"autoscaling_max": {
"value": 2097152,
"resource": "memory"
},
"elasticsearch": {
"enabled_built_in_plugins": []
}
}
],
"elasticsearch": {
"version": "9.4.4"
},
"deployment_template": {
"id": "default"
}
},
"settings": {
"dedicated_masters_threshold": 6
}
}
],
"kibana": [
{
"ref_id": "main-kibana",
"elasticsearch_cluster_ref_id": "main-elasticsearch",
"region": "ece-region",
"plan": {
"zone_count": 1,
"cluster_topology": [
{
"instance_configuration_id": "kibana",
"size": {
"value": 2048,
"resource": "memory"
},
"zone_count": 1
}
],
"kibana": {
"version": "9.4.4"
}
}
}
],
"apm": [
{
"ref_id": "main-apm",
"elasticsearch_cluster_ref_id": "main-elasticsearch",
"region": "ece-region",
"plan": {
"cluster_topology": [
{
"instance_configuration_id": "apm",
"size": {
"value": 512,
"resource": "memory"
},
"zone_count": 1
}
],
"apm": {
"version": "9.4.4"
}
}
}
],
"enterprise_search": []
}
}
'
curl -XPOST \
-H 'Content-Type: application/json' \
-H "Authorization: ApiKey $EC_API_KEY" \
"https://api.elastic-cloud.com/api/v1/deployments" \
-d '
{
"name": "my-first-autoscaling-deployment",
"resources": {
"elasticsearch": [
{
"ref_id": "main-elasticsearch",
"region": "us-east-1",
"plan": {
"autoscaling_enabled": true,
"cluster_topology": [
{
"id": "hot_content",
"node_roles": [
"remote_cluster_client",
"data_hot",
"transform",
"data_content",
"master",
"ingest"
],
"zone_count": 2,
"elasticsearch": {
"node_attributes": {
"data": "hot"
},
"enabled_built_in_plugins": []
},
"instance_configuration_id": "aws.data.highio.i3",
"size": {
"resource": "memory",
"value": 8192
},
"autoscaling_max": {
"value": 118784,
"resource": "memory"
}
},
{
"id": "warm",
"node_roles": [
"data_warm",
"remote_cluster_client"
],
"zone_count": 2,
"elasticsearch": {
"node_attributes": {
"data": "warm"
},
"enabled_built_in_plugins": []
},
"instance_configuration_id": "aws.data.highstorage.d3",
"size": {
"value": 0,
"resource": "memory"
},
"autoscaling_max": {
"value": 118784,
"resource": "memory"
}
},
{
"id": "cold",
"node_roles": [
"data_cold",
"remote_cluster_client"
],
"zone_count": 1,
"elasticsearch": {
"node_attributes": {
"data": "cold"
},
"enabled_built_in_plugins": []
},
"instance_configuration_id": "aws.data.highstorage.d3",
"size": {
"value": 0,
"resource": "memory"
},
"autoscaling_max": {
"value": 59392,
"resource": "memory"
}
},
{
"id": "coordinating",
"zone_count": 2,
"node_roles": [
"ingest",
"remote_cluster_client"
],
"instance_configuration_id": "aws.coordinating.m5d",
"size": {
"value": 0,
"resource": "memory"
},
"elasticsearch": {
"enabled_built_in_plugins": []
}
},
{
"id": "master",
"node_roles": [
"master"
],
"zone_count": 3,
"instance_configuration_id": "aws.master.r5d",
"size": {
"value": 0,
"resource": "memory"
},
"elasticsearch": {
"enabled_built_in_plugins": []
}
},
{
"id": "ml",
"node_roles": [
"ml",
"remote_cluster_client"
],
"zone_count": 1,
"instance_configuration_id": "aws.ml.m5d",
"autoscaling_min": {
"value": 0,
"resource": "memory"
},
"autoscaling_max": {
"value": 61440,
"resource": "memory"
},
"elasticsearch": {
"enabled_built_in_plugins": []
}
}
],
"elasticsearch": {
"version": "7.11.0"
},
"deployment_template": {
"id": "aws-io-optimized-v2"
}
},
"settings": {
"dedicated_masters_threshold": 6
}
}
],
"kibana": [
{
"elasticsearch_cluster_ref_id": "main-elasticsearch",
"region": "us-east-1",
"plan": {
"cluster_topology": [
{
"instance_configuration_id": "aws.kibana.r5d",
"zone_count": 1,
"size": {
"resource": "memory",
"value": 1024
}
}
],
"kibana": {
"version": "7.11.0"
}
},
"ref_id": "main-kibana"
}
],
"apm": [
{
"elasticsearch_cluster_ref_id": "main-elasticsearch",
"region": "us-east-1",
"plan": {
"cluster_topology": [
{
"instance_configuration_id": "aws.apm.r5d",
"zone_count": 1,
"size": {
"resource": "memory",
"value": 512
}
}
],
"apm": {
"version": "9.4.4"
}
},
"ref_id": "main-apm"
}
],
"enterprise_search": []
}
}
'