制御できない上流サービスから読み取りまたは書き込みトラフィックのバーストが発生した場合、aliyun-qos プラグインによりクラスター単位の速度制限を適用し、Elasticsearch の安定性を保護できます。このプラグインでは、特定のインデックスの優先度を低下させたり、秒間クエリ数 (QPS)、秒間トランザクション数 (TPS)、スループット、並行スレッド数を制限したりすることで、どのワークロードを許可するかを細かく制御できます。
前提条件
開始する前に、以下の点を確認してください。
aliyun-qos プラグインがご利用の Elasticsearch クラスターにインストールされていること。Elasticsearch コンソールの [プラグイン] ページで確認します。プラグインがインストールされていない場合は、「組み込みプラグインのインストールと削除」をご参照ください。なお、プラグインは一度インストールするとアンインストールできません。
プラグインが最新バージョンにアップグレードされていること:
Elasticsearch V7.10 クラスター:
7.10.0_ali1.6.0.2その他のすべてのバージョン:
<ES-version>-rc4
現在のバージョンを確認するには、Kibana コンソールで次のコマンドを実行します。
GET /_cat/plugins?v
アップグレード手順:
Elasticsearch V7.10 クラスター:カーネルバージョンを V1.6.0 に更新します。詳細については、「クラスターのバージョンアップグレード」をご参照ください。
その他のすべてのバージョン: チケットを起票して、Elasticsearch のテクニカルエンジニアにご連絡ください。アップグレード後は、変更を有効にするためにクラスターを再起動してください。
プラグインのバージョンが rc4 よりも古い場合、システムで unsupported_operation_exception エラーが報告されます。プラグインは、Elasticsearch V6.7.0 以降を実行しているクラスターでのみアップグレード可能です。クラスターがそれより前のバージョンを実行している場合は、まずクラスターをアップグレードしてください。注意事項
aliyun-qos は組み込みプラグインであり、アンインストールできません。

