工作負載管理 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

工作負載管理

在 Amazon Redshift 中,您可以使用工作負載管理 (WLM) 來定義可用的查詢佇列數,以及如何將查詢路由到這些佇列進行處理。WLM是參數群組組態的一部分。叢集會使用在其關聯參數群組中指定的WLM配置。

建立參數群組時,預設組WLM態包含一個佇列,最多可同時執行五個查詢。如果您想要進一步控制查詢處理,可以新增其他佇列並在每個佇列中配置WLM屬性。您新增的每個佇列都有相同的預設WLM組態,直到您設定其屬性為止。

新增額外的佇列時,組態中最後一個佇列為預設佇列。除非根據WLM組態中的條件將查詢路由到另一個佇列,否則預設佇列會處理該查詢。您可以為預設佇列指定模式和並行層級 (查詢槽),但無法指定預設佇列的使用者群組或查詢群組。

與其他參數一樣,您無法修改預設參數群組中的組WLM態。與預設參數群組相關聯的叢集一律使用預設組WLM態。若要修改組WLM態,請建立新參數群組,然後將該參數群組與任何需要您自訂組WLM態的叢集建立關聯。

WLM動態和靜態屬性

組WLM態屬性是動態或靜態的。您可在不重新啟動叢集的情形下,將動態屬性套用至資料庫,但靜態屬性需要重新啟動叢集才能讓變更生效。如需有關靜態和動態屬性的詳細資訊,請參閱WLM動態和靜態組態屬性

WLM組態參數的屬性

您可以使WLM用 Amazon Redshift 控制台進行配置 AWS CLI,Amazon RedshiftAPI,或其中之一 AWS SDKs。WLM配置使用數個屬性來定義佇列行為,例如跨佇列配置記憶體、可在佇列中同時執行的查詢數目等。

注意

下列屬性會與其 Amazon Redshift 主控台名稱一起顯示,並在說明中顯示對應的JSON屬性名稱。

下表摘要說明某個性質適用於自動WLM還是手動WLM。

WLM財產 自動 WLM 手動 WLM
汽車 WLM
啟用短期查詢加速
短期查詢最長執行時間
優先順序
佇列類型
佇列名稱
並行擴展模式
並行數量
使用者群組
使用者群組萬用字元
查詢群組
查詢群組萬用字元
使用者角色
使用者角色萬用字元
逾時 已棄用
記憶體
查詢監控規則

下列清單說明您可以設定的WLM屬性。

汽車 WLM

動WLM設定為true啟用自動WLM。「自動」WLM 將「主要」和「記憶體 (%)」的「並行」的值設定為。AutoAmazon Redshift 可管理查詢並行和記憶體配置。預設值為 true

JSON屬性:auto_wlm

Enable short query acceleration (啟用短期查詢加速)

短查詢加速(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、WLMQueriesCompletedPerSecondWLMQueryDurationWLMRunningQueries、等) 的QueueName維度值也會變更。因此,如果您變更佇列的名稱,您可能需要變更已設定的 CloudWatch 警示。

JSON屬性:name

Concurrency Scaling mode (並行擴展模式)

若要啟用佇列的並行擴展,請將 Concurrency Scaling mode (並行擴展模式) 設定為 auto。當路由至佇列的查詢數量超過佇列設定的並行時,合格查詢將前往擴展叢集。當有可用的空位時,查詢會執行於主要叢集。預設值為 off

JSON屬性:concurrency_scaling

並行數量

可在手動WLM佇列中同時執行的查詢數目。此屬性僅適用於手動WLM。如果並行擴展已啟用,當佇列達到並行層級 (查詢槽) 時,合格查詢將前往擴展叢集。如果並行擴展未啟用,查詢會在佇列中等待,直到有空位為止。範圍介於 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

使用者角色

逗號分隔的使用者角色清單。具有該使用者角色的成員在資料庫內執行查詢時,其查詢會路由至與其使用者角色相關聯的佇列。如需使用者角色的詳細資訊,請參閱以角色為基礎的存取控制 (RBAC)

JSON屬性:user_role

