本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定工作負載管理
您可在 Amazon Redshift 中用工作負載管理 (WLM) 定義可用的查詢佇列數量,以及查詢如何路由至佇列進行處理。WLM 為參數群組組態的一部分。叢集將使用在其相關聯參數群組中指定的 WLM 組態。
建立參數群組時,預設的 WLM 組態將包含一個佇列,其最多可同時執行五個查詢。如果您想更有效地控制查詢處理功能,可新增其他佇列並設定其各自的 WLM 屬性。您所新增的每個佇列都會擁有相同的預設 WLM 組態,除非您設定其屬性。
新增額外的佇列時,組態中最後一個佇列為預設佇列。除非查詢依照 WLM 組態中的條件路由至其他佇列,否則皆由預設佇列處理。您可以為預設佇列指定模式和並行層級 (查詢槽),但無法指定預設佇列的使用者群組或查詢群組。
如同其他參數,您也無法修改預設參數群組中的 WLM 組態。與預設參數群組相關聯的叢集永遠使用預設的 WLM 組態。若要修改 WLM 組態,請建立新的參數群組,然後將該參數群組與需要自訂 WLM 組態的任何叢集相關聯。
WLM 動態和靜態屬性
WLM 屬性分為動態和靜態兩種。您可在不重新啟動叢集的情形下,將動態屬性套用至資料庫,但靜態屬性需要重新啟動叢集才能讓變更生效。如需動態和靜態組態屬性的相關資訊,請參閱 WLM 動態和靜態組態屬性。
wlm_json_configuration 參數的屬性
您可以使用 Amazon Redshift 主控台、亞馬 Amazon Redshift API 或其中一個開發套件來設定 WLM。 AWS CLI AWS 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
。優先順序值可以是highest
、high
、normal
、low
和lowest
。預設值為normal
。JSON 屬性:
priority
- 佇列類型
-
佇列類型指定佇列由 Auto WLM (自動 WLM) 或 Manual 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 佇列測量結果 (例如 WLM、WLM QueueWait 時間QueueLength、WLM、WLM、WLM QueriesCompleted PerSecond 等) 的
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 資料庫開發人員指南》中的實作工作負載管理。
使用以下方法配置 wlm_json_組態參數 AWS CLI
若要設定 WLM,您必須修改 wlm_json_configuration
參數。wlm_json_configuration
屬性值的大小上限為 8000 個字元。該值以「 JavaScript 物件標記法」(JSON) 格式化。如果您使用 Amazon Redshift API 或其中 AWS CLI一個 AWS 開發套件來設定 WLM,請使用本節的其餘部分來了解如何建構參數的 JSON 結構。wlm_json_configuration
注意
如果您使用 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 的代表性屬性為第一個佇列陣列中的物件。這些物件中每個均有名稱/值對;name
和 value
共同設定了第一個佇列的 WLM 屬性。開頭為 q2 的代表性屬性為第二個佇列陣列中的物件。如果您需要更多佇列,可為其他的每個佇列新增額外的陣列,並設定各物件的屬性。
修改 WLM 組態時,即使您只需要變更佇列中的一個屬性,仍必須加入佇列的完整結構。因為整個 JSON 結構會與 wlm_json_configuration
參數值一起以字串傳入。
將 AWS CLI 命令格式化
使用 AWS CLI時,wlm_json_configuration
參數需要特定格式。使用的格式需視用戶端作業系統而定。作業系統會使用不同方式來包圍 JSON 結構,以從命令列正確傳送。如需如何在 Linux、Mac OS X 和 Windows 作業系統中建構合適命令的詳細資訊,請參閱下列各節。如需一般而言,封閉 JSON 資料結構差異的詳細資訊,請參閱使用指南中的引AWS Command Line Interface 用字串。 AWS CLI
範例
下列命令範例為名為 example-parameter-group
的參數群組設定手動 WLM。該組態啟用短期查詢加速,短期查詢的最長執行時間設為 0,指示 WLM 動態設定數值。ApplyType
設定為 dynamic
。此設定表示對參數中動態屬性進行的任何變更將立即套用,除非組態有任何其他靜態變更。該組態定義三個佇列,內容如下:
-
第一個佇列可讓使用者指定
report
為佇列中的標籤 (如query_group
屬性中所指定),以協助將查詢路由至該佇列。report*
標籤將啟用萬用字元搜尋,因此不需要精確指定要路由至佇列的查詢。例如,reports
和reporting
皆符合此查詢群組。佇列將從所有佇列的總記憶體中分配到 25%,且最多可同時執行四個查詢。查詢限制的最長時間為 20000 毫秒 (ms)。模式設定為自動,因此當佇列的查詢空位已滿時,合格查詢將傳送到擴展叢集。 -
第二個佇列可讓屬於資料庫中
admin
或dba
群組成員的使用者將其查詢路由至佇列,以進行處理。使用者群組不可用萬用字元搜尋,因此使用者必須與資料庫中的群組精確相符,其查詢才會路由至佇列。佇列將從所有佇列的總記憶體中分配到 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_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
您可以使用修改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.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
值內的整個巢狀結構必須包圍在雙引號 (") 和括號 ([ ]) 內。 -
巢狀結構內每個佇列的每個屬性和值必須包圍在大括號 ({ }) 內。
-
巢狀結構內的每個雙引號 (") 和其反斜線 (\) 逸出字元前必須使用反斜線 (\) 逸出字元。此需求意味著您將使用三個反斜線和一個雙引號,以確定用正確方式傳送屬性 (\\\")。
-
如為名稱/值對,冒號 (:) 可分隔每個屬性與值。
-
每個名稱/值對用逗號 (,) 區隔。
-
多重佇列在佇列結束大括號 (}) 和下一個佇列起始大括號 ({) 之間用逗號 (,) 分隔。