設定工作負載管理 - Amazon Redshift

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

設定工作負載管理

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

建立參數群組時,預設的 WLM 組態將包含一個佇列,其最多可同時執行五個查詢。如果您想更有效地控制查詢處理功能,可新增其他佇列並設定其各自的 WLM 屬性。您所新增的每個佇列都會擁有相同的預設 WLM 組態,除非您設定其屬性。

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

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

WLM 動態和靜態屬性

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

wlm_json_configuration 參數的屬性

您可以使用 Amazon Redshift 主控台、AWS CLI、Amazon Redshift API 或其中一個 AWS 開發套件來設定 WLM。WLM 組態使用多項屬性定義佇列行為,例如跨佇列的記憶體配置、佇列中可同時執行的查詢數量等。

注意

以下顯示屬性將同時在說明中列出其 Amazon Redshift 主控台名稱,以及對應的 JSON 屬性名稱。

下表摘要顯示屬性適用於自動 WLM 或是手動 WLM。

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

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

Auto WLM (自動 WLM)

Auto WLM (自動 WLM) 設為 true 可啟用自動 WLM。自動 WLM 會將主體的並行記憶體 (%) 的值設為 Auto。Amazon 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 mode (WLM 模式) 必須設定為 Auto WLM (自動 WLM);也就是說,auto_wlm 必須是 true。優先順序值可以是 highesthighnormallowlowest。預設值為 normal

JSON 屬性:priority

佇列類型

佇列類型指定佇列由 Auto WLM (自動 WLM)Manual WLM (手動 WLM) 使用。將 queue_type 設定為 automanual。若沒有指定,則預設為 manual

JSON 屬性:queue_type

佇列名稱

佇列的名稱。您可以根據商業需求設定佇列名稱。佇列名稱在 WLM 組態內必須是唯一的,最多可包含 64 個英數字元、底線或空格,且不能包含引號。例如,如果您有 ETL 查詢的佇列,則可以將其命名為 ETL queue。此名稱用於指標、系統資料表值和 Amazon Redshift 主控台中,以識別佇列。使用來自這些來源之名稱的查詢和報告必須能夠處理名稱的變更。先前,佇列名稱是由 Amazon Redshift 產生的。佇列的預設名稱是 Queue 1Queue 2 到最後一個名為 Default queue 的佇列。

重要

如果您變更佇列名稱,WLM 佇列測量結果 (例如,WLM、WLM QueueLength、WLM、WLM QueueWaitTime、WLM QueriesCompletedPerSecond 等) 的QueueName維度值也會變更。QueryDuration RunningQueries因此,如果您變更佇列的名稱,您可能需要變更已設定的 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 時無法使用此功能。這時請改成使用 query_execution_time 建立查詢監控規則 (QMR),以限制查詢的經歷執行時間。如需詳細資訊,請參閱 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)

以下範例顯示名為 rule_1、含有兩個述詞和 hop 動作之 WLM 查詢監控規則的 JSON。

"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_json_configuration 參數

若要設定 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 組態,其定義一個並行層級 (查詢槽) 為 5 的手動 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%,且最多可同時執行五個查詢。模式設為關閉,因此 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 } ]'

在命令列使用 AWS CLI 搭配 JSON 檔案來設定 WLM

您可以使用 AWS CLI 來修改 wlm_json_configuration 參數,並以 JSON 檔案的形式傳遞 parameters 引數的值。

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 視窗作業系統 PowerShell 上使用視窗AWS CLI中的設定 WLM 的規則

遵循這些規則來在同一行執行包含參數的 AWS CLI 命令:

  • 整個 JSON 結構必須包圍在單引號 (') 和一組括號 ([ ]) 內。

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

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

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

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

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

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

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

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

遵循這些規則來在同一行執行包含參數的 AWS CLI 命令:

  • 整個 JSON 結構必須包圍在雙引號 (") 和一組括號 ([ ]) 內。

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

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

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

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

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

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

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