读取池自动扩缩功能会根据应用的工作负载需求,在读取池中自动添加或移除读取池节点。
您可以使用以下两种目标指标之一,限制读取池的平均 CPU 利用率或限制允许访问读取池的客户端连接数,从而控制读取池自动扩缩:
- 平均 CPU 利用率:可用于设置您期望的读取池运行时的平均 CPU 使用率。读取池会根据应用的工作负载 CPU 使用情况自动缩容或扩容。
- 平均数据库连接数:用于指定每个节点应服务的平均客户端数据库连接数。读取池会根据客户端连接数自动缩容或扩容。
如需应用这些目标指标,您还必须设置读取池节点数的下限和上限。
如需启用读取池自动扩缩,您可以在实例上配置一个或两个目标指标。如果这两个指标均处于有效状态,Cloud SQL 会应用这两个指标所指示的最大读取池节点数。
下表列出了每个目标指标的限制:
| 目标指标名称 | 限制 | 相关公开指标 |
|---|---|---|
| 平均 CPU 利用率 | 0.1 到 0.9 之间。 | 读取池中读取池各个节点的平均 CPU 利用率 (cloudsql.googleapis.com/database/cpu/utilization)。 |
| 平均数据库连接数 |
10 到 100,000 之间。注意:可接受的最大值与 max_connections 数据库标志设置的最大值相关。
|
表示读取池中各个读取池节点的平均数据库客户端连接数 (cloudsql.googleapis.com/database/network/connections)。
|
当满足调整读取池大小的条件时,您可以在 Google Cloud 控制台中查看读取池自动扩缩操作。在读取池自动扩缩完成之前,对读取池和主实例的所有其他操作都会被阻止。
读取池自动扩缩特征
以下特征适用:
- 缩容操作一次只能移除一个节点。
- 扩容操作可并行添加所需数量的节点。
- 默认情况下,系统会同时应用缩容和扩容操作。您可以选择手动停用缩容操作 (
disableScaleIn),以阻止此类操作。 - 默认情况下,连续的读取池自动扩缩操作之间会应用 600 秒的冷却时间。缩容或扩容都需要至少 60 秒的冷却时间。
- 设置目标指标时,您还必须定义要使用的读取池节点数的最小值 (
minNodeCount) 和最大值 (maxNodeCount)。如果您为现有读取池启用自动扩缩功能,则当前读取池的大小必须在您设置的范围内。
限制
存在以下限制:
- 读取池自动扩缩支持每 24 小时最多执行 10 次自动扩缩操作。
- 如果您想创建新的读取池或扩缩现有读取池,必须等待先前的创建和扩缩操作完成。此限制适用于与读取池关联的操作,以及与同一主实例关联的其他读取池。如果您尝试运行并发操作,可能会收到以下错误消息:
Operation failed because another operation was already in progress.
准备工作
务必完成所有必需的前提步骤,以便创建读取池。
务必使用
gcloud版本 544.0.0 或更高版本。务必使用 Terraform 提供程序版本 7.8.0 或更高版本。
创建启用自动扩缩功能的读取池
如果您为 AVERAGE_CPU_UTILIZATION 指定的目标值为 0.50,系统将向读取池添加或从中移除读取池节点,以使整个读取池的平均 CPU 利用率保持在 0.50 或更低水平。
gcloud
如需创建启用自动扩缩功能的读取池,请运行以下命令:
gcloud sql instances create READ_POOL_NAME \ --tier=MACHINE_TIER --edition=ENTERPRISE_PLUS \ --instance-type=READ_POOL_INSTANCE --node-count=NODE_COUNT \ --database-version=DATABASE_VERSION \ --master-instance-name=PRIMARY_INSTANCE_NAME \ --region=REGION --network=NETWORK_NAME \ --no-assign-ip \ --auto-scale-enabled \ --auto-scale-max-node-count=MAX_NODE_COUNT \ --auto-scale-min-node-count=MIN_NODE_COUNT \ --auto-scale-target-metrics=TARGET_METRIC_1=VALUE_1
替换以下内容:
- READ_POOL_NAME:您要为读取池分配的名称。
- MACHINE_TIER:您要使用的机器层级,例如
db-perf-optimized-N-2。 - NODE_COUNT:您想要的初始读取池节点数。
- DATABASE_VERSION:您要使用的数据库版本,例如
POSTGRES_16。 - PRIMARY_INSTANCE_NAME:您要使用的主实例的名称。
- REGION:您要使用的区域,例如
us-east1。 - NETWORK_NAME:您要使用的网络的名称。
- MAX_NODE_COUNT:您希望读取池使用的读取池节点数上限,例如
5。 - MIN_NODE_COUNT:您希望读取池使用的读取池节点数下限,例如
1。 - TARGET_METRIC_1:您要使用的目标指标,例如以下指标:
AVERAGE_CPU_UTILIZATIONAVERAGE_DB_CONNECTIONS
- VALUE_1:您要为之前指明的目标指标分配的值。例如,对于
AVERAGE_CPU_UTILIZATION目标指标,您可以分配值0.50。
Terraform
如需创建启用自动扩缩功能的读取池,请使用 Terraform 资源。
以下示例包含主实例和读取池的资源。
应用更改
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
- 启动 Cloud Shell。
-
设置要应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf扩展名,例如main.tf。在本教程中,该文件称为main.tf。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade选项:terraform init -upgrade
应用更改
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
删除更改
如需删除更改,请执行以下操作:
- 如需停用防删除保护,请在 Terraform 配置文件中将
deletion_protection参数设置为false。deletion_protection = "false"
- 运行以下命令并在提示符处输入
yes,以应用更新后的 Terraform 配置:terraform apply
-
运行以下命令并在提示符处输入
yes,以移除之前使用 Terraform 配置应用的资源:terraform destroy
REST v1
如需创建启用自动扩缩功能的读取池,请使用 POST 请求和 instances:insert 方法。
在使用任何请求数据之前,请先进行以下替换:
- READ_POOL_NAME:您要为读取池分配的名称。
- REGION:您希望实例所在的区域,例如
us-central1。 - PRIMARY_INSTANCE_ID:您要使用的主实例的 ID。
- PROJECT_ID:您希望读取池所在的项目的 ID,例如
my-project-name。 - DATABASE_VERSION:您要使用的数据库版本,例如
MYSQL_8_0_37。 - MACHINE_TIER:您要使用的机器层级,例如
db-perf-optimized-N-2。 - FULL_NETWORK_NAME:您要使用的网络的名称。
- MAX_NODE_COUNT:您希望读取池使用的读取池节点数上限,例如
10。 - MIN_NODE_COUNT:您希望读取池使用的读取池节点数下限,例如
2。 - TARGET_METRIC_1:您要使用的目标指标,例如
AVERAGE_CPU_UTILIZATION或AVERAGE_DB_CONNECTIONS。 您必须至少定义这两个可用指标中的一个。 - VALUE_1:您要为之前指明的目标指标分配的值。例如,对于
AVERAGE_CPU_UTILIZATION目标指标,您可以分配值0.50。 - NODE_COUNT:您希望读取池最初包含的节点数,例如
3。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances
请求 JSON 正文:
{
"name":"READ_POOL_NAME",
"region":"REGION",
"masterInstanceName":"PRIMARY_INSTANCE_ID",
"project":"PROJECT_ID",
"databaseVersion":"DATABASE_VERSION",
"settings":{
"tier":"MACHINE_TIER",
"edition":"ENTERPRISE_PLUS",
"ipConfiguration":{
"privateNetwork":"FULL_NETWORK_NAME",
"ipv4Enabled": false
},
"readPoolAutoScaleConfig":{
"enabled": true,
"minNodeCount": MIN_NODE_COUNT,
"maxNodeCount": MAX_NODE_COUNT,
"targetMetrics": [
{
"metric":"TARGET_METRIC_1",
"targetValue": VALUE_1
}
]
}
},
"instanceType":"READ_POOL_INSTANCE",
"nodeCount": NODE_COUNT
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/PRIMARY_INSTANCE_ID",
"status": "RUNNING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"startTime": "2023-06-14T18:48:35.499Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "PRIMARY_INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
如需创建启用自动扩缩功能的读取池,请使用 POST 请求和 instances:insert 方法。
在使用任何请求数据之前,请先进行以下替换:
- READ_POOL_NAME:您要为读取池分配的名称。
- REGION:您希望实例所在的区域,例如
us-central1。 - PRIMARY_INSTANCE_ID:您要使用的主实例的 ID。
- PROJECT_ID:您希望读取池所在的项目的 ID,例如
my-project-name。 - DATABASE_VERSION:您要使用的数据库版本,例如
MYSQL_8_0_37。 - MACHINE_TIER:您要使用的机器层级,例如
db-perf-optimized-N-2。 - FULL_NETWORK_NAME:您要使用的网络的名称。
- MAX_NODE_COUNT:您希望读取池使用的读取池节点数上限,例如
10。 - MIN_NODE_COUNT:您希望读取池使用的读取池节点数下限,例如
2。 - TARGET_METRIC_1:您要使用的目标指标,例如以下指标:
AVERAGE_CPU_UTILIZATIONAVERAGE_DB_CONNECTIONS
- VALUE_1:您要为之前指明的目标指标分配的值。在此示例中,为
AVERAGE_CPU_UTILIZATION目标指标分配值0.50。 - NODE_COUNT:您希望读取池最初包含的节点数,例如
3。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances
请求 JSON 正文:
{
"name":"READ_POOL_NAME",
"region":"REGION",
"masterInstanceName":"PRIMARY_INSTANCE_ID",
"project":"PROJECT_ID",
"databaseVersion":"DATABASE_VERSION",
"settings":{
"tier":"MACHINE_TIER",
"edition":"ENTERPRISE_PLUS",
"ipConfiguration":{
"privateNetwork":"FULL_NETWORK_NAME",
"ipv4Enabled": false
},
"readPoolAutoScaleConfig":{
"enabled": true,
"minNodeCount": MIN_NODE_COUNT,
"maxNodeCount": MAX_NODE_COUNT,
"targetMetrics": [
{
"metric":"TARGET_METRIC_1",
"targetValue": VALUE_1
}
]
}
},
"instanceType":"READ_POOL_INSTANCE",
"nodeCount": NODE_COUNT
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/PRIMARTY_INSTANCE_ID",
"status": "RUNNING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"startTime": "2023-06-14T18:48:35.499Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "PRIMARTY_INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
在现有读取池上启用读取池自动扩缩功能
如果您已创建读取池,则可以通过指明要使用的自动扩缩配置来启用自动扩缩。
例如,如果您为 AVERAGE_DB_CONNECTIONS 指定的目标值为 50,系统会向读取池添加节点或从读取池中移除节点,以使整个读取池的平均数据库连接数保持在 50 个或更少。
gcloud
如需在现有读取池上启用自动扩缩功能,请运行以下命令。
gcloud sql instances patch INSTANCE --auto-scale-enabled --auto-scale-max-node-count=MAX_NODE_COUNT --auto-scale-min-node-count=MIN_NODE_COUNT --auto-scale-out-cooldown-seconds=COOLDOWN_SECONDS_SCALE_OUT --auto-scale-in-cooldown-seconds=COOLDOWN_SECONDS_SCALE_IN --auto-scale-target-metrics=TARGET_METRIC_1=VALUE_1
替换以下内容:
- INSTANCE_NAME:与您要修改的读取池关联的实例名称。
- MAX_NODE_COUNT:您希望读取池使用的读取池节点数上限,例如
10。 - MIN_NODE_COUNT:您希望读取池使用的读取池节点数下限,例如
2。 - COOLDOWN_SECONDS_SCALE_OUT:可选:读取池节点创建或删除之间的冷却时间或等待时间(以秒为单位),例如
180。 冷却时间不得短于 60 秒。默认值为 600 秒。 - COOLDOWN_SECONDS_SCALE_IN:可选:读取池节点创建或删除之间的冷却时间或等待时间(以秒为单位),例如
180。 冷却时间不得短于 60 秒。默认值为 600 秒。 - TARGET_METRIC_1:您要使用的目标指标,例如以下指标:
AVERAGE_CPU_UTILIZATIONAVERAGE_DB_CONNECTIONS
- VALUE_1:您要为之前指明的目标指标分配的值。在此示例中,为
AVERAGE_DB_CONNECTIONS目标指标分配值50。
REST v1
如需为现有读取池启用自动扩缩功能,请使用 PATCH 方法。
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号。
- INSTANCE_ID:与读取池关联的实例的 ID。
- MAX_NODE_COUNT:您希望读取池使用的读取池节点数上限,例如
10。 - MIN_NODE_COUNT:您希望读取池使用的读取池节点数下限,例如
2。 - COOLDOWN_SECONDS:可选:读取池节点创建或删除之间的冷却时间或等待时间(以秒为单位),例如
180。 - SCALE_IN_DISABLED:可选:用于停用读取池缩容行为。如需停用读取池缩容,请将值设置为
true。 - TARGET_METRIC_1:您要使用的目标指标,例如以下指标:
AVERAGE_CPU_UTILIZATIONAVERAGE_DB_CONNECTIONS
- VALUE_1:您要为之前指明的目标指标分配的值。在此示例中,为
AVERAGE_DB_CONNECTIONS目标指标分配值50。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{
"settings": {
"readPoolAutoScaleConfig": {
"enabled": true,
"minNodeCount": MIN_NODE_COUNT,
"maxNodeCount": MAX_NODE_COUNT,
"scaleOutCooldownSeconds": COOLDOWN_SECONDS,
"disableScaleIn": SCALE_IN_DISABLED,
"targetMetrics": [
{
"metric": "TARGET_METRIC_1",
"targetValue": VALUE_1
}
]
}
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "RUNNING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"startTime": "2023-06-14T18:48:35.499Z",
"operationType": "UPDATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
如需为现有读取池启用自动扩缩功能,请使用 PATCH 方法。
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号。
- INSTANCE_ID:与读取池关联的实例的 ID。
- MAX_NODE_COUNT:您希望读取池使用的读取池节点数上限,例如
10。 - MIN_NODE_COUNT:您希望读取池使用的读取池节点数下限,例如
2。 - COOLDOWN_SECONDS:可选:读取池节点创建或删除之间的冷却时间或等待时间(以秒为单位),例如
180。 - SCALE_IN_DISABLED:可选:用于停用读取池缩容行为。如需停用读取池缩容,请将值设置为
true。 - TARGET_METRIC_1:您要使用的目标指标,例如以下指标:
AVERAGE_CPU_UTILIZATIONAVERAGE_DB_CONNECTIONS
- VALUE_1:您要为之前指明的目标指标分配的值。在此示例中,为
AVERAGE_DB_CONNECTIONS目标指标分配值50。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{
"settings": {
"readPoolAutoScaleConfig": {
"enabled": true,
"minNodeCount": MIN_NODE_COUNT,
"maxNodeCount": MAX_NODE_COUNT,
"scaleOutCooldownSeconds": COOLDOWN_SECONDS,
"disableScaleIn": SCALE_IN_DISABLED,
"targetMetrics": [
{
"metric": "TARGET_METRIC_1",
"targetValue": VALUE_1
}
]
}
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "RUNNING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"startTime": "2023-06-14T18:48:35.499Z",
"operationType": "UPDATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
在读取池上停用读取池自动扩缩功能
如需停用读取池自动扩缩功能,请完成以下步骤。
gcloud
如需停用读取池自动扩缩功能,请运行以下命令。
gcloud sql instances patch INSTANCE_NAME --no-auto-scale-enabled
替换以下内容:
- INSTANCE_NAME:与您要修改的读取池关联的实例名称。
REST v1
如需停用读取池自动扩缩功能,请使用 PATCH 方法。
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号。
- INSTANCE_ID:与读取池关联的实例的 ID。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{
"settings":{
"readPoolAutoScaleConfig":{
"enabled": false
}
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "RUNNING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"startTime": "2023-06-14T18:48:35.499Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
REST v1beta4
如需停用读取池自动扩缩功能,请使用 PATCH 方法。
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号。
- INSTANCE_ID:与读取池关联的实例的 ID。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{
"settings":{
"readPoolAutoScaleConfig":{
"enabled": false
}
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
"status": "RUNNING",
"user": "user@example.com",
"insertTime": "2020-01-16T02:32:12.281Z",
"startTime": "2023-06-14T18:48:35.499Z",
"operationType": "CREATE",
"name": "OPERATION_ID",
"targetId": "INSTANCE_ID",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
"targetProject": "PROJECT_ID"
}
查看指标
使用系统分析洞见查看读取池的相关指标。
对于 AVERAGE_CPU_UTILIZATION,请参阅 CPU 利用率关键指标图表。
对于 AVERAGE_DB_CONNECTIONS,请参阅连接总数关键指标图表。
监控读取池自动扩缩操作
当满足触发读取池自动扩缩事件的条件时,系统会在实例上运行 UPDATE 操作。您可以在 Google Cloud 控制台中查看此操作。
读取池自动扩缩操作可能需要 10 分钟或更长时间才能应用于实例。现有连接不会转移到新添加的读取池节点,这意味着只有新连接会受到读取池自动扩缩的影响。
在读取池上运行自动扩缩操作期间,您必须等待操作完成,然后才能对读取池或主实例运行其他更新。如果您尝试运行并发请求,可能会收到以下错误消息:
Operation failed because another operation was already in progress.
您可以检查读取池实例,查看节点数的变化:
gcloud sql instances describe READ_POOL_NAME | grep nodeCount
替换以下内容:
- READ_POOL_NAME:您要获取信息的读取池的名称。
系统事件审核日志
您还可以查看与方法 cloudsql.instances.readPoolAutoScale 关联的系统事件审核日志消息,其中包含旧节点数和新节点数。