工作负载管理 - Amazon Redshift

工作负载管理

在 Amazon Redshift 中,您可以使用工作负载管理 (WLM) 来定义可用的查询队列的数量,并定义如何将查询路由至这些队列以进行处理。WLM 是参数组配置的一部分。集群使用其关联的参数组中指定的 WLM 配置。

当您创建参数组时,默认 WLM 配置中包含一个队列,该队列最多可并发运行五个查询。如果您想要更好地控制查询处理,则可以添加更多队列并在每个队列中配置 WLM 属性。除非对其属性进行配置,否则您添加的每个队列都具有相同的默认 WLM 配置。

当您添加更多队列时,配置中的最后一个队列是默认队列。除非根据 WLM 配置中的标准将查询路由至另一个队列,否则该查询将由默认队列进行处理。您可以为默认队列指定模式和并发级别(查询槽),但不能为默认队列指定用户组或查询组。

与其他参数一样,您无法修改默认参数组中的 WLM 配置。与默认参数组相关联的集群始终使用默认的 WLM 配置。要修改 WLM 配置,请创建一个新的参数组,然后将该参数组与需要自定义 WLM 配置的所有集群相关联。

WLM 动态和静态属性

WLM 配置属性可以是动态的,也可以是静态的。您可以将动态属性应用于数据库而无需重新启动集群,但静态属性需要重新启动集群才能够使更改生效。有关静态和动态属性的更多信息,请参阅 WLM 动态和静态配置属性

WLM 配置参数的属性

您可以使用 Amazon Redshift 控制台、AWS CLI、Amazon Redshift API 或 AWS 开发工具包之一配置 WLM。WLM 配置使用多个用于定义队列行为的属性,例如队列之间的内存分配、队列中可以并发运行的查询数量等。

注意

下列属性和其 Amazon Redshift 控制台名称一起显示,具体说明中提供了对应的 JSON 属性名称。

下表总结属性是适用于自动 WLM 还是手动 WLM。

WLM 属性 自动 WLM 手动 WLM
自动 WLM
启用短查询加速
短查询的最大运行时间
优先级
队列类型
队列名称
并发扩展模式
并发
用户组
用户组通配符
查询组
查询组通配符
用户角色
用户角色通配符
超时 已弃用
内存
查询监控规则

下面的列表说明了可以配置的 WLM 属性。

自动 WLM

自动 WLM 设置为 true 以启动自动 WLM。自动 WLM 将主要并发内存(%) 的值设置为 Auto。Amazon Redshift 管理查询并发性和内存分配。默认为 true

JSON 属性:auto_wlm

启用短查询加速

短查询加速 (SQA) 让选定的短时查询优先于长时查询。SQA 在专用空间中执行短时查询,因此 SQA 查询不会被迫排在队列中的长时查询后面等待。使用 SQA,短时查询会更快地开始执行,用户会更快地看到结果。当您启用 SQA 时,还可以为短时查询指定最大运行时间。要启用 SQA,请指定 true。默认为 false。此设置适用于每个参数组,而不是适用于队列。

JSON 属性:short_query_queue

短查询的最大运行时间

当您启用 SQA 时,可以指定 0 以允许 WLM 动态设置短查询的最大运行时间。或者,您也可以指定一个介于 1 到 20 秒之间的值(以毫秒为单位)。默认值为 0

JSON 属性:max_execution_time

优先级

优先级设置队列中运行的查询的优先级。要设置优先级,WLM 模式必须设置为自动 WLM;也即 auto_wlm 必须为 true。优先级值可以是 highesthighnormallowlowest。默认为 normal

JSON 属性:priority

队列类型

队列类型指定自动 WLM手动 WLM 使用的队列。将 queue_type 设置为 automanual。如果未指定,则默认值为 manual

JSON 属性:queue_type

队列名称

队列的名称。可以根据业务需求设置队列的名称。队列名称在 WLM 配置中必须唯一,最多为 64 个字母数字字符、下划线或空格,并且不能包含引号。例如,如果您有一个 ETL 查询队列,则可将该队列命名为 ETL queue。此名称在指标、系统表值和 Amazon Redshift 控制台中用来标识队列。使用这些源中的名称的查询和报表需要能够处理名称的更改。以前,队列名称由 Amazon Redshift 生成。队列的默认名称为 Queue 1Queue 2,依此类推,直至最后一个名为 Default queue 的队列。

重要