使用者角色萬用字元

布林值類型,用以指示是否啟用查詢群組的萬用字元。如果為 0,表示萬用字元為停用;如果為 1,表示萬用字元為啟用。當萬用字元啟用時,您可以在執行查詢時使用 "*" 或 "?" 來指定多個查詢群組。如需詳細資訊,請參閱萬用字元

JSON屬性:user_role_wild_card

Timeout (ms) (逾時 (毫秒))

WLM超時(max_execution_time)已棄用。使用自動時不可用WLM。請改為建立查詢監視規則 (QMR),query_execution_time以限制查詢經過的執行時間。如需詳細資訊,請參閱WLM查詢監視規則

查詢遭取消前所能執行的最長時間 (毫秒)。在某些情況下,唯讀查詢 (例如SELECT陳述式) 可能會因為WLM逾時而取消。在這些情況下,會WLM嘗試根據佇列指派規則將查詢路由至下一個相符WLM佇列。如果查詢不符合任何其他的佇列定義,此查詢將取消;不會指派給預設佇列。如需詳細資訊,請參閱WLM查詢佇列跳轉。WLM超時不適用於已達到returning狀態的查詢。若要檢視查詢的狀態,請參閱 STV_ _ WLM QUERY _ STATE 系統資料表。

JSON屬性:max_execution_time

Memory (%) (記憶體 (%))

配置給佇列的記憶體百分比。若您要為至少一個佇列指定記憶體百分比,您必須為所有其他佇列指定總共 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 — 每個規則最多可以有三個述詞。針對每個述詞,您指定下列屬性。

      • metric_name — 如需指標清單,請參閱《Amazon Redshift 資料庫開發人員指南》中的查詢監控指標

      • operator — 運算子為 =<>

      • value — 觸發動作之指定指標的閾值。

  • action — 每個規則都與一個動作相關聯。有效的動作為:

    • log

    • hop(僅適用於手動WLM)

    • abort

    • change_query_priority(僅適用於自動WLM)

下列範例顯示名JSON為的WLM查詢監視規則rule_1,其中包含兩個述詞和動作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 資料庫開發人員指南》中的實作工作負載管理

使用配置WLM參數 AWS CLI

若要設定WLM,請修改wlm_json_configuration參數。wlm_json_configuration 屬性值的大小上限為 8000 個字元。該值在 JavaScript 對象表示法(JSON)中格式化。如果您WLM使用 AWS CLI,Amazon RedshiftAPI,或其中之一 AWS SDKs,請使用本節的其餘部分來學習如何建JSON構wlm_json_configuration參數的結構。

注意

如果使用 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 command

使用時,wlm_json_configuration參數需要特定的格式 AWS CLI。 您使用的格式取決於您的用戶端作業系統。作業系統有不同的方式來封閉結JSON構,以便從命令列正確傳遞。如需如何在 Linux、Mac OS X 和 Windows 作業系統中建構合適命令的詳細資訊,請參閱下列各節。有關將JSON數據結構封閉在中的差異的更多信息 AWS CLI 一般來說,請參閱引用字串 AWS Command Line Interface 用戶指南

範例

下列範例指令會WLM為名為的參數群組配置手動。example-parameter-group此組態會啟用短查詢加速,並將短期查詢的最大執行時間設定為 0,這會指示WLM動態設定值。ApplyType 設定為 dynamic。此設定表示對參數中動態屬性進行的任何變更將立即套用,除非組態有任何其他靜態變更。該組態定義三個佇列,內容如下:

  • 第一個佇列可讓使用者指定 report 為佇列中的標籤 (如 query_group 屬性中所指定),以協助將查詢路由至該佇列。report* 標籤將啟用萬用字元搜尋,因此不需要精確指定要路由至佇列的查詢。例如,reportsreporting 皆符合此查詢群組。佇列將從所有佇列的總記憶體中分配到 25%,且最多可同時執行四個查詢。查詢限制的最長時間為 20000 毫秒 (ms)。模式設定為自動,因此當佇列的查詢空位已滿時,合格查詢將傳送到擴展叢集。

  • 第二個佇列可讓屬於資料庫中 admindba 群組成員的使用者將其查詢路由至佇列,以進行處理。使用者群組不可用萬用字元搜尋,因此使用者必須與資料庫中的群組精確相符,其查詢才會路由至佇列。佇列將從所有佇列的總記憶體中分配到 40%,且最多可同時執行五個查詢。模式設為關閉,因此 admin 或 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 } ]'

