Saat layanan hulu mengirimkan lonjakan lalu lintas baca atau tulis yang tidak dapat Anda kendalikan, plugin aliyun-qos memungkinkan penerapan throttling tingkat kluster untuk melindungi stabilitas Elasticsearch. Plugin ini menurunkan prioritas indeks tertentu serta membatasi queries per second (QPS), transactions per second (TPS), throughput, dan jumlah thread konkuren—memberikan kontrol granular terhadap beban kerja yang diperbolehkan melewati.
Prasyarat
Sebelum memulai, pastikan bahwa:
Plugin aliyun-qos telah diinstal pada kluster Elasticsearch Anda. Periksa halaman Plug-ins di Konsol Elasticsearch. Jika plugin belum diinstal, lihat Instal dan hapus plugin bawaan. Perhatikan bahwa plugin tidak dapat di-uninstall setelah diinstal.
Plugin telah ditingkatkan ke versi terbaru:
Kluster Elasticsearch V7.10:
7.10.0_ali1.6.0.2Versi lainnya:
<ES-version>-rc4
Untuk memeriksa versi saat ini, jalankan perintah berikut di Konsol Kibana:
GET /_cat/plugins?v
Jalur peningkatan:
Kluster Elasticsearch V7.10: Perbarui versi kernel ke V1.6.0. Untuk informasi lebih lanjut, lihat Tingkatkan versi kluster.
Versi lainnya: Kirim tiket untuk menghubungi insinyur teknis Elasticsearch. Setelah peningkatan, restart kluster Anda agar perubahan berlaku.
Jika versi plugin lebih lama dari rc4, sistem akan melaporkan error unsupported_operation_exception. Plugin hanya dapat ditingkatkan pada kluster yang menjalankan Elasticsearch V6.7.0 atau lebih baru. Jika kluster Anda menjalankan versi sebelumnya, tingkatkan kluster terlebih dahulu.Catatan penggunaan
aliyun-qos adalah plugin bawaan dan tidak dapat di-uninstall.