如果您更改队列名称,则 WLM 队列指标(例如 WLMQueueLength、WLMQueueWaitTime、WLMQueriesCompletedPerSecond、WLMQueryDuration、WLMRunningQueries 等)的 QueueName 维度值也会发生更改。因此,如果您更改队列的名称,则可能需要更改已设置的 CloudWatch 警报。

JSON 属性:name

并发扩展模式

要在队列上启用并发扩展,请将并发扩展模式设置为 auto。当路由到队列的查询数超过队列的已配置并发数时,符合条件的查询将转到扩展集群。当有槽位可用时,将在主集群上运行查询。默认为 off

JSON 属性:concurrency_scaling

并发

手动 WLM 队列中可以并发运行的查询的数量。此属性仅适用于手动 WLM。如果启用了并发扩展,则当队列达到并发级别(查询槽)时,符合条件的查询将转到扩展集群。如果未启用并发扩展,则查询将在队列中等待,直到有槽位可用。范围介于 1-50 之间。

JSON 属性:query_concurrency

用户组

逗号分隔的用户组名称列表。当用户组成员在数据库中运行查询时,其查询将路由至与相应用户组相关联的队列。

JSON 属性:user_group

用户组通配符

用来指示是否对用户组启用通配符的布尔值。如果该值为 0,则禁用通配符;如果该值为 1,则启用通配符。启用通配符后,您可以在运行查询时使用“*”或“?”指定多个用户组。有关更多信息,请参阅通配符

JSON 属性:user_group_wild_card

查询组

逗号分隔的查询组列表。当查询组成员在数据库中运行查询时,其查询将路由至与相应查询组相关联的队列。

JSON 属性:query_group

Query Group Wildcard

用来指示是否对查询组启用通配符的布尔值。如果该值为 0,则禁用通配符;如果该值为 1,则启用通配符。启用通配符后,您可以在运行查询时使用“*”或“?”指定多个查询组。有关更多信息,请参阅通配符

JSON 属性:query_group_wild_card

用户角色

以逗号分隔的用户角色列表。当具有该用户角色的成员在数据库中运行查询时,其查询将路由至与其用户角色相关联的队列。有关用户角色的更多信息,请参阅基于角色的访问控制 (RBAC)

JSON 属性:user_role

用户角色通配符

用来指示是否对查询组启用通配符的布尔值。如果该值为 0,则禁用通配符;如果该值为 1,则启用通配符。启用通配符后,您可以在运行查询时使用“*”或“?”指定多个查询组。有关更多信息,请参阅通配符

JSON 属性:user_role_wild_card

超时 (ms)

WLM 超时 (max_execution_time) 已弃用。使用自动 WLM 时不可用。相反,使用 query_execution_time 创建查询监控规则 (QMR) 来限制经过的查询执行时间。有关更多信息,请参阅 WLM 查询监控规则

查询在取消之前可以运行的最长时间,以毫秒为单位。在一些情况下,只读查询(例如 SELECT 语句)可能会由于 WLM 超时而取消。在这些情况下,WLM 会尝试根据 WLM 队列分配规则将该查询路由到下一个匹配的队列。如果查询不匹配任何其他队列定义,则取消查询;系统不会将其分配给默认队列。有关更多信息,请参阅 WLM 查询队列跳过。WLM 超时不适用于已进入 returning 状态的查询。要查看查询的状态,请参阅 STV_WLM_QUERY_STATE 系统表。

JSON 属性:max_execution_time

内存(%)

分配给队列的内存百分比。如果您要为至少一个队列指定内存百分比,则必须为所有其他队列指定内存百分比,且所有队列的百分比合计不超过 100%。如果所有队列上的内存分配低于 100%,则未分配的内存将由服务管理。服务可以临时将此未分配内存提供给请求额外内存进行处理的队列。

JSON 属性:memory_percent_to_use

查询监控规则

您可以使用 WLM 查询监控规则,根据标准或谓词持续监控您的 WLM 队列中有无您指定的查询。例如,您可监控倾向于使用额外系统资源的查询,然后在查询超过您指定的性能界限时启动指定的操作。

注意

如果您选择以编程方式创建规则,强烈建议您使用控制台生成包含在参数组定义中的 JSON。

您将一个查询监控规则与特定的查询队列相关联。您可以让每个队列有最多 25 个规则,并且所有队列的总限制为 25 个规则。

JSON 属性:rules

JSON 属性层次结构:

rules rule_name predicate metric_name operator value action value