使WLM用配置 AWS CLI 在命令行中有一個JSON文件

您可以使用修改wlm_json_configuration參數 AWS CLI 並將參parameters數的值作為JSON文件傳遞。

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

--parameters 的引數會儲存在 modify_pg.json 檔案中。檔案位置會以您的作業系統的格式指定。如需詳細資訊,請參閱​從檔案載入參數。以下顯示modify_pg.jsonJSON檔案內容的範例。

[ { "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" } ]

使用配置WLM的規則 AWS CLI 在 Linux 和 macOS X 操作系統上的命令行

請按照以下規則運行 AWS CLI 在一行上帶有參數的命令:

  • 整個JSON結構必須用單引號 (') 和一組括號 ([]) 括住。

  • 所有參數名稱和參數值必須包圍在雙引號 (") 內。

  • ParameterValue 值內的整個巢狀結構必須包圍在雙引號 (") 和括號 ([ ]) 內。

  • 巢狀結構內每個佇列的每個屬性和值必須包圍在大括號 ({ }) 內。

  • 巢狀結構內的每個雙引號 (") 前必須使用反斜線 (\) 逸出字元。

  • 如為名稱/值對,冒號 (:) 可分隔每個屬性與值。

  • 每個名稱/值對用逗號 (,) 區隔。

  • 多重佇列在佇列結束大括號 (}) 和下一個佇列起始大括號 ({) 之間用逗號 (,) 分隔。

使用配置WLM的規則 AWS CLI 在 Microsoft PowerShell 視窗作業系統

請按照以下規則運行 AWS CLI 在一行上帶有參數的命令:

  • 整個JSON結構必須用單引號 (') 和一組括號 ([]) 括住。

  • 所有參數名稱和參數值必須包圍在雙引號 (") 內。

  • ParameterValue 值內的整個巢狀結構必須包圍在雙引號 (") 和括號 ([ ]) 內。

  • 巢狀結構內每個佇列的每個屬性和值必須包圍在大括號 ({ }) 內。

  • 巢狀結構內的每個雙引號 (") 和其反斜線 (\) 逸出字元前必須使用反斜線 (\) 逸出字元。此需求意味著您將使用三個反斜線和一個雙引號,以確定用正確方式傳送屬性 (\\\")。

  • 如為名稱/值對,冒號 (:) 可分隔每個屬性與值。

  • 每個名稱/值對用逗號 (,) 區隔。

  • 多重佇列在佇列結束大括號 (}) 和下一個佇列起始大括號 ({) 之間用逗號 (,) 分隔。

在 Windows 作業系統上WLM使用命令提示字元進行設定的規則

請按照以下規則運行 AWS CLI 在一行上帶有參數的命令:

  • 整個JSON結構必須用雙引號 (「) 和一組括號 ([]) 括住。

  • 所有參數名稱和參數值必須包圍在雙引號 (") 內。

  • ParameterValue 值內的整個巢狀結構必須包圍在雙引號 (") 和括號 ([ ]) 內。

  • 巢狀結構內每個佇列的每個屬性和值必須包圍在大括號 ({ }) 內。

  • 巢狀結構內的每個雙引號 (") 和其反斜線 (\) 逸出字元前必須使用反斜線 (\) 逸出字元。此需求意味著您將使用三個反斜線和一個雙引號,以確定用正確方式傳送屬性 (\\\")。

  • 如為名稱/值對,冒號 (:) 可分隔每個屬性與值。

  • 每個名稱/值對用逗號 (,) 區隔。

  • 多重佇列在佇列結束大括號 (}) 和下一個佇列起始大括號 ({) 之間用逗號 (,) 分隔。