Throttling nonaktif secara default. Aktifkan sebelum digunakan.
Plugin menerapkan throttling pada tingkat kluster tetapi tidak mengukur lalu lintas per node secara tepat. Nilai yang diukur mungkin berbeda dari lalu lintas aktual.
Sebelum meningkatkan ke versi terbaru, perhatikan hal berikut:
Throttling mungkin tidak efektif untuk periode singkat selama proses peningkatan. Fungsionalitas ini pulih setelah node master khusus ditingkatkan.
Beberapa limiter mungkin gagal ditingkatkan. Jika hal ini terjadi, jalankan perintah berikut. Ulangi hingga
hasErrormengembalikan nilaifalse.POST /_qos/limiter/ops/upgrade
Jika perintah tidak mengembalikan hasil apa pun, semua limiter sudah berada pada versi terbaru.
Evaluasi ambang batas
Sebelum mengonfigurasi limiter, perkirakan ambang batas throttling yang sesuai menggunakan aturan berikut.
Permintaan kueri (baca):
Ambang batas throttling = QPS end-to-end dari klien ke Elasticsearch (jumlah permintaan kueri yang dikirim ke node klien per detik).
Permintaan Penulisan:
Gunakan perhitungan yang sama seperti untuk permintaan kueri, lalu sesuaikan dengan jumlah shard replika.
Contohnya: sebuah kluster dengan dua node data menyimpan satu indeks yang memiliki satu shard utama dan satu shard replika, serta menulis 10 MB per operasi. Karena adanya shard replika, setiap node data menerima 10 MB per operasi tulis. Pertimbangkan juga lalu lintas tulis yang dihasilkan oleh X-Pack Monitor, Audit, dan Watcher saat menetapkan ambang batas.
Aktifkan throttling
Throttling dinonaktifkan secara default. Aktifkan dengan menjalankan perintah yang sesuai di Konsol Kibana berdasarkan versi kluster Anda.
Semua perintah dalam topik ini dapat dijalankan di Konsol Kibana.
Elasticsearch V7.10 (versi plugin terbaru):
PUT _cluster/settings
{
"persistent": {
"apack.qos.limiter.enabled": true
}
}Versi Elasticsearch lainnya:
PUT _cluster/settings
{
"persistent" : {
"apack.qos.ratelimit.enabled":"true"
}
}Nonaktifkan throttling
Tetapkan parameter throttling ke false atau null untuk menonaktifkannya.
Elasticsearch V7.10 — tetapkan ke `false`:
PUT _cluster/settings
{
"persistent": {
"apack.qos.limiter.enabled": false
}
}Elasticsearch V7.10 — tetapkan ke `null`:
PUT _cluster/settings
{
"persistent": {
"apack.qos.limiter.enabled": null
}
}Versi lainnya — tetapkan ke `false`:
PUT _cluster/settings
{
"persistent" : {
"apack.qos.ratelimit.enabled":"false"
}
}Versi lainnya — tetapkan ke `null`:
PUT _cluster/settings
{
"persistent" : {
"apack.qos.ratelimit.enabled":null
}
}Konfigurasi limiter (khusus Elasticsearch V7.10)
Bagian ini hanya berlaku untuk plugin aliyun-qos yang diinstal pada kluster Elasticsearch V7.10.
Limiter mendefinisikan apa yang akan dibatasi dan bagaimana caranya. Setiap limiter terdiri dari dua bagian:
limiters: jenis dan ambang batas throttling (misalnya,
search.qps:1000)tags: resource yang akan dikenai throttling (misalnya, indeks atau node tertentu)
Limiter tersedia dalam dua jenis: limiter umum (mencocokkan resource tertentu) dan limiter default (menggunakan ** pada bidang tags untuk mencocokkan semua resource dari suatu jenis dan membuat limiter terpisah untuk masing-masing). Saat ambang batas tercapai, sistem akan menolak permintaan berikutnya.
Mode pratinjau sebelum penerapan
Sebelum menerapkan throttling, gunakan watchMode untuk memvalidasi konfigurasi Anda secara aman. Saat watchMode diatur ke true, plugin mencatat jumlah permintaan yang ditolak dalam metrik tanpa benar-benar menolak permintaan tersebut. Tinjau metrik untuk memastikan ambang batas sesuai, lalu beralih ke mode penerapan dengan mengatur watchMode ke false.
Sintaksis limiter
PUT /_qos/limiter/<limiterName>
{
"limiters": {
${action}.${limiter_type}:${threshold}
},
"tags": {
${tagName}:${tagValue}
},
"priority":0,
"params":{
"watchMode":true
}
}Parameter limiter
| Parameter | Deskripsi | Nilai yang valid |
|---|---|---|
action | Jenis operasi yang akan dibatasi. | write (indeks atau buat dokumen), update, delete, search (kueri), search_shards (kueri jumlah shard utama dan replika untuk suatu indeks) |
limiter_type | Metrik throttling. Lihat referensi jenis limiter di bawah. | rate, qps, tps, throughput, thread_count, concurrent_count, max_per_request, max_size_per_request |
threshold | Ambang batas throttling. | Bilangan bulat >= -1. Untuk throughput, berupa string dengan satuan (misalnya, 100MB). |
tagName | Jenis resource yang akan dicocokkan. | node, is_master, index, shard, index_in_url |
tagValue | Nilai yang akan dicocokkan terhadap tag. | String atau array. Mendukung pencocokan eksak ("abc"), pencocokan kabur ("ab*"), dan semua nilai ("**"). Saat diatur ke "**", limiter terpisah dibuat untuk setiap resource yang cocok. |
priority | Prioritas limiter. Nilai yang lebih tinggi memiliki prioritas lebih besar. Saat beberapa limiter default cocok, yang memiliki prioritas tertinggi yang berlaku. | Bilangan bulat. Default: 0. |
params.watchMode | Saat true, mencatat jumlah permintaan yang ditolak dalam metrik tanpa menerapkan throttling. Gunakan ini untuk memvalidasi ambang batas sebelum penerapan. | true atau false. Default: false. |
Referensi jenis limiter
limiter_type | Metrik Throttling | Nilai action yang berlaku | Satuan ambang batas |
|---|---|---|---|
rate | Tarif | Semua | Bilangan bulat |
qps | Queries per second | Semua | Bilangan bulat |
tps | Transactions per second | Semua | Bilangan bulat |
throughput | Volume data per detik | write, update, delete saja | GB, MB, atau KB (maks 2 GB) |
thread_count | Thread konkuren (satu thread per permintaan secara default) | Semua | Bilangan bulat |
concurrent_count | Thread konkuren (dihitung per operasi) | Semua | Bilangan bulat |
max_per_request | Maksimum kali suatu operasi diizinkan dalam satu permintaan | Semua | Bilangan bulat |
max_size_per_request | Operasi maksimum dalam satu permintaan | write, update, delete saja | Bilangan bulat |
Referensi nama tag
tagName | Deskripsi |
|---|---|
node | Nama node saat ini. |
is_master | Apakah node saat ini merupakan node master khusus. Nilai tagValue adalah true atau false. |
index | Nama suatu indeks. Menerima array untuk beberapa indeks. Menyelesaikan alias indeks ke nama aktual. Hanya berlaku untuk subpermintaan IndicesRequest. |
shard | Nama shard dalam format index[id] (misalnya, test[0]). Hanya berlaku untuk subpermintaan ReplicationRequest. |
index_in_url | String nama indeks dalam URL. Menyelesaikan alias. Hanya berlaku untuk subpermintaan IndicesRequest. |
Contoh konfigurasi limiter
Batasi QPS untuk permintaan baca
Batasi jumlah permintaan pencarian yang diterima node klien per detik. Baik nama indeks eksak maupun pola wildcard didukung untuk nilai tag. Untuk Elasticsearch V7.10, gunakan kunci tag index; untuk versi lainnya, gunakan kunci tag index_patterns.
Elasticsearch V7.10 — batasi indeks tertentu:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "twitter"
}
}Elasticsearch V7.10 — batasi indeks dengan awalan nama:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "nginx-log-*"
}
}Elasticsearch V7.10 — batasi setiap indeks secara individual (batas per indeks):
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "**"
}
}index:** menerapkan ambang batas pada setiap indeks secara terpisah. Misalnya, jika kluster memiliki indeks A, B, dan C, masing-masing dibatasi hingga 1.000 QPS secara independen.Elasticsearch V7.10 — batasi total QPS di semua indeks:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "*"
}
}index:*menerapkan ambang batas pada QPS gabungan semua indeks. Anda juga dapat menghilangkan bidangtagsuntuk mencapai efek yang sama.
Versi lainnya — batasi indeks tertentu:
PUT _qos/_ratelimit/<limiterName>
{
"search.index_patterns" : "twitter",
"search.max_queries_per_sec" : 1000
}Versi lainnya — batasi indeks dengan awalan nama:
PUT _qos/_ratelimit/<limiterName>
{
"search.index_patterns" : "nginx-log-*",
"search.max_queries_per_sec" : 1000
}Versi lainnya — batasi total QPS di semua indeks:
PUT _qos/_ratelimit/<limiterName>
{
"search.index_patterns" : "*",
"search.max_queries_per_sec" : 1000
}Beberapa aturan dapat aktif secara bersamaan. Permintaan akan dibatasi jika cocok dengan salah satu aturan.
Error pembatasan QPS
Jika QPS melebihi ambang batas yang dikonfigurasi, sistem mengembalikan error 429. Kurangi QPS di sisi klien untuk mengatasi error ini.
Untuk 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
}Untuk versi lainnya:
{
"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
}Batasi TPS untuk permintaan tulis
Batasi jumlah permintaan tulis yang diterima node klien per detik. Baik nama indeks eksak maupun pola wildcard didukung untuk nilai tag. Untuk Elasticsearch V7.10, gunakan kunci tag index; untuk versi lainnya, gunakan kunci tag index_patterns.
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"write.tps": "100000"
},
"tags": {
"index": "nginx-log-*"
}
}Pembatasan TPS tidak didukung untuk versi Elasticsearch lainnya.
Batasi throughput tulis bulk (total per detik)
Batasi total byte yang ditulis per detik di semua permintaan bulk ke node klien. Untuk informasi lebih lanjut tentang permintaan bulk, lihat Bulk API. Baik nama indeks eksak maupun pola wildcard didukung untuk nilai tag. Untuk Elasticsearch V7.10, gunakan kunci tag index; untuk versi lainnya, gunakan kunci tag index_patterns.
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"write.throughput": "100MB"
},
"tags": {
"index": "nginx-log-*"
}
}Versi lainnya:
PUT _qos/_ratelimit/<limiterName>
{
"bulk.index_patterns": "nginx-log-*",
"bulk.max_throughput_in_bytes" : 104857600
}Beberapa aturan dapat aktif secara bersamaan. Permintaan akan dibatasi jika cocok dengan salah satu aturan.
Batasi ukuran tulis bulk per permintaan
Batasi byte maksimum yang ditulis dalam satu permintaan bulk ke node klien. Untuk informasi lebih lanjut tentang permintaan bulk, lihat Bulk API. Baik nama indeks eksak maupun pola wildcard didukung untuk nilai tag. Untuk Elasticsearch V7.10, gunakan kunci tag index; untuk versi lainnya, gunakan kunci tag index_patterns.
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"write.max_size_per_request": "1000"
},
"tags": {
"index": "nginx-log-*"
}
}Versi lainnya:
PUT _qos/_ratelimit/<limiterName>
{
"bulk.index_patterns": "nginx-log-*",
"bulk.max_request_size_in_bytes" : 1000
}Beberapa aturan dapat aktif secara bersamaan. Permintaan akan dibatasi jika cocok dengan salah satu aturan.
Error pembatasan ukuran tulis bulk
Jika satu permintaan bulk melebihi ambang batas ukuran yang dikonfigurasi, sistem akan menolaknya.
Untuk 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
}Untuk versi lainnya (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
}Kurangi jumlah byte dalam setiap permintaan bulk untuk mengatasi error ini.
Batasi kueri shard konkuren
Batasi jumlah thread konkuren yang digunakan untuk mengkueri jumlah shard utama atau replika guna mengurangi beban kluster. Baik nama indeks eksak maupun pola wildcard didukung untuk nilai tag. Untuk Elasticsearch V7.10, gunakan kunci tag index; untuk versi lainnya, gunakan kunci tag index_patterns.
Elasticsearch V7.10:
PUT /_qos/limiter/<limiterName>
{
"limiters": {
"search_shards.concurrent_count": "10"
},
"tags": {
"index": "nginx-log-*"
}
}Konfigurasi ini tidak didukung untuk versi Elasticsearch lainnya.
Konfigurasi beberapa aturan throttle dalam satu limiter
Terapkan beberapa aturan throttling ke satu limiter dalam satu permintaan.
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-*"
}
}Beberapa aturan dapat aktif secara bersamaan. Permintaan akan dibatasi jika cocok dengan salah satu aturan.
Kueri limiter
| Operasi | Elasticsearch V7.10 | Versi lainnya |
|---|---|---|
| Kueri semua limiter | GET _qos/limiter | GET _qos/_ratelimit |
| Kueri limiter tertentu | GET _qos/limiter/<limitername></limitername> | GET _qos/_ratelimit/<limitername></limitername> |
| Kueri beberapa limiter | GET _qos/limiter/<limitername1,limitername2></limitername1,limitername2> | GET _qos/_ratelimit/<limitername1,limitername2></limitername1,limitername2> |
Pisahkan beberapa nama limiter dengan koma. Wildcard tidak didukung.
Hapus limiter
| Operasi | Elasticsearch V7.10 | Versi lainnya |
|---|---|---|
| Hapus limiter tertentu | DELETE _qos/limiter/<limitername></limitername> | DELETE _qos/_ratelimit/<limitername id="0eed8d4526kg7"></limitername> |
| Hapus beberapa limiter | DELETE _qos/limiter/<limitername1,limitername2></limitername1,limitername2> | DELETE _qos/_ratelimit/<limitername1,limitername2></limitername1,limitername2> |
Pisahkan beberapa nama limiter dengan koma. Wildcard tidak didukung.
Pantau metrik throttling
Gunakan API berikut untuk mengambil data throttling. Jalankan API ini terlebih dahulu dalam mode watch untuk memvalidasi ambang batas sebelum menerapkan throttling.
Metrik saat ini:
# Semua node
GET /_qos/limiter/nodes/stats
# Node tertentu
GET /_qos/limiter/nodes/{nodeId}/stats
# Node dan limiter tertentu
GET /_qos/limiter/nodes/{nodeId}/stats/{limiterIds}Metrik historis:
# Semua limiter
GET /_qos/limiter/metric
# Limiter tertentu
GET /_qos/limiter/metric/{limiterId}FAQ
Bagaimana cara menguji konfigurasi throttling secara aman sebelum menerapkannya?
Tetapkan watchMode ke true dalam params limiter. Plugin akan mencatat jumlah permintaan yang ditolak dalam metrik tanpa menolak permintaan tersebut. Gunakan API pemantauan untuk meninjau data, lalu tetapkan watchMode ke false untuk menerapkan throttling.