对于每个规则,您可以指定以下属性:

  • rule_name – 规则名称必须在 WLM 配置中是唯一的。规则名称最多可包含 32 个字母数字字符或下划线,且不能包含空格或引号。

    • predicate – 您最多可以为每个规则设置 3 个谓词。对于每个谓词,指定以下属性。

      • metric_name – 有关指标的列表,请参阅《Amazon Redshift 数据库开发人员指南》中的查询监控指标

      • operator – 操作包括 =<>

      • value – 指定指标的可触发操作的阈值。

  • action – 每个规则都与一个操作相关联。有效的操作是:

    • log

    • hop(仅适用于手动 WLM)

    • abort

    • change_query_priority(仅适用于自动 WLM)

以下示例显示名为 rule_1 的 WLM 查询监控规则的 JSON,带有两个谓词以及操作 hop

"rules": [ { "rule_name": "rule_1", "predicate": [ { "metric_name": "query_execution_time", "operator": ">", "value": 100000 }, { "metric_name": "query_blocks_read", "operator": ">", "value": 1000 } ], "action": "hop" } ]

有关这些属性以及用于配置查询队列的策略的更多信息,请参阅《Amazon Redshift 数据库开发人员指南》中的实施工作负载管理

使用 AWS CLI 配置 WLM 参数

要配置 WLM,您需要修改 wlm_json_configuration 参数。wlm_json_configuration 属性值的最大大小为 8000 个字符。相应值采用 JavaScript 对象表示法 (JSON) 格式。如果您想要使用 AWS CLI、Amazon Redshift API 或其中一个 AWS 开发工具包来配置 WLM,则可以使用此部分的其余内容来了解如何为 wlm_json_configuration 参数构建 JSON 结构。

注意

如果您使用 Amazon Redshift 控制台来配置 WLM,则无需了解 JSON 格式,因为您可以通过控制台轻松添加队列并配置其属性。有关使用控制台配置 WLM 的更多信息,请参阅修改参数组

示例

下面的示例是默认的 WLM 配置,定义了使用自动 WLM 的队列。

{ "auto_wlm": true }

示例

下面的示例是一个自定义 WLM 配置,它定义了一个并发级别(查询槽)为五的手动 WLM 队列。

{ "query_concurrency":5 }

语法

默认的 WLM 配置非常简单,只有一个队列和一个属性。您可以添加更多队列并为 JSON 结构中的每个队列配置多种属性。以下语法表示您用于配置具有多种属性的多个队列的 JSON 结构:

[ { "ParameterName":"wlm_json_configuration", "ParameterValue": "[ { "q1_first_property_name":"q1_first_property_value", "q1_second_property_name":"q1_second_property_value", ... }, { "q2_first_property_name":"q2_first_property_value", "q2_second_property_name":"q2_second_property_value", ... } ... ]" } ]

在上述示例中,以 q1 开头的代表性属性是第一个队列的数组中的对象。其中每个对象都是名称/值对;namevalue 共同设置第一个队列的 WLM 属性。以 q2 开头的代表性属性是第二个队列的数组中的对象。如果您需要更多队列,则可以为每个增加的队列添加另一个数组并为每个对象设置属性。

修改 WLM 配置时,您必须涵盖队列的整个结构,即使您只是想更改队列中的一个属性也是如此。这是因为整个 JSON 结构以字符串的形式传递为 wlm_json_configuration 参数的值。

设置 AWS CLI 命令的格式

使用 AWS CLI 时,您需要为 wlm_json_configuration 参数指定具体格式。您使用的格式取决于您的客户端操作系统。操作系统可以采用不同的方式将 JSON 结构括起来,因此它可以根据命令行正确地进行传输。要详细了解如何在 Linux、Mac OS X 和 Windows 操作系统中构建相应命令,请参阅以下部分。有关封闭 AWS CLI 中的 JSON 数据结构的差异的更多信息,一般情况下,请参阅《AWS Command Line Interface 用户指南》中的引用字符串

示例

