Restart atau pembaruan kluster Elasticsearch dapat gagal dengan error berikut:
Operasi tidak dapat dilakukan karena kluster tidak sehat atau berisi indeks dalam status close. Kami menyarankan Anda mengulangi operasi tersebut setelah kluster menjadi sehat atau indeks diaktifkan.
Error ini terjadi ketika kluster memenuhi satu atau beberapa kondisi berikut:
-
Kluster berisi indeks dalam status close.
-
Status kesehatan kluster adalah red atau yellow.
-
Kluster sehat tetapi heavily loaded.
Bagian berikut menjelaskan cara mendiagnosis dan mengatasi setiap kondisi tersebut.
Indeks yang ditutup (Closed indexes)
Indeks dalam status close menghalangi restart dan pembaruan kluster. Jalankan perintah berikut untuk memeriksa status indeks:
GET /_cat/indices?v
Contoh output:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size dataset.size
green open my-index-01 30h1EiMvS5uAFr2t5CEVoQ 5 1 820 0 14mb 7mb 7mb
close my-index-02 BJxfAErbTtu5HBjIXJV_7A 1 1
green open my-index-03 _8C6MIXOSxCqVYicH3jsEA 1 1 7 0 24.3kb 12.1kb 12.1kb
Pada contoh ini, my-index-02 berada dalam status close. Buka indeks tersebut dengan perintah berikut:
POST /my-index-02/_open
Ganti my-index-02 dengan nama indeks yang ditutup. Jika terdapat beberapa indeks yang ditutup, buka satu per satu sebelum mencoba kembali restart atau pembaruan.
Status kluster red atau yellow
Status red berarti satu atau lebih shard primary tidak ditugaskan, sehingga pencarian atau pengindeksan pada indeks yang terpengaruh dapat gagal. Status yellow berarti semua shard primary telah ditugaskan, tetapi satu atau lebih shard replika belum ditugaskan, yang meningkatkan risiko kehilangan data.
Mendiagnosis masalah
Periksa status kesehatan kluster:
GET /_cat/health?v
Jika statusnya red atau yellow, identifikasi shard yang tidak ditugaskan:
GET /_cat/shards?v&h=index,shard,prirep,state,node,unassigned.reason&s=state
Untuk memahami mengapa shard tertentu tidak dapat dialokasikan, jalankan:
GET _cluster/allocation/explain
Perintah ini mengembalikan error jika tidak ada shard yang tidak ditugaskan di kluster. Ini merupakan perilaku yang diharapkan.
Contoh output:
{
"index": "my-index-02",
"shard": 0,
"primary": true,
"current_state": "unassigned",
"can_allocate": "no",
"allocate_explanation": "cannot allocate because allocation is not permitted to any of the nodes"
}
Gunakan bidang allocate_explanation untuk mengidentifikasi akar penyebabnya. Penyebab umum dan solusinya dijelaskan di bawah ini.
Upaya alokasi ulang shard telah habis
Shard dialokasikan secara otomatis dengan maksimal lima kali percobaan. Jika semua percobaan telah habis, alokasikan ulang shard secara manual:
POST /_cluster/reroute?retry_failed=true
Shard primary dan replika berada di node yang sama
Jika penjelasan alokasi menyatakan "the shard cannot be allocated to the same node on which a copy of the shard already exists", berarti shard primary dan replika dari suatu indeks berada di node yang sama. Untuk mengatasi hal ini:
-
Tetapkan jumlah shard replika menjadi 0:
PUT /my-index/_settings { "index": { "number_of_replicas": 0 } } -
Setelah status kluster kembali menjadi green, atur kembali jumlah replika menjadi 1:
PUT /my-index/_settings { "index": { "number_of_replicas": 1 } }
Batas maksimum alokasi shard simultan tercapai
Jika kluster telah mencapai batas alokasi shard-nya, tunggu hingga alokasi saat ini selesai. Jika shard tetap tidak ditugaskan setelah beberapa menit, periksa penjelasan alokasi:
GET _cluster/allocation/explain
Node terputus koneksi
Satu atau beberapa node mungkin terputus dari kluster. Periksa status node:
GET _cat/nodes?v
Jika ada node yang tidak muncul dalam output, restart node tersebut dari Konsol Elasticsearch.
Penggunaan disk tinggi
Elasticsearch tidak mengalokasikan shard ke node yang penggunaan disk space-nya melebihi 85%. Setelah penggunaan disk pada node yang terpengaruh turun di bawah 85%, restart node tersebut untuk mengembalikan alokasi shard normal.
Untuk memeriksa penggunaan disk per node:
GET _cat/allocation?v
Untuk mengurangi penggunaan disk:
-
Hapus indeks historis yang tidak diperlukan lagi.
-
Perluas kapasitas disk node.
-
Sementara waktu, atur jumlah shard replika menjadi 0.
Penggunaan memori heap tinggi
Penggunaan memori heap yang tinggi dapat menyebabkan kluster menangguhkan operasi. Untuk membebaskan memori:
-
Terapkan pembatasan kecepatan (throttling) untuk mengurangi lalu lintas masuk.
-
Tutup indeks historis untuk mengurangi konsumsi memori.
Penyebab lainnya
Jika tidak ada penyebab di atas yang berlaku, periksa utilisasi CPU dan penggunaan memori heap di Konsol Elasticsearch. Untuk shard yang tidak ditugaskan, jalankan perintah berikut untuk penjelasan detail:
GET _cluster/allocation/explain
Beban kluster tinggi (Heavy cluster load)
Meskipun kluster sehat (status green), restart atau pembaruan dapat gagal jika kluster sangat sibuk. Periksa metrik berikut untuk mengidentifikasi dan mengatasi masalah terkait beban.
Penggunaan disk mencapai 85%
Diagnosis:
-
Periksa data pemantauan penggunaan disk di Konsol Elasticsearch.
-
Jalankan
GET _cat/allocationuntuk melihat alokasi disk per node. -
Jalankan
GET _cluster/allocation/explainuntuk memeriksa masalah alokasi. -
Periksa log kluster untuk peringatan terkait disk.
Dampak: Saat penggunaan disk mencapai 85%, Elasticsearch berhenti mengalokasikan shard baru ke node yang terpengaruh.
Solusi:
-
Hapus indeks historis yang tidak diperlukan lagi.
-
Perluas kapasitas disk.
-
Sementara waktu, atur jumlah shard replika menjadi 0.
Setelah tindakan diambil, pastikan penggunaan disk telah turun di bawah 85% dalam data pemantauan.
Utilisasi CPU mencapai 85%
Diagnosis:
-
Periksa data pemantauan utilisasi CPU di Konsol Elasticsearch.
-
Tinjau informasi hot thread untuk mengidentifikasi operasi yang intensif CPU.
Dampak: Utilisasi CPU yang tinggi menurunkan stabilitas kluster.
Solusi:
-
Periksa read QPS dan write QPS dalam data pemantauan, lalu kurangi lalu lintas jika memungkinkan.
-
Lakukan scale out kluster dengan menambahkan data node.
-
Tingkatkan konfigurasi kluster menggunakan tipe instans yang lebih besar.
Penggunaan memori heap mencapai atau melebihi 75%
Diagnosis:
-
Periksa data pemantauan penggunaan memori heap di Konsol Elasticsearch.
-
Tinjau log kluster untuk peringatan garbage collection (GC).
-
Periksa metrik old gc collection count dan old gc collecting.ms untuk jeda GC yang panjang.
Dampak: Penggunaan memori heap yang tinggi menurunkan stabilitas kluster dan dapat menyebabkan operasi hang.
Solusi:
-
Kurangi lalu lintas baca dan tulis.
-
Tingkatkan konfigurasi kluster.
-
Tutup indeks historis untuk membebaskan memori heap.
Beban node melebihi jumlah vCPU
Mendiagnosis:
-
Periksa metrik NodeLoad_1m(value) di Konsol Elasticsearch.
-
Nilai yang lebih besar dari jumlah vCPU pada node menunjukkan beban berat.
Dampak: Node yang kelebihan beban dapat menjadi tidak responsif dan memengaruhi operasi kluster.
Solusi:
-
Periksa read QPS, write QPS, dan throughput disk dalam data pemantauan.
-
Kurangi lalu lintas baca atau tulis.
-
Lakukan scale out kluster dengan menambahkan data node.
-
Tingkatkan konfigurasi kluster.
Kesalahan konfigurasi box_type pada arsitektur hot-warm
Diagnosis:
-
Pada arsitektur hot-warm, suatu indeks menggunakan pengaturan
box_typeuntuk menentukan apakah shard-nya dialokasikan ke node panas (hot nodes) atau node hangat (warm nodes). Nilaibox_typeyang salah mencegah alokasi shard dan memperlambat restart atau pembaruan. -
Jalankan
GET /{index_name}/_settingsuntuk memeriksa pengaturanbox_typedalam pengaturan indeks.
Dampak: Jika box_type tidak sesuai dengan tipe node aktual, shard tidak dapat dialokasikan, sehingga memperlambat restart atau pembaruan.
Solusi:
-
Pastikan nilai
box_typesesuai dengan tipe node target: gunakanhotuntuk node panas danwarmuntuk node hangat.
routing menentukan bidang _id
Mendiagnosis:
-
Jika pengaturan
routingsuatu indeks menentukan bidang_id, shard tidak dapat dialokasikan seperti yang diharapkan, sehingga memperlambat restart atau pembaruan. -
Jalankan
GET /{index_name}/_settingsuntuk memeriksa pengaturanindex.routing.
Dampak: Shard gagal dialokasikan secara normal.
Solusi:
-
Jika
routingmenentukan bidang_id, atur nilainya menjadinulluntuk mengembalikan alokasi shard normal.