Ketidakseimbangan beban kluster terjadi ketika beberapa node menangani traffic jauh lebih banyak daripada yang lain, menyebabkan kueri lambat, penundaan pengindeksan, atau kegagalan node. Topik ini mencakup empat penyebab utama ketidakseimbangan beban pada kluster Alibaba Cloud Elasticsearch dan cara mengatasinya.
Gejala
Ketidakseimbangan beban biasanya muncul dalam dua bentuk:
-
Penggunaan disk relatif merata di seluruh node, tetapi utilisasi CPU atau load_1m melonjak pada node tertentu.
-
Penggunaan disk sangat bervariasi di seluruh node, dan utilisasi CPU atau load_1m mengonfirmasi adanya ketidakseimbangan tersebut.
Penyebab
Berdasarkan kemungkinan terjadinya:
-
Alokasi shard yang tidak tepat — penyebab paling umum. Periksa hal ini terlebih dahulu.
-
Ukuran segmen tidak merata — segmen besar pada satu shard memperlambat kueri pada shard tersebut.
-
Data hot dan cold tidak dipisahkan — pengarahan kueri ke node tertentu memusatkan beban.
-
Koneksi persisten tidak merata — jarang terjadi; memengaruhi penerapan multi-zona yang menggunakan Server Load Balancer (SLB).
Jika tidak ada penyebab di atas yang berlaku, hubungi dukungan teknis Alibaba Cloud.
Alokasi Shard yang Tidak Tepat
Skenario
Sebuah kluster memiliki 3 dedicated master node dan 9 data node. Master node: 16 vCPU, memori 32 GiB. Data node: 32 vCPU, memori 64 GiB. Selama jam sibuk (16.21–18.00), kluster menangani ~2.000 QPS baca dan 1.000 QPS tulis. Utilisasi CPU pada dua node mencapai 100%, sehingga menurunkan performa kueri.
Analisis
-
Periksa Instance Elastic Compute Service (ECS) dan pemantauan jaringan. Selama jam sibuk, QPS kueri melonjak dan utilisasi CPU meningkat tajam pada node yang terdampak. Hal ini mengonfirmasi bahwa node berbeban tinggi memproses sebagian besar traffic kueri.
-
Jalankan `GET _cat/shards?v` untuk memeriksa distribusi shard. Output menunjukkan shard dari indeks
testterkonsentrasi pada node berbeban tinggi. Penggunaan disk pada node tersebut juga lebih tinggi. Alokasi shard yang tidak merata menyebabkan penyimpanan tidak merata, dan node dengan lebih banyak data menangani lebih banyak traffic baca dan tulis. -
Jalankan `GET _cat/indices?v` untuk memeriksa konfigurasi indeks. Indeks
testmemiliki 5 primary shard dan 1 replica per primary. Shard tidak terdistribusi secara merata, dan beberapa dokumen ditandai.del. Saat Elasticsearch melakukan pencarian, sistem memindai dokumen yang ditandai.dellalu memfilternya — pekerjaan tambahan yang mengurangi efisiensi pencarian. Jalankan force merge selama jam sepi untuk menghapus dokumen-dokumen tersebut.pri rep docs.count docs.deleted store.size pri.store.size 1 1 8640 0 6.7mb 3.3mb 1 1 8639 0 6.7mb 3.3mb 1 1 8639 0 6.7mb 3.3mb 1 1 297847 488 688.7mb 344.8mb 1 1 93230 364 222.1mb 111mb 1 1 297803 588 693.5mb 346.1mb 1 1 297756 540 697.5mb 348.5mb 1 1 297852 536 687.9mb 343.4mb 1 1 297750 588 693.1mb 344.2mb 1 1 8639 0 6.7mb 3.3mb 1 1 8639 0 6.7mb 3.3mb 1 1 2 0 19.3kb 8.3kb 3 1 0 0 1.1kb 576b 3 1 71888299 15614684 124gb 64.6gb 3 1 0 0 1.1kb 576b 1 1 2661 0 2.2mb 1.1mb 1 1 8639 0 6.7mb 3.3mb 1 1 8639 0 6.6mb 3.3mb 1 1 297732 540 700.5mb 349.9mb 1 1 297795 540 691.6mb 344.7mb -
Tinjau log kluster dan slow log. Semua kueri merupakan term query normal tanpa error pada log kluster. Akar masalahnya adalah distribusi shard, bukan isu pada level kueri.
Akar Masalah
Alokasi shard yang tidak merata memusatkan penyimpanan dan traffic pada sebagian node, menyebabkan ketidakseimbangan CPU.
Setelah dilakukan penyeimbangan ulang shard, utilisasi CPU menjadi merata di seluruh node:

Solusi
Rencanakan jumlah shard sebelum membuat indeks. Lihat Panduan perencanaan shard di bawah.
Panduan Perencanaan Shard
Jumlah dan ukuran shard menentukan stabilitas serta performa kluster. Gunakan panduan berikut saat merencanakan shard untuk setiap indeks.
Pada versi Elasticsearch sebelum 7.x, nilai default adalah 5 primary shard dengan 1 replica per primary. Pada versi 7.x dan seterusnya, nilai default adalah 1 primary shard dengan 1 replica.
|
Batasan |
Panduan |
|
Ukuran shard (node spesifikasi rendah) |
Maksimum 30 GB per shard |
|
Ukuran shard (node spesifikasi tinggi) |
Maksimum 50 GB per shard |
|
Ukuran shard (analitik log atau indeks sangat besar) |
Maksimum 100 GB per shard |
|
Total shard per kluster |
Total primary + replica shard harus sama dengan atau kelipatan jumlah data node |
|
Shard per node |
Ukuran memori (GiB) × 30 — melebihi batas ini berisiko menyebabkan kehabisan file handle |
|
Shard per indeks per node |
Maksimum 5 shard |
Semakin banyak primary shard yang Anda konfigurasikan, semakin tinggi overhead performa pada kluster.
Jika Anda telah mengaktifkan fitur Auto Indexing, gunakan templat konfigurasi berbasis skenario untuk menyesuaikan pengaturan shard dan menjaga distribusi shard tetap merata.
Ukuran Segmen Tidak Merata
Skenario
Satu node dalam kluster mengalami lonjakan tiba-tiba pada utilisasi CPU, sehingga memengaruhi performa kueri. Indeks test memiliki 3 primary shard dan 1 replica per primary, terdistribusi merata di seluruh node. Indeks tersebut berisi banyak dokumen yang ditandai delete.doc. Instance ECS telah dikonfirmasi normal.

Analisis
-
Tambahkan `"profile": true` ke body kueri. Output profiling menunjukkan Shard 1 dari indeks
testmembutuhkan waktu lebih lama untuk dikueri dibandingkan shard lainnya. -
Jalankan kueri dengan `preference=_primary` dan `preference=_replica`, keduanya dengan
"profile": true. Primary shard dari Shard 1 lebih lambat daripada replikanya. Hal ini mengisolasi Shard 1 sebagai penyebabnya. -
Jalankan perintah berikut untuk memeriksa segmen pada Shard 1:
Perbedaan jumlah dokumen antara primary shard dan replikanya dapat terjadi karena dua alasan: - Latensi sinkronisasi: Jika dokumen terus ditulis, replika mungkin sementara tertinggal. Setelah penulisan berhenti, jumlahnya akan konvergen. - ID dokumen yang di-generate otomatis dengan penghapusan bersamaan: Jika Anda menulis dokumen menggunakan ID yang di-generate otomatis dan mengirim permintaan Delete by Query untuk dokumen yang baru saja ditulis, penghapusan tersebut dijalankan pada primary shard sebelum penulisan tersebar ke replika. Replika kemudian menerima penulisan tanpa penghapusan, sehingga memiliki lebih banyak dokumen. Selain itu, primary mengumpulkan dokumen yang ditandai
doc.delete.GET _cat/segments/index?v&h=shard,segment,size,size.memory,ip GET _cat/shards?vOutput menunjukkan Shard 1 memiliki segmen yang lebih besar dan lebih banyak dokumen daripada shard replikanya. Perbedaan ukuran segmen inilah yang menyebabkan ketidakseimbangan beban.
Solusi (pilih salah satu)
-
Selama jam sepi, panggil force merge untuk mengompaksi segmen kecil dan menghapus dokumen
delete.doc. -
Mulai ulang node yang menghost primary shard. Hal ini akan mempromosikan replika menjadi primary dan menghasilkan replika baru darinya, sehingga kedua shard memiliki struktur segmen yang identik.
Setelah dioptimalkan, beban menjadi merata di seluruh node:

Koneksi Persisten Tidak Merata
Penyebab ini jarang terjadi dan khusus untuk penerapan multi-zona.
Skenario
Sebuah kluster diterapkan di dua zona: Zona B dan Zona C. Node di Zona C secara konsisten menanggung beban lebih tinggi daripada node di Zona B. Ketidakseimbangan ini bukan disebabkan oleh perbedaan perangkat keras atau distribusi data yang tidak merata.

Analisis
-
Lihat utilisasi CPU selama 4 hari terakhir. Data pemantauan menunjukkan utilisasi CPU berubah signifikan pada titik waktu tertentu.

-
Periksa koneksi TCP pada setiap node. Jumlah koneksi TCP sangat berbeda antara Zona B dan Zona C, mengarah pada isu distribusi koneksi jaringan.

-
Periksa perilaku koneksi klien. Klien menggunakan koneksi persisten dan membuat sedikit koneksi baru. Pada arsitektur multi-zona, setiap unit penjadwalan secara independen memilih node optimal saat membuat koneksi. Ketika volume koneksi baru rendah, beberapa unit penjadwalan mungkin memilih node yang sama. Selain itu, node klien Elasticsearch cenderung meneruskan permintaan ke node dalam zona yang sama, sehingga memusatkan traffic pada satu zona.
Solusi (pilih salah satu)
-
Tetapkan time-to-live koneksi pada klien. Gunakan
httpClientBuilder.setConnectionTimeToLive()untuk memaksa pembaruan koneksi secara berkala. Misalnya, untuk menetapkan TTL 5 menit:Gunakan
setConnectionTimeToLive()untuk tujuan ini.setKeepAliveStrategy()kurang efektif dalam mendistribusikan ulang koneksi.httpClientBuilder.setConnectionTimeToLive(5, TimeUnit.MINUTES)Untuk detailnya, lihat HttpAsyncClientBuilder.
-
Mulai ulang klien secara bersamaan untuk memaksa pembuatan koneksi baru ke semua node secara simultan.
-
Gunakan dedicated client node untuk mengarahkan traffic. Node klien meneruskan permintaan ke data node, sehingga memisahkan lapisan routing dari lapisan penyimpanan. Bahkan jika node klien menjadi sangat sibuk, data node tidak terpengaruh.
Setelah dioptimalkan, beban terdistribusi merata di seluruh zona:

Shard Tidak Merata untuk Satu Indeks
Skenario
Shard tampak terdistribusi merata di seluruh node, tetapi indeks tertentu memiliki lebih banyak shard — atau shard yang lebih besar — pada node berbeban tinggi.
Solusi
Tetapkan index.routing.allocation.total_shards_per_node untuk membatasi jumlah shard dari satu indeks yang dapat ditempatkan pada satu node.
Hitung nilainya dengan rumus: (primary shard + replica shard) / jumlah data node. Bulatkan ke atas jika hasilnya bukan bilangan bulat.
PUT index_name/_settings
{
"index.routing.allocation.total_shards_per_node": "3"
}