Amazon Redshift
管理指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

配置工作负载管理

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

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

当您添加更多队列时,配置中的最后一个队列是默认队列。除非根据 WLM 配置中的标准将查询路由至另一个队列,否则该查询将由默认队列进行处理。您无法为默认队列指定用户组或查询组。

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

WLM 动态属性和静态属性

WLM 配置属性可以是动态的,也可以是静态的。动态属性可以直接应用于数据库,而无需重新启动群集;但静态属性需要重新启动群集才能够使更改生效。不过,如果您同时更改动态属性和静态属性,则无论是动态属性还是静态属性,都必须重新启动群集才能使所有属性更改生效。

下列 WLM 属性是静态的:

  • 用户组

  • 用户组通配符

  • 查询组

  • Query group wildcard

添加或删除查询队列,或对其重新排序属于静态更改,需要重新启动群集才能生效。

下列 WLM 属性是动态的:

  • 并发

  • 要使用的内存的百分比

  • 超时

如果更改了超时值,则新值将应用于值更改之后开始执行的所有查询。如果更改了并发或使用的内存百分比,则 Amazon Redshift 将动态转换为新配置,以便当前运行的查询不会受到更改的影响。有关更多信息,请参阅 WLM 动态内存分配

wlm_json_configuration 参数中的属性

您可以使用 Amazon Redshift console、AWS CLI、Amazon Redshift API 或其中一个 AWS 软件开发工具包来配置 WLM。WLM 配置包含多个用于定义队列行为的属性,例如队列之间的内存分配、队列中可以并发运行的查询数量等。下面的列表介绍了可为每个队列配置的 WLM 属性。

注意

下列属性根据其 Amazon Redshift console 名称列出,具体说明中提供了对应的 JSON 属性名称。

Concurrency

队列中可以并发运行的查询的数量。当队列达到并发级别后,所有后续查询都将在队列中排队等候,直到有可用资源来处理它们为止。范围介于 1-50 之间。

JSON 属性:query_concurrency

User Groups

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

JSON 属性:user_group

User Group Wildcard

用来指示是否对用户组启用通配符的布尔值。如果该值为 0,则禁用通配符;如果该值为 1,则启用通配符。通配符处于启用状态时,您可以使用“*”或“?”在运行查询时指定多个用户组。

JSON 属性:user_group_wild_card

Query Groups

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

JSON 属性:query_group

Query Group Wildcard

用来指示是否对查询组启用通配符的布尔值。如果该值为 0,则禁用通配符;如果该值为 1,则启用通配符。通配符处于启用状态时,您可以使用“*”或“?”在运行查询时指定多个查询组。

JSON 属性:query_group_wild_card

Timeout (ms)

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

JSON 属性:max_execution_time

内存 (%)

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

JSON 属性:memory_percent_to_use

查询监控规则

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

注意

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

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

JSON 属性:rules

JSON 属性层次结构:

Copy
rules rule_name predicate metric_name operator value action

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

  • rule_name – 规则名称必须在 WLM 配置中是唯一的。规则名称最多可包含 32 个字母数字字符或下划线,且不能包含空格或引号。您可以让每个队列有八个规则,并且所有队列的总限制为八个规则。

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

      • metric_name – 有关指标的列表,请参阅 Amazon Redshift Database Developer Guide 中的查询监控指标

      • operator – 操作是 =<>

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

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

    • log

    • hop

    • abort

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

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

要详细了解用于配置查询队列的每种属性和策略,请转至 Amazon Redshift Database Developer Guide 中的定义查询队列实施工作负载管理

使用 AWS CLI 配置 wlm_json_configuration 参数

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

注意

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

示例

下面的示例是默认的 WLM 配置,定义了一个并发级别为五的队列。

Copy
{ "query_concurrency":5 }

语法

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

Copy
[ { "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 的命令。ApplyType 设置属于 dynamic 设置,因此对参数中的动态属性做出的所有更改都将立即应用,除非同时对配置做出了其他静态更改。该配置定义下列三个队列:

  • 通过第一个队列,用户可以将 report 指定为其查询中的标签(在 query_groups 属性中所指定的),以帮助他们将查询路由至该队列。对于 report 标签,通配符搜索处于启用状态,因此标签无需完全相同,查询也可路由至该队列。例如,reportsreporting 也与此查询组匹配。此队列将分配所有队列总内存的 25%,并且最多可同时运行四个查询。查询时长限制为不超过 20000 毫秒。

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

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

注意

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

Copy
aws redshift modify-cluster-parameter-group --parameter-group-name example-parameter-group --parameters '[ { "ParameterName":"wlm_json_configuration", "ParameterValue":"[ { "query_group":["report"], "query_group_wild_card":1, "query_concurrency":4, "max_execution_time":20000, "memory_percent_to_use":25 }, { "user_group":["admin","dba"], "user_group_wild_card":0, "query_concurrency":5, "memory_percent_to_use":40 }, { "query_concurrency":5, "memory_percent_to_use":35 } ]", "ApplyType":"dynamic" } ]'

以下是配置 WLM 查询监控规则的示例。该示例创建一个名为 example-monitoring-rules 的参数组。该配置定义了和上一示例相同的三个队列,并添加了以下规则:

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

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

  • 配置中的最后一个队列是默认队列。

注意

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

Copy
aws redshift modify-cluster-parameter-group --parameter-group-name example-monitoring-rules --parameters '[ { "ParameterName":"wlm_json_configuration", "ParameterValue":"[ { "query_group":["report"], "query_group_wild_card":1, "query_concurrency":4, "max_execution_time":20000, "memory_percent_to_use":25, "rules": [{"rule_name": "rule_1", "predicate": [ {"metric_name": "query_cpu_time", "operator": ">", "value": 1000000}, {"metric_name": "query_blocks_read", "operator": ">", "value": 1000}], "action": "log"}] }, { "user_group":["admin","dba"], "user_group_wild_card":0, "query_concurrency":5, "memory_percent_to_use":40, "rules": [{"rule_name": "rule_2", "predicate": [ {"metric_name": "query_execution_time", "operator": ">", "value": 600000000}, {"metric_name": "scan_row_count", "operator": ">", "value": 1000000000}], "action": "hop"}] }, { "query_concurrency":5, "memory_percent_to_use":35 } ]", "ApplyType":"dynamic" } ]'

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

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

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

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

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

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

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

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

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

示例

下面的示例显示了如何按照此部分所述,在 Linux 和 Mac OS X 操作系统上使用 AWS CLI 配置队列。

注意

此示例在 AWS CLI 必须中以一行的形式进行提交。

Copy
aws redshift modify-cluster-parameter-group --parameter-group-name example-parameter-group --parameters '[{"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}]","ApplyType":"dynamic"}]'

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

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

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

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

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

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

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

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

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

示例

下面的示例显示了如何按照此部分所述,在 Windows 操作系统上的 Windows PowerShell 中使用 AWS CLI 配置队列。

注意

此示例在 AWS CLI 必须中以一行的形式进行提交。

Copy
aws redshift modify-cluster-parameter-group --parameter-group-name example-parameter-group --parameters '[{\"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}]\",\"ApplyType\":\"dynamic\"}]'

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

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

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

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

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

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

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

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

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

示例

下面的示例显示了如何按照此部分所述,在 Windows 操作系统上的命令提示符中使用 AWS CLI 配置队列。

注意

此示例在 AWS CLI 必须中以一行的形式进行提交。

Copy
aws redshift modify-cluster-parameter-group --parameter-group-name example-parameter-group --parameters "[{\"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}]\",\"ApplyType\":\"dynamic\"}]"