速度制限は**デフォルトで無効**です。使用する前に有効化してください。
プラグインはクラスター単位で速度制限を行いますが、ノード単位のトラフィックを正確に計測しません。計測値は実際のトラフィックと異なる場合があります。
最新バージョンへのアップグレードを行う前に、以下の点にご注意ください。
アップグレード中は一時的に速度制限が機能しない場合があります。専用マスターノードのアップグレード完了後に回復します。
一部のリミッターがアップグレードに失敗することがあります。その場合、次のコマンドを実行してください。結果として
hasErrorがfalseを返すまで、このコマンドを繰り返してください。POST /_qos/limiter/ops/upgrade
コマンドの実行結果が返されない場合は、すべてのリミッターがすでに最新バージョンになっています。
しきい値の評価
リミッターを構成する前に、以下のルールに基づいて適切な速度制限のしきい値を推定してください。
クエリ(読み取り)リクエスト:
速度制限のしきい値 = クライアントから Elasticsearch までのエンドツーエンドの QPS(クライアントノードに 1 秒あたり送信されるクエリリクエスト数)
書き込みリクエスト:
クエリリクエストと同様の計算を行い、その後、レプリカシャードの数に応じて調整します。
例:2 つのデータノードを持つクラスターで、プライマリシャード 1 個およびレプリカシャード 1 個を持つインデックスを 1 つ格納し、1 回の操作で 10 MB を書き込む場合、レプリカシャードの存在により、各データノードが 1 回の書き込み操作で 10 MB を受信します。また、しきい値を設定する際には、X-Pack Monitor、Audit、Watcher によって生成される書き込みトラフィックも考慮してください。
速度制限の有効化
速度制限はデフォルトで無効です。クラスターのバージョンに応じて、[Kibana コンソール] で適切なコマンドを実行して有効化してください。
このトピックで紹介するすべてのコマンドは、Kibana コンソールで実行できます。
Elasticsearch V7.10(最新プラグインバージョン):
PUT _cluster/settings
{
"persistent": {
"apack.qos.limiter.enabled": true
}
}その他のすべての Elasticsearch バージョン:
PUT _cluster/settings
{
"persistent" : {
"apack.qos.ratelimit.enabled":"true"
}
}速度制限の無効化
速度制限パラメーターを false または null に設定すると、速度制限が無効になります。
Elasticsearch V7.10 — false に設定:
PUT _cluster/settings
{
"persistent": {
"apack.qos.limiter.enabled": false
}
}Elasticsearch V7.10 — null に設定:
PUT _cluster/settings
{
"persistent": {
"apack.qos.limiter.enabled": null
}
}その他のすべてのバージョン — false に設定:
PUT _cluster/settings
{
"persistent" : {
"apack.qos.ratelimit.enabled":"false"
}
}その他のすべてのバージョン — null に設定:
PUT _cluster/settings
{
"persistent" : {
"apack.qos.ratelimit.enabled":null
}
}リミッターの構成(Elasticsearch V7.10 のみ)
このセクションは、Elasticsearch V7.10 クラスターにインストールされた aliyun-qos プラグインにのみ適用されます。
リミッターは、何をスロットルするかおよびその方法を定義します。各リミッターは以下の 2 つの部分で構成されます。
limiters:スロットルの種類およびしきい値(例:
search.qps:1000)tags:スロットルを適用するリソース(例:特定のインデックスまたはノード)
リミッターには、特定のリソースに一致する「共通リミッター」と、** を tags フィールドで使用して該当タイプのすべてのリソースに一致させる「デフォルトリミッター」の 2 種類があります(各リソースに対して個別のリミッターが作成されます)。しきい値に達すると、システムはその後のリクエストを拒否します。
適用前のプレビュー モード
速度制限を適用する前に、watchMode を使用して、安全に構成を検証できます。watchMode を true に設定すると、プラグインはリクエストを実際に拒否することなく、メトリクスに拒否されたリクエスト数を記録します。メトリクスを確認してしきい値が適切であることを確認した後、watchMode を false に設定して、適用モードに切り替えてください。
リミッターの構文
PUT /_qos/limiter/<limiterName>
{
"limiters": {
${action}.${limiter_type}:${threshold}
},
"tags": {
${tagName}:${tagValue}
},
"priority":0,
"params":{
"watchMode":true
}
}リミッターのパラメーター
| パラメーター | 説明 | 有効な値 |
|---|---|---|
action | スロットル対象の操作タイプ。 | write(ドキュメントのインデックス登録または作成)、update、delete、search(クエリ)、search_shards(インデックスのプライマリおよびレプリカシャード数のクエリ) |
limiter_type | スロットルのメトリクス。下記の「リミッターの種類のリファレンス」をご参照ください。 | rate、qps、tps、throughput、thread_count、concurrent_count、max_per_request、max_size_per_request |
threshold | スロットルのしきい値。 | 整数(>= -1)。throughput の場合、単位付き文字列(例:100MB)。 |
tagName | 一致させるリソースタイプ。 | node、is_master、index、shard、index_in_url |
tagValue | タグに対して一致させる値。 | 文字列または配列。完全に一致("abc")、あいまい一致("ab*")、すべての値("**")をサポートします。"**" に設定すると、一致する各リソースに対して個別のリミッターが作成されます。 |
priority | リミッターの優先度。値が大きいほど優先度が高くなります。複数のデフォルトリミッターが一致する場合、最も高い優先度を持つリミッターが適用されます。 | 整数。デフォルト:0。 |
params.watchMode | true の場合、スロットルを実行せずにメトリクスに拒否されたリクエスト数を記録します。適用前のしきい値検証に使用します。 | true または false。デフォルト:false。 |
リミッターの種類のリファレンス
limiter_type | スロットルのメトリクス | 適用可能な action の値 | しきい値の単位 |
|---|---|---|---|
rate | レート | すべて | 整数 |
qps | 秒間クエリ数 | すべて | 整数 |
tps | 秒間トランザクション数 | すべて | 整数 |
throughput | 1 秒あたりのデータ量 | write、update、delete のみ | GB、MB、または KB(最大 2 GB) |
thread_count | 並行スレッド数(デフォルトでは 1 リクエストにつき 1 スレッド) | すべて | 整数 |
concurrent_count | 並行スレッド数(操作単位で計算) | すべて | 整数 |
max_per_request | 1 つのリクエスト内で許可される操作の最大回数 | すべて | 整数 |
max_size_per_request | 1 つのリクエスト内で許可される操作の最大数 | write、update、delete のみ | 整数 |
タグ名のリファレンス
tagName | 説明 |
|---|---|
node | 現在のノードの名前。 |
is_master | 現在のノードが専用マスターノードであるかどうか。tagValue は true または false です。 |
index | インデックスの名前。複数のインデックスを指定する場合は配列を使用できます。インデックスエイリアスは実際の名前に解決されます。IndicesRequest サブリクエストにのみ適用されます。 |
shard | シャード名(index[id] 形式、例:test[0])。ReplicationRequest サブリクエストにのみ適用されます。 |
index_in_url | URL 内のインデックス名の文字列。エイリアスは解決されます。IndicesRequest サブリクエストにのみ適用されます。 |
リミッターの構成例
読み取りリクエストの QPS スロットル
クライアントノードが 1 秒間に受信する検索リクエスト数を制限します。タグ値には、インデックス名の完全一致およびワイルドカードパターンの両方がサポートされます。Elasticsearch V7.10 の場合、index タグキーを使用します。その他のすべてのバージョンでは、index_patterns タグキーを使用します。
Elasticsearch V7.10 — 特定のインデックスをスロットル:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "twitter"
}
}Elasticsearch V7.10 — 名前にプレフィックスを持つインデックスをスロットル:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "nginx-log-*"
}
}Elasticsearch V7.10 — 各インデックスを個別にスロットル(インデックス単位の制限):
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "**"
}
}index:** は、しきい値を各インデックスに個別に適用します。たとえば、クラスターに A、B、C というインデックスがある場合、それぞれが独立して 1,000 QPS で制限されます。Elasticsearch V7.10 — すべてのインデックスにわたる合計 QPS をスロットル:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "*"
}
}index:*は、すべてのインデックスの合計 QPS にしきい値を適用します。tagsフィールドを省略しても、同じ効果が得られます。
その他のすべてのバージョン — 特定のインデックスをスロットル:
PUT _qos/_ratelimit/<limiterName>
{
"search.index_patterns" : "twitter",
"search.max_queries_per_sec" : 1000
}その他のすべてのバージョン — 名前にプレフィックスを持つインデックスをスロットル:
PUT _qos/_ratelimit/<limiterName>
{
"search.index_patterns" : "nginx-log-*",
"search.max_queries_per_sec" : 1000
}その他のすべてのバージョン — すべてのインデックスにわたる合計 QPS をスロットル:
PUT _qos/_ratelimit/<limiterName>
{
"search.index_patterns" : "*",
"search.max_queries_per_sec" : 1000
}複数のルールを同時に有効にできます。リクエストがいずれかのルールに一致した場合、そのリクエストはスロットルされます。
QPS スロットル時のエラー
QPS が設定されたしきい値を超えると、システムは 429 エラーを返します。このエラーを解決するには、クライアント側の QPS を減らしてください。
Elasticsearch V7.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 スロットル
クライアントノードが 1 秒間に受信する書き込みリクエスト数を制限します。タグ値には、インデックス名の完全一致およびワイルドカードパターンの両方がサポートされます。Elasticsearch V7.10 の場合、index タグキーを使用します。その他のすべてのバージョンでは、index_patterns タグキーを使用します。
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"write.tps": "100000"
},
"tags": {
"index": "nginx-log-*"
}
}TPS スロットルは、その他の Elasticsearch バージョンではサポートされていません。
バルク書き込みのスループットのスロットル(1 秒あたりの合計)
クライアントノードに対するすべてのバルクリクエストの 1 秒あたりの合計書き込みバイト数を制限します。「バルク API」をご参照ください。タグ値には、インデックス名の完全一致およびワイルドカードパターンの両方がサポートされます。Elasticsearch V7.10 の場合、index タグキーを使用します。その他のすべてのバージョンでは、index_patterns タグキーを使用します。
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"write.throughput": "100MB"
},
"tags": {
"index": "nginx-log-*"
}
}その他のすべてのバージョン:
PUT _qos/_ratelimit/<limiterName>
{
"bulk.index_patterns": "nginx-log-*",
"bulk.max_throughput_in_bytes" : 104857600
}複数のルールを同時に有効にできます。リクエストがいずれかのルールに一致した場合、そのリクエストはスロットルされます。
バルク書き込みのリクエスト単位サイズのスロットル
クライアントノードに対する 1 つのバルクリクエストで書き込まれる最大バイト数を制限します。「バルク API」をご参照ください。タグ値には、インデックス名の完全一致およびワイルドカードパターンの両方がサポートされます。Elasticsearch V7.10 の場合、index タグキーを使用します。その他のすべてのバージョンでは、index_patterns タグキーを使用します。
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"write.max_size_per_request": "1000"
},
"tags": {
"index": "nginx-log-*"
}
}その他のすべてのバージョン:
PUT _qos/_ratelimit/<limiterName>
{
"bulk.index_patterns": "nginx-log-*",
"bulk.max_request_size_in_bytes" : 1000
}複数のルールを同時に有効にできます。リクエストがいずれかのルールに一致した場合、そのリクエストはスロットルされます。
バルク書き込みサイズのスロットル時のエラー
1 つのバルクリクエストが設定されたサイズしきい値を超えると、システムはそのリクエストを拒否します。
Elasticsearch V7.10 の場合(HTTP 400):
{
"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
}その他のすべてのバージョンの場合(HTTP 413):
{
"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
}このエラーを解決するには、各バルクリクエストのバイト数を減らしてください。
シャード単位の同時クエリのスロットル
プライマリまたはレプリカシャードの数をクエリするために使用される同時スレッド数を制限し、クラスターの負荷を軽減します。タグ値には、インデックス名の完全一致およびワイルドカードパターンの両方がサポートされます。Elasticsearch V7.10 の場合、index タグキーを使用します。その他のすべてのバージョンでは、index_patterns タグキーを使用します。
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search_shards.concurrent_count": "10"
},
"tags": {
"index": "nginx-log-*"
}
}この構成は、その他の Elasticsearch バージョンではサポートされていません。
1 つのリミッターで複数のスロットルルールを構成
1 つのリクエストで、1 つのリミッターに複数のスロットルルールを適用できます。
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000",
"write.tps": "100000",
"write.throughput": "1000000",
"write.max_size_per_request": "1000",
"search_shards.concurrent_count": "10"
},
"tags": {
"index": "nginx-log-*"
}
}複数のルールを同時に有効にできます。リクエストがいずれかのルールに一致した場合、そのリクエストはスロットルされます。
クエリの制限
| 操作 | Elasticsearch V7.10 | その他のすべてのバージョン |
|---|---|---|
| すべてのリミッターを照会 | GET _qos/limiter | GET _qos/_ratelimit |
| 特定のリミッターを照会 | GET _qos/limiter/<limitername> | GET _qos/_ratelimit/<limitername> |
| 複数のリミッターを照会 | GET _qos/limiter/<limitername1,limitername2> | GET _qos/_ratelimit/<limitername1,limitername2> |
複数のリミッター名はカンマで区切ります。ワイルドカードはサポートされていません。
リミッターの削除
| 操作 | Elasticsearch V7.10 | その他のすべてのバージョン |
|---|---|---|
| 特定のリミッターを削除 | DELETE _qos/limiter/<limitername id="7b30adebb6xoj"></limitername> | DELETE _qos/_ratelimit/<limitername id="0eed8d4526kg7"></limitername> |
| 複数のリミッターを削除 | DELETE _qos/limiter/<limitername1,limitername2> | DELETE _qos/_ratelimit/<limitername1,limitername2> |
複数のリミッター名はカンマで区切ります。ワイルドカードはサポートされていません。
スロットルメトリクスのモニタリング
次の API を使用して、スロットルに関するデータを取得できます。スロットルを適用する前に、まず監視モードでこれらの API を実行して、しきい値の妥当性を検証してください。
現在のメトリクス:
# すべてのノード
GET /_qos/limiter/nodes/stats
# 特定のノード
GET /_qos/limiter/nodes/{nodeId}/stats
# 特定のノードおよびリミッター
GET /_qos/limiter/nodes/{nodeId}/stats/{limiterIds}履歴メトリクス:
# すべてのリミッター
GET /_qos/limiter/metric
# 特定のリミッター
GET /_qos/limiter/metric/{limiterId}よくある質問
スロットル構成を適用する前に、安全にテストするにはどうすればよいですか?
リミッターの params 内で watchMode を true に設定します。プラグインは、リクエストを実際に拒否することなく、メトリクスに拒否されたリクエスト数を記録します。モニタリング API を使用してデータを確認した後、watchMode を false に設定して、スロットルを適用してください。