`aliyun-qos` プラグインは、Alibaba Cloud Elasticsearch チームが開発したクラスターレベルの読み取り/書き込み速度制限プラグインです。上流サービスでトラフィックを制御できない場合、`aliyun-qos` プラグインを使用して、ビジネスの優先度に基づいて特定のインデックスの速度を制限できます。これにより、トラフィックを管理可能な状態に保ち、ご利用の Elasticsearch クラスターの安定性を確保できます。
注意事項
`aliyun-qos` プラグインはプリインストールされており、アンインストールはできません。その速度制限機能はデフォルトで無効になっています。このプラグインは、クラスターの安定性を保護するために設計されており、読み取りおよび書き込みトラフィックを正確に測定するためのものではありません。
プラグインのバージョン: `aliyun-qos` プラグインを使用する前に、最新バージョンに更新されていることを確認してください。Kibana コンソールにログインし、
GET /_cat/plugins?vを実行してプラグインのバージョンを確認します。プラグインバージョンは、
<code data-tag="code" id="e636a6365ci3p"><cluster version>_ali<internal version number>のフォーマットです (例:7.10.0_ali1.6.0.2、8.17.0_ali2.2.0.4.1)。プラグインバージョンが最新でない場合は、以下の方法を参照してアップグレードしてください。V7.10 クラスターの場合: コンソールで、カーネルをバージョン 1.6.0 にアップグレードします。詳細については、「クラスターバージョンのアップグレード」をご参照ください。
その他のクラスターバージョンの場合: Alibaba Cloud サポートにチケットを起票してプラグインをアップグレードします。アップグレード後、新しいバージョンを有効にするには、Elasticsearch クラスターを手動で再起動する必要があります。
プラグインのバージョンが rc4 より前の場合、
unsupported_operation_exceptionエラーが発生します。`aliyun-qos` プラグインは、V6.7.0 以降を実行しているクラスターでのみアップグレードできます。それより前のバージョンを実行しているクラスターは、まず V6.7.0 以降にアップグレードする必要があります。
しきい値の評価
`aliyun-qos` プラグインは、クラスターレベルで速度制限を実行します。パフォーマンスのオーバーヘッドを最小限に抑えるため、すべてのノードで読み取りおよび書き込みトラフィックを正確に測定するわけではないため、実際のトラフィックは測定されたトラフィックと異なる場合があります。プラグインを使用する前に、以下のルールに基づいて速度制限のしきい値を評価してください:
クエリリクエスト
クエリリクエストの速度制限しきい値 = クライアントから Elasticsearch へのエンドツーエンドの QPS (クエリ/秒)
エンドツーエンドの QPS は、クライアントノードに 1 秒あたりに到達するクエリリクエストの数のみを指します。
書き込みリクエスト
書き込みリクエストの速度制限しきい値の計算ルールはクエリリクエストのルールと似ていますが、レプリカシャードの数に応じて調整が必要です。
たとえば、2 つのデータノードと 1 つのインデックスを持つクラスターを考えます。インデックスには 1 つのプライマリシャードと 1 つのレプリカシャードがあります。各書き込み操作で 10 MB のデータが送信されます。レプリカシャードが存在するため、各データノードに 10 MB のデータが書き込まれます。さらに、Monitor、Audit、Watcher などの内部 X-Pack タスクも書き込みスループットを消費します。しきい値を設定する際には、このトラフィックのためのキャパシティを確保してください。
速度制限の有効化
`aliyun-qos` プラグインの速度制限機能はデフォルトで無効になっています。使用する前に有効にする必要があります。この機能を有効にするコマンドは、プラグインのバージョンによって異なります。
最新の V7.10 バージョン | その他のバージョン |
| |
速度制限の無効化
リミッターパラメーターを `false` または `null` に設定することで、速度制限機能を無効にできます。コマンドはバージョンによって異なります。
メソッド | 最新の V7.10 バージョン | その他のバージョン |
リミッターパラメーターを `false` に設定 | | |
リミッターパラメーターを `null` に設定 | | |
リミッターの設定 (最新の V7.10 バージョン)
以下のリミッター設定は、V7.10 クラスター用の `aliyun-qos` プラグインにのみ適用されます。
リミッター設定は、`limiters` と `tags` の 2 つの部分で構成されます。`tags` セクションはリソース制限の範囲を定義し、`limiters` セクションは特定の速度制限タイプとしきい値を定義します。リミッターは標準またはデフォルトにすることができます。タグ値を `**` に設定することで、デフォルトリミッターを作成できます。たとえば、各シャードのデフォルトスループットや、各アプリケーションのデフォルト QPS を設定できます。リクエストが制限を超えると、Elasticsearch は後続のリクエストを拒否します。
PUT /_qos/limiter/<limiterName>
{
"limiters": {
${action}.${limiter_type}:${threshold}
},
"tags": {
${tagName}:${tagValue}
},
"priority":0,
"params":{
"watchMode":true
}
}パラメーター | 説明 | 値 |
action | 速度制限の対象となるアクション。異なるタイプのリクエストを制限するために使用されます。 |
|
limiter_type | 速度制限タイプ。レート、同時実行数、リクエストごとの制限の 3 つのカテゴリがサポートされています。 |
|
threshold | 速度制限のしきい値。 | -1 以上の整数。 一部のタイプは単位付きの文字列をサポートしています。詳細については、`limiter_type` の説明をご参照ください。 |
tagName | タグ名。 |
|
tagValue | タグ値。 | 文字列または文字列の配列。配列が使用された場合、タグは配列内のいずれかの値に一致します。完全一致、ワイルドカード付きのプレフィックス一致、およびすべての値がサポートされています。例:
|
priority | リミッターの優先度。 | 整数。デフォルト値: 0。 値が大きいほど優先度が高くなります。リクエストが複数のデフォルトリミッターに一致する場合、最も優先度の高いものだけが有効になります。 |
params | 高度なパラメーター。 |
|
リミッター設定の例
クエリの QPS 速度制限の設定
インデックスにしきい値を設定することで、クライアントノードでのクエリ QPS を制限できます。1 秒あたりのクエリリクエスト数がしきい値を超えると、Elasticsearch は後続のリクエストを拒否します。
`index` と `index_patterns` の値は、完全なインデックス名またはワイルドカード付きの名前にすることができます。コマンドはバージョンによって異なります。
アクション | 最新の V7.10 バージョン | その他のバージョン |
単一インデックスのクエリ QPS 速度制限の設定 | | |
特定の名前プレフィックスを持つインデックスのクエリ QPS 速度制限の設定 | | |
各インデックスに個別にクエリ QPS 速度制限を設定 | | サポートされていません。 |
すべてのインデックスの合計クエリ QPS 制限を設定 |
| |
複数のルールを定義できます。リクエストがいずれかのルールに一致すると、速度制限がトリガーされます。
クエリ QPS が設定された制限を超えると、システムはエラーメッセージを返します。エラーメッセージはバージョンによって異なります:
最新の 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 速度制限の設定
TPS (トランザクション/秒) のしきい値を設定することで、クライアントノードが受信する 1 秒あたりの書き込みリクエスト数を制限できます。1 秒あたりの書き込みリクエスト数がしきい値を超えると、Elasticsearch は後続のリクエストを拒否します。
`index` と `index_patterns` の値は、完全なインデックス名またはワイルドカード付きの名前にすることができます。コマンドはバージョンによって異なります。
最新の V7.10 バージョン | その他のバージョン |
| サポートされていません |
Bulk リクエストのスループット速度制限の設定
クライアントノードでの Bulk API リクエストの書き込みスループットを、バイト/秒で制限を設定することで制限できます。書き込みスループットがこの制限を超えると、Elasticsearch は後続のリクエストを拒否します。
`index` と `index_patterns` の値は、完全なインデックス名またはワイルドカード付きの名前にすることができます。コマンドはバージョンによって異なります。
最新の V7.10 バージョン | その他のバージョン |
| |
複数のルールを定義できます。リクエストがいずれかのルールに一致すると、速度制限がトリガーされます。
Bulk リクエストのリクエストサイズ速度制限の設定
クライアントノードで 1 回の Bulk API リクエストのサイズを制限できます。リクエストがこのサイズ制限を超えると、Elasticsearch はそれを拒否します。
`index` と `index_patterns` の値は、完全なインデックス名またはワイルドカード付きの名前にすることができます。コマンドはバージョンによって異なります。
最新の V7.10 バージョン | その他のバージョン |
| |
複数のルールを定義できます。リクエストがいずれかのルールに一致すると、速度制限がトリガーされます。
1 回の書き込みリクエストのサイズが設定された制限を超えると、システムはエラーメッセージを返します。エラーメッセージはバージョンによって異なります:
最新の V7.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 }
シャードクエリの同時実行数速度制限の設定
同時シャードクエリ数を設定することで、クラスターの負荷を軽減できます。`index` と `index_patterns` の値は、完全なインデックス名またはワイルドカード付きの名前にすることができます。コマンドはバージョンによって異なります。
最新の V7.10 バージョン | その他のバージョン |
| サポートされていません |
複数のルールを定義できます。リクエストがいずれかのルールに一致すると、速度制限がトリガーされます。
複数のリミッター設定
1 つのリミッター設定内に複数の制限を定義できます。`index` と `index_patterns` の値は、完全なインデックス名またはワイルドカード付きの名前にすることができます。コマンドはバージョンによって異なります。
最新の V7.10 バージョン | その他のバージョン |
| サポートされていません |
複数のルールを定義できます。リクエストがいずれかのルールに一致すると、速度制限がトリガーされます。
リミッター設定の取得
リミッター設定を取得するコマンドは、バージョンによって異なります。
アクション | 最新の V7.10 バージョン | その他のバージョン |
すべてのリミッター設定の取得 | | |
指定した単一のリミッター設定の取得 | | |
指定した複数のリミッター設定の取得。複数のリミッター名はカンマ (,) で区切ります。ワイルドカードはサポートされていません。 | | |
リミッター設定の削除
リミッター設定を削除するコマンドは、バージョンによって異なります。
アクション | 最新の V7.10 バージョン | その他のバージョン |
指定した単一のリミッター設定の削除 | | |
指定した複数のリミッター設定の削除。複数のリミッター名はカンマ (,) で区切ります。ワイルドカードはサポートされていません。 | | |
よくある質問
Q: 速度制限に関連する監視メトリクスを取得するにはどうすればよいですか?
A: 以下の 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}
プラグインのアップグレードに関する注意事項
`aliyun-qos` プラグインを最新バージョンにアップグレードする際には、以下の点にご注意ください:
旧バージョンと新バージョンの実装メカニズムの違いにより、アップグレードプロセス中に速度制限機能が一時的に利用できなくなる場合があります。マスターノードのプラグインがアップグレードされると、自動的に復元されます。
データ変換プロセス中に、一部のリミッターが旧フォーマットから変換できない場合があります。変換に失敗した場合は、以下のコマンドを実行して再試行してください。コマンドがエラーを返した場合、`hasError` が `false` になるまで複数回実行できます。
POST /_qos/limiter/ops/upgrade上記のコマンドがエラーメッセージ (例:
unknown action) を返す場合、これはクラスターにレガシーのスロットラーがないことを示します。このメッセージは無視してかまいません。