以下示例命令为名为 example-parameter-group 的参数组配置手动 WLM。该配置可启用短查询加速,其中短查询的最大运行时间设置为 0,这指示 WLM 可动态设置该值。ApplyType 设置为 dynamic。此设置表示对参数中的动态属性做出的所有更改都将立即应用,除非同时对配置做出了其他静态更改。该配置定义下列三个队列:

  • 通过第一个队列,用户可以将 report 指定为其查询中的标签(在 query_group 属性中所指定的),以帮助他们将查询路由至该队列。对于 report* 标签,通配符搜索处于启用状态,因此标签无需完全相同,查询也可路由至该队列。例如,reportsreporting 都与此查询组匹配。此队列将分配所有队列总内存的 25%,并且最多可同时运行四个查询。查询限制为最大时间 20000 毫秒 (ms)。模式设置为自动,因此当队列的查询槽位已满时,符合条件的查询将发送到扩展集群。

  • 通过第二个队列,作为数据库中 admindba 组成员的用户可以将其查询路由至队列以进行处理。对于用户组,通配符搜索处于禁用状态,因此用户必须与数据库中的组完全匹配,其查询才能路由至该队列。此队列将跨所有队列分配总内存的 40%,并且最多可同时运行五个查询。模式设置为关闭,因此管理员或 dba 组的成员发送的所有查询都在主集群上运行。

  • 配置中的最后一个队列是默认队列。此队列将分配所有队列总内存的 35%,并且最多可同时处理五个查询。模式设置为自动。

注意

为了便于演示,该示例分为多行显示出来。实际命令中不得使用换行符。

aws redshift modify-cluster-parameter-group --parameter-group-name example-parameter-group --parameters '[ { "query_concurrency": 4, "max_execution_time": 20000, "memory_percent_to_use": 25, "query_group": ["report"], "query_group_wild_card": 1, "user_group": [], "user_group_wild_card": 0, "user_role": [], "user_role_wild_card": 0, "concurrency_scaling": "auto", "queue_type": "manual" }, { "query_concurrency": 5, "memory_percent_to_use": 40, "query_group": [], "query_group_wild_card": 0, "user_group": [ "admin", "dba" ], "user_group_wild_card": 0, "user_role": [], "user_role_wild_card": 0, "concurrency_scaling": "off", "queue_type": "manual" }, { "query_concurrency": 5, "query_group": [], "query_group_wild_card": 0, "user_group": [], "user_group_wild_card": 0, "user_role": [], "user_role_wild_card": 0, "concurrency_scaling": "auto", "queue_type": "manual" }, {"short_query_queue": true} ]'

以下是为自动 WLM 配置配置 WLM 查询监控规则的示例。该示例创建一个名为 example-monitoring-rules 的参数组。该配置定义了和上一示例相同的三个队列,但不再指定 query_concurrencymemory_percent_to_use。该配置还添加了以下规则和查询优先级:

  • 第一个队列定义名为 rule_1 的规则。该规则有两个谓词:query_cpu_time > 10000000query_blocks_read > 1000。规则操作是 log。此队列的优先级为 Normal

  • 第二个队列定义名为 rule_2 的规则。该规则有两个谓词:query_execution_time > 600000000scan_row_count > 1000000000。规则操作是 abort。此队列的优先级为 Highest

  • 配置中的最后一个队列是默认队列。此队列的优先级为 Low

注意

为了便于演示,该示例分为多行显示出来。实际命令中不得使用换行符。

aws redshift modify-cluster-parameter-group --parameter-group-name example-monitoring-rules --parameters '[ { "query_group" : [ "report" ], "query_group_wild_card" : 1, "user_group" : [ ], "user_group_wild_card" : 0, "user_role": [ ], "user_role_wild_card": 0, "concurrency_scaling" : "auto", "rules" : [{ "rule_name": "rule_1", "predicate": [{ "metric_name": "query_cpu_time", "operator": ">", "value": 1000000 }, { "metric_name": "query_blocks_read", "operator": ">", "value": 1000 } ], "action" : "log" } ], "priority": "normal", "queue_type": "auto" }, { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ "admin", "dba" ], "user_group_wild_card" : 0, "user_role": [ ], "user_role_wild_card": 0, "concurrency_scaling" : "off", "rules" : [ { "rule_name": "rule_2", "predicate": [ {"metric_name": "query_execution_time", "operator": ">", "value": 600000000}, {"metric_name": "scan_row_count", "operator": ">", "value": 1000000000}], "action": "abort"}], "priority": "high", "queue_type": "auto" }, { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ ], "user_group_wild_card" : 0, "user_role": [ ], "user_role_wild_card": 0, "concurrency_scaling" : "auto", "priority": "low", "queue_type": "auto", "auto_wlm": true }, { "short_query_queue" : true } ]'

在命令行中使用 AWS CLI 和 JSON 文件以配置 WLM

您可以使用 AWS CLI 修改 wlm_json_configuration 参数,并将 parameters 参数值作为 JSON 文件传递。

aws redshift modify-cluster-parameter-group --parameter-group-name myclusterparaametergroup --parameters file://modify_pg.json

--parameters 的参数存储在 modify_pg.json 文件中。文件位置是使用操作系统格式指定的。有关更多信息,请参阅从文件中加载参数。下面显示了 modify_pg.json JSON 文件的内容示例。

[ { "ParameterName": "wlm_json_configuration", "ParameterValue": "[{\"user_group\":\"example_user_group1\",\"query_group\": \"example_query_group1\", \"query_concurrency\":7},{\"query_concurrency\":5}]" } ]
[ { "ParameterName": "wlm_json_configuration", "ParameterValue": "[{\"query_group\":[\"reports\"],\"query_group_wild_card\":0,\"query_concurrency\":4,\"max_execution_time\":20000,\"memory_percent_to_use\":25},{\"user_group\":[\"admin\",\"dba\"],\"user_group_wild_card\":1,\"query_concurrency\":5,\"memory_percent_to_use\":40},{\"query_concurrency\":5,\"memory_percent_to_use\":35},{\"short_query_queue\": true, \"max_execution_time\": 5000 }]", "ApplyType": "dynamic" } ]

在 Linux 和 macOS X 操作系统上的命令行中使用 AWS CLI 配置 WLM 的规则

请按照以下规则在一行中使用参数运行 AWS CLI 命令:

  • 整个 JSON 结构必须使用单引号 (') 和一组方括号 ([ ]) 括起来。

  • 所有参数名称和参数值必须使用双引号 (") 括起来。

  • ParameterValue 值中,必须使用双引号 (") 和方括号 ([ ]) 将整个嵌套结构括起来。

  • 在嵌套结构中,必须使用大括号 ({ }) 将每个队列的每个属性和值括起来。

  • 在嵌套结构中,必须在每个双引号 (") 前面使用反斜杠 (\) 转义符。

  • 对于名称/值对,使用冒号 (:) 将每个属性与其值分隔开来。

  • 可使用逗号 (,) 将各个名称/值对彼此分隔开来。

  • 多个队列可通过在一个队列结束的右大括号 (}) 和下一个队列开始的左大括号 ({) 之间使用逗号 (,) 分隔开来。

在 Microsoft Windows 操作系统上的 Windows PowerShell 中使用 AWS CLI 配置 WLM 的规则

请按照以下规则在一行中使用参数运行 AWS CLI 命令:

  • 整个 JSON 结构必须使用单引号 (') 和一组方括号 ([ ]) 括起来。

  • 所有参数名称和参数值必须使用双引号 (") 括起来。

  • ParameterValue 值中,必须使用双引号 (") 和方括号 ([ ]) 将整个嵌套结构括起来。

  • 在嵌套结构中,必须使用大括号 ({ }) 将每个队列的每个属性和值括起来。

  • 在嵌套结构中,必须在每个双引号 (") 及其反斜杠 (\) 转义符前面使用反斜杠 (\) 转义符。该要求意味着,您将使用三个反斜杠和一个双引号以确保正确传递属性 (\\\")。

  • 对于名称/值对,使用冒号 (:) 将每个属性与其值分隔开来。

  • 可使用逗号 (,) 将各个名称/值对彼此分隔开来。

  • 多个队列可通过在一个队列结束的右大括号 (}) 和下一个队列开始的左大括号 ({) 之间使用逗号 (,) 分隔开来。

在 Windows 操作系统上使用命令提示符配置 WLM 的规则

请按照以下规则在一行中使用参数运行 AWS CLI 命令:

  • 整个 JSON 结构必须使用双引号 (") 和一组方括号 ([ ]) 括起来。

  • 所有参数名称和参数值必须使用双引号 (") 括起来。

  • ParameterValue 值中,必须使用双引号 (") 和方括号 ([ ]) 将整个嵌套结构括起来。

  • 在嵌套结构中,必须使用大括号 ({ }) 将每个队列的每个属性和值括起来。

  • 在嵌套结构中,必须在每个双引号 (") 及其反斜杠 (\) 转义符前面使用反斜杠 (\) 转义符。该要求意味着,您将使用三个反斜杠和一个双引号以确保正确传递属性 (\\\")。

  • 对于名称/值对,使用冒号 (:) 将每个属性与其值分隔开来。

  • 可使用逗号 (,) 将各个名称/值对彼此分隔开来。

  • 多个队列可通过在一个队列结束的右大括号 (}) 和下一个队列开始的左大括号 ({) 之间使用逗号 (,) 分隔开来。