工作负载管理
在 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
。优先级值可以是highest
、high
、normal
、low
和lowest
。默认为normal
。JSON 属性:
priority
- 队列类型
-
队列类型指定自动 WLM 或手动 WLM 使用的队列。将
queue_type
设置为auto
或manual
。如果未指定,则默认值为manual
。JSON 属性:
queue_type
- 队列名称
-
队列的名称。可以根据业务需求设置队列的名称。队列名称在 WLM 配置中必须唯一,最多为 64 个字母数字字符、下划线或空格,并且不能包含引号。例如,如果您有一个 ETL 查询队列,则可将该队列命名为
ETL queue
。此名称在指标、系统表值和 Amazon Redshift 控制台中用来标识队列。使用这些源中的名称的查询和报表需要能够处理名称的更改。以前,队列名称由 Amazon Redshift 生成。队列的默认名称为Queue 1
、Queue 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 开头的代表性属性是第一个队列的数组中的对象。其中每个对象都是名称/值对;name
和 value
共同设置第一个队列的 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*
标签,通配符搜索处于启用状态,因此标签无需完全相同,查询也可路由至该队列。例如,reports
和reporting
都与此查询组匹配。此队列将分配所有队列总内存的 25%,并且最多可同时运行四个查询。查询限制为最大时间 20000 毫秒 (ms)。模式设置为自动,因此当队列的查询槽位已满时,符合条件的查询将发送到扩展集群。 -
通过第二个队列,作为数据库中
admin
或dba
组成员的用户可以将其查询路由至队列以进行处理。对于用户组,通配符搜索处于禁用状态,因此用户必须与数据库中的组完全匹配,其查询才能路由至该队列。此队列将跨所有队列分配总内存的 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_concurrency
和 memory_percent_to_use
。该配置还添加了以下规则和查询优先级:
-
第一个队列定义名为
rule_1
的规则。该规则有两个谓词:query_cpu_time > 10000000
和query_blocks_read > 1000
。规则操作是log
。此队列的优先级为Normal
。 -
第二个队列定义名为
rule_2
的规则。该规则有两个谓词:query_execution_time > 600000000
和scan_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
值中,必须使用双引号 (") 和方括号 ([ ]) 将整个嵌套结构括起来。 -
在嵌套结构中,必须使用大括号 ({ }) 将每个队列的每个属性和值括起来。
-
在嵌套结构中,必须在每个双引号 (") 及其反斜杠 (\) 转义符前面使用反斜杠 (\) 转义符。该要求意味着,您将使用三个反斜杠和一个双引号以确保正确传递属性 (\\\")。
-
对于名称/值对,使用冒号 (:) 将每个属性与其值分隔开来。
-
可使用逗号 (,) 将各个名称/值对彼此分隔开来。
-
多个队列可通过在一个队列结束的右大括号 (}) 和下一个队列开始的左大括号 ({) 之间使用逗号 (,) 分隔开来。