aliyun-qos外掛程式是Elasticsearch(ES)團隊自研的叢集層級讀寫限流外掛程式,當上遊業務無法進行流量控制時,可通過aliyun-qos外掛程式按業務優先順序對指定索引進行適當降級,將流量控制在合適範圍內,保護ES服務的穩定性。
注意事項
aliyun-qos為預裝外掛程式,限流功能預設關閉,不支援卸載。該外掛程式用於保護叢集穩定性,不會精準計量讀寫流量。
外掛程式版本:使用前需確保aliyun-qos外掛程式已升級至最新版本。登入Kibana控制台,執行
GET /_cat/plugins?v查看外掛程式版本。外掛程式版本格式為<執行個體版本>_ali<組建號>,例如7.10.0_ali1.6.0.2、8.17.0_ali2.2.0.4.1。如果外掛程式版本不是最新,請參考以下方式升級:7.10版本執行個體:在控制台將核心升級到1.6.0版本,具體操作請參見升級版本。
非7.10版本執行個體:聯絡Elasticsearch技術工程師升級外掛程式版本。升級後需手動重啟Elasticsearch執行個體生效。
外掛程式版本低於rc4時,會出現
unsupported_operation_exception報錯。當前僅支援升級6.7.0及以上版本執行個體的aliyun-qos外掛程式,低於6.7.0版本的執行個體需要先升級到6.7.0及以上。
評估閾值
為了不影響讀寫請求的執行效率,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外掛程式,開啟限流功能的命令不同。
7.10最新版本 | 其他版本 |
| |
關閉限流功能
通過將限流參數設定為false或null關閉限流功能。不同版本的命令如下。
關閉限流方式 | 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的值支援完整索引名稱和索引萬用字元。不同版本的命令如下。
操作 | 7.10最新版本 | 其他版本 |
設定單個索引的查詢QPS限流 | | |
設定指定名稱首碼的索引的查詢QPS限流 | | |
設定任意索引的查詢QPS限流 | | 不支援。 |
設定所有索引的查詢總QPS限流 |
| |
可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
當查詢QPS超過限流值時,系統會返回如下報錯資訊。不同版本的報錯資訊不同:
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的值支援完整索引名稱和索引萬用字元。不同版本的命令如下。
7.10最新版本 | 其他版本 |
| 不支援 |
設定Bulk每秒寫入大小限流
通過設定Bulk每秒寫入的總位元組數,限制協調節點每秒接收的寫入位元組數。當每秒接收的寫入位元組數超過限流值後,Elasticsearch會拒絕接收請求。
index和index_patterns的值支援完整索引名稱和索引萬用字元。不同版本的命令如下。
7.10最新版本 | 其他版本 |
| |
可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
設定Bulk單次請求大小限流
通過設定Bulk單次請求的最大值,限制協調節點接收單次請求的寫入位元組數。當單次請求的寫入位元組數超過限流值後,Elasticsearch會拒絕接收請求。
index和index_patterns的值支援完整索引名稱和索引萬用字元。不同版本的命令如下。
7.10最新版本 | 其他版本 |
| |
可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
當單次請求的寫入位元組數超過限流值時,系統會返回如下報錯資訊。不同版本的報錯資訊不同:
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的值支援完整索引名稱和索引萬用字元。不同版本的命令如下。
7.10最新版本 | 其他版本 |
| 不支援 |
可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
設定多個限流器配置
支援同時設定限流器的多個配置。index和index_patterns的值支援完整索引名稱和索引萬用字元。不同版本的命令如下。
7.10最新版本 | 其他版本 |
| 不支援 |
可以定義多條不同的規則,只要請求命中任意一條規則,就會觸發限流。
擷取限流配置
不同版本擷取限流配置的命令如下。
操作 | 7.10最新版本 | 其他版本 |
擷取所有限流配置 | | |
擷取單個指定的限流配置 | | |
擷取多個指定的限流配置。多個限流器之間用英文逗號(,)分隔,不支援萬用字元。 | | |
刪除限流配置
不同版本刪除限流配置的命令如下。
操作 | 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}
升級外掛程式注意事項
在將aliyun-qos外掛程式升級至最新版本時,需注意以下事項:
由於新舊版本實現機制不同,升級過程中可能出現短暫限流失效,待master節點上的限流外掛程式升級完成後會自動回復。
在新舊資料轉換過程中,可能存在部分限流器轉換失敗的情況。如果轉換失敗,需要執行如下命令重新轉換。如果執行命令後報錯,可多次重試,直至hasError為false。
POST /_qos/limiter/ops/upgrade如果執行以上命令返回錯誤資訊(如
unknown action),說明執行個體中沒有舊版限流器,可忽略。