aliyun-qos插件是阿里云Elasticsearch團隊自研的插件,能夠提高集群的穩定性。該插件能夠實現集群級別的讀寫限流,在關鍵時刻對指定索引降級,將流量控制在合適范圍內。例如當上游業務無法進行流量控制時,尤其對于讀請求業務,可根據aliyun-qos插件設置的規則,按照業務的優先級進行適當的降級,來保護Elasticsearch服務的穩定性。
前提條件
已升級插件版本至最新版本。
您可以登錄目標Elasticsearch實例的Kibana控制臺,通過GET /_cat/plugins?v
命令查看該插件的版本。
7.10版本Elasticsearch實例的插件最新版本為7.10.0_ali1.6.0.2,其他版本為<實例版本>-rc4。如果插件版本不是最新版本,您可通過以下方式處理:
7.10版本Elasticsearch實例:在控制臺將內核升級到1.6.0版本,具體操作請參見升級版本。
非7.10版本Elasticsearch實例:提交工單聯系阿里云Elasticsearch技術工程師升級插件版本。升級后,需要您手動重啟Elasticsearch實例生效。
使用aliyun-qos插件時,如果版本低于rc4,會出現
unsupported_operation_exception
的報錯。當前僅支持升級6.7.0及以上版本的Elasticsearch實例中的aliyun-qos插件,低于6.7.0版本的Elasticsearch實例需要先將實例版本升級到6.7.0及以上,再升級插件版本。
注意事項
aliyun-qos插件為預裝插件,限流功能默認關閉,不支持卸載。該插件是為了保護集群,提高穩定性,并不會精準計量讀寫流量。
說明使用aliyun-qos插件前,您可以在插件配置頁面查看是否已安裝該插件。如果未安裝,可參見安裝或卸載系統默認插件進行安裝。插件安裝成功后不可卸載。
在將aliyun-qos插件升級至最新版本時,您需要注意:
由于新舊版本實現機制不同,升級過程中可能出現短暫限流失效,待master節點上的限流插件升級完成后會自動恢復。
在新舊數據轉換過程中,可能存在部分限流器轉換失敗的情況。如果轉換失敗,您需要執行如下命令重新轉換。如果執行命令后報錯,可多次重試,直至hasError為false。
POST /_qos/limiter/ops/upgrade
說明如果執行以上命令長時間不返回,則說明實例中沒有舊版限流器,可忽略。
評估閾值
為了不影響讀寫請求的執行效率,aliyun-qos插件會在集群級別進行限流,但并不會對集群中所有節點的讀寫流量進行嚴格精準的計量,可能會導致實際的流量有所偏差。因此在使用aliyun-qos插件前,可先參考如下規則評估限流閾值:
查詢請求
查詢請求的限流閾值 = 客戶端查詢請求到達Elasticsearch的端到端QPS(Query Per Second)
說明端到端QPS僅指查詢請求到達協調節點的每秒請求數。
寫入請求
寫入請求的限流閾值的計算規則與查詢請求類似,但還需要根據副本數進行調整。
例如集群中有2個數據節點、1個索引,該索引有1個shard、1個副本,每次寫入10 MB大小的數據。因為存在副本,所以每個數據節點上都會被寫入10 MB大小的數據。另外X-Pack自身的Monitor、Audit、Watcher等任務同樣會占用寫入流量,設置閾值時需要預留出該部分的大小。
開啟限流功能
aliyun-qos插件的限流功能默認關閉,使用時需要先開啟該功能。不同版本的aliyun-qos插件,開啟限流功能的代碼不同,具體如下。
本文中的命令均可在Kibana控制臺上執行,詳情請參見登錄Kibana控制臺。
7.10最新版本 | 其他版本 |
|
|
關閉限流功能
您可以通過將限流參數設置為false或null,關閉限流功能。aliyun-qos插件的版本不同,關閉限流功能的代碼不同,具體如下。
關閉限流方式 | 7.10最新版本 | 其他版本 |
將限流參數設置為false |
|
|
將限流參數設置為null |
|
|
配置限流器(7.10最新版本)
以下配置限流器的內容僅適用于7.10版本實例的aliyun-qos插件。
限流器主要由兩部分組成,limiters定義和tags定義。通過tags定義資源限制,通過limiters定義具體的限流類型和限流閾值。
限流器分為普通限流器和默認限流器。通過將tags設置為**可以實現默認限流器。例如默認每個shard的流量,默認每個應用的QPS等。
當請求超過限流值之后,Elasticsearch會拒絕之后發送的請求。
限流器配置的具體示例,請參見配置限流器示例。
PUT /_qos/limiter/<limiterName>
{
"limiters": {
${action}.${limiter_type}:${threshold}
},
"tags": {
${tagName}:${tagValue}
},
"priority":0,
"params":{
"watchMode":true
}
}
參數 | 說明 | 可選值 |
action | 限流的action,用于限制不同類型的請求。 |
|
limiter_type | 限流類型。支持三大類:
|
|
threshold | 限流閾值。 | int范圍內的整數,>=-1。 說明 部分類型支持帶單位的字符串,具體請參見limiter_type說明。 |
tagName | tag名稱。 |
|
tagValue | tag的值。 | 字符串,可為數組。如果為數組,則對應tag匹配數組中任意一個value即可。支持精確匹配、模糊匹配和任意值,例如:
|
priority | 優先級。 | int整數,默認為0。 說明 優先級越大,排序越靠前。當有多個默認限流器同時命中時,只有優先級最大的默認限流器會生效。 |
params | 高級參數。 | watchMode:是否啟用觀察模式,支持true和false(默認)。如果為true,Elasticsearch只會在metric中記錄拒絕數,但不會實際限流。您可以通過API查看指標監控信息,用于提前驗證限流效果,避免由于配置錯誤造成錯誤的限流。API的詳細信息,請參見常見問題。 |
配置限流器示例
設置查詢QPS限流
通過設置查詢索引每秒請求次數,限制協調節點每秒接收的查詢請求數。當每秒接收的查詢請求數超過限流值之后,Elasticsearch會拒絕接收請求。
index和index_patterns的值支持完整索引名稱和索引通配符。aliyun-qos插件的版本不同,設置查詢QPS限流的代碼不同,具體如下。
操作 | 7.10最新版本 | 其他版本 |
設置單個索引的查詢QPS限流 |
|
|
設置指定名稱前綴的索引的查詢QPS限流 |
|
|
設置任意索引的查詢QPS限流 |
說明
| 不支持。 |
設置所有索引的查詢總QPS限流 |
說明
|
|
您可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
當您在客戶端或Kibana控制臺上執行數據查詢操作時,如果查詢QPS超過您設置的限流值,系統會顯示如下報錯信息。請根據報錯信息適當減少查詢QPS限流。aliyun-qos插件的版本不同,顯示的報錯信息不同,具體如下:
7.10最新版本
{ "error": { "root_cause": [ { "type": "status_exception", "reason": "search blocked, limited by [<limiterName>][search.qps](<limiterId>) threshold:[x]" } ], "type": "status_exception", "reason": "search blocked, limited by [<limiterName>][search.qps](<limiterId>) threshold:[x]" }, "status": 429 }
其他版本
{ "error": { "root_cause": [ { "type": "rate_limited_exception", "reason": "request indices:data/read/search rejected, limited by [l1:t*:1.0]" } ], "type": "rate_limited_exception", "reason": "request indices:data/read/search rejected, limited by [l1:t*:1.0]" }, "status": 429 }
設置寫入TPS限流
通過設置寫入索引每秒請求次數,限制協調節點每秒接收的寫入請求數。當每秒接收的寫入請求數超過限流值之后,Elasticsearch會拒絕接收請求。
index和index_patterns的值支持完整索引名稱和索引通配符。aliyun-qos插件的版本不同,設置寫入TPS限流的代碼不同,具體如下。
7.10最新版本 | 其他版本 |
| 不支持 |
設置Bulk每秒寫入大小限流
通過設置Bulk每秒寫入的總字節數,限制協調節點每秒接收的寫入字節數。當每秒接收的寫入字節數超過限流值之后,Elasticsearch會拒絕接收請求。
index和index_patterns的值支持完整索引名稱和索引通配符。aliyun-qos插件的版本不同,設置Bulk每秒寫入大小限流的代碼不同,具體如下。
7.10最新版本 | 其他版本 |
|
|
您可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
設置Bulk單次請求大小限流
通過設置Bulk單次請求的最大值,限制協調節點接收單次請求的寫入字節數。當單次請求的寫入字節數超過限流值之后,Elasticsearch會拒絕接收請求。
index和index_patterns的值支持完整索引名稱和索引通配符。aliyun-qos插件的版本不同,設置Bulk單次請求大小限流的代碼不同,具體如下。
7.10最新版本 | 其他版本 |
|
|
您可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
當您在客戶端或Kibana控制臺上執行數據寫入操作時,如果單次請求的寫入字節數超過設置的限流值,系統會顯示如下報錯信息。請根據報錯信息適當減少單次請求的寫入字節數。aliyun-qos插件的版本不同,顯示的報錯信息不同,具體如下:
7.10最新版本
{ "error" : { "root_cause" : [ { "type" : "status_exception", "reason" : "write_size blocked, limited by [<limiterName>][write.max_size_per_request](<limiterId>) threshold:[x] try acquire [x]" } ], "type" : "status_exception", "reason" : "write_size blocked, limited by [<limiterName>][write.max_size_per_request](<limiterId>) threshold:[x] try acquire [x]" }, "status" : 400 }
其他版本
{ "error": { "root_cause": [ { "type": "rate_limited_exception", "reason": "request indices:data/write/bulk rejected, limited by [b2:ByteSizePreSeconds:992.0]" } ], "type": "rate_limited_exception", "reason": "request indices:data/write/bulk rejected, limited by [b2:ByteSizePreSeconds:992.0]" }, "status": 413 }
設置查詢shard并發個數限流
通過設置并發查詢shard數,來降低集群壓力。index和index_patterns的值支持完整索引名稱和索引通配符。aliyun-qos插件的版本不同,設置查詢shard并發個數限流的代碼不同,具體如下。
7.10最新版本 | 其他版本 |
| 不支持 |
您可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
設置多個限流器配置
支持同時設置限流器的多個配置。index和index_patterns的值支持完整索引名稱和索引通配符。aliyun-qos插件的版本不同,設置多個限流器配置的代碼不同,具體如下。
7.10最新版本 | 其他版本 |
| 不支持 |
您可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
獲取限流配置
aliyun-qos插件的版本不同,獲取限流配置的代碼不同,具體如下。
操作 | 7.10最新版本 | 其他版本 |
獲取所有限流配置 |
|
|
獲取單個指定的限流配置 |
|
|
獲取多個指定的限流配置 說明 多個限流器之間用英文逗號(,)分隔,不支持通配符。 |
|
|
刪除限流配置
aliyun-qos插件的版本不同,刪除限流配置的代碼不同,具體如下。
操作 | 7.10最新版本 | 其他版本 |
刪除單個指定的限流配置 |
|
|
刪除多個指定的限流配置 說明 多個限流器之間用英文逗號(,)分隔,不支持通配符。 |
|
|
常見問題
Q:如何獲取限流相關的指標監控信息?
A:可以通過以下API獲取:
獲取當前指標數據
獲取當前所有指標數據
GET /_qos/limiter/nodes/stats
獲取當前指定{node}指標數據
GET /_qos/limiter/nodes/{nodeId}/stats
獲取當前指定{node}和{limiter}指標數據
GET /_qos/limiter/nodes/{nodeId}/stats/{limiterIds}
獲取歷史指標數據
獲取歷史所有指標數據
GET /_qos/limiter/metric
獲取歷史指定{limiter}指標數據
GET /_qos/limiter/metric/{limiterId}