Elasticsearch Dalam Produksi - Penerapan Praktik Terbaik

Elasticsearch adalah mesin pencari yang sangat dioptimalkan untuk analitik data modern.

Elasticsearch adalah mesin pencari dan analisis waktu nyata yang menakjubkan. Itu dibangun di atas Apache Lucene. Ini didistribusikan, tenang, mudah digunakan dan sangat tersedia. Kasus penggunaan Elasticsearch termasuk memberi daya pada pencarian, pemantauan transaksi dan deteksi kesalahan, penemuan konten, analisis log, pencarian fuzzy, agregasi data acara, visualisasi data. Elasticsearch dan sisanya dari Elastic Stack telah terbukti sangat fleksibel, dan seperti yang dapat Anda lihat di atas kasus penggunaan, ada beberapa cara untuk mengintegrasikan Elasticsearch ke dalam apa yang produk Anda berikan hari ini dan menambah wawasan tambahan untuk itu.

Kami sangat menggunakannya untuk pencarian dan analitik di Botmetric, kami mengindeks sekitar satu miliar dokumen sehari dan kami menggunakan agregasi yang sangat kompleks untuk visualisasi data secara realtime.

Yang mengatakan, bootstrap aplikasi vs menjalankannya dalam produksi dan pemeliharaan sama sekali berbeda. Aricle ini mencakup banyak faktor ini dari pengalaman kehidupan nyata dan merupakan barang umum dasar yang harus Anda pertimbangkan untuk menjalankan Elasticsearch dalam produksi.

Ingatan:

Elasticsearch dan Lucene ditulis dalam Java, yang berarti Anda harus melihat statistik heapspace dan JVM. Semakin banyak tumpukan yang tersedia untuk Elasticsearch, semakin banyak memori yang dapat digunakan untuk filter dan caching lainnya untuk meningkatkan kinerja kueri. Tetapi perhatikan bahwa terlalu banyak tumpukan dapat menyebabkan Anda mengumpulkan sampah lama. Jangan atur Xmx ke atas cutoff yang digunakan JVM untuk pointer objek terkompresi (oops terkompresi); cutoff yang tepat bervariasi tetapi dekat 32 GB.

Masalah umum adalah mengonfigurasi tumpukan yang terlalu besar. Anda memiliki mesin 64 GB - dan tentu saja, Anda ingin memberikan Elasticsearch semua memori 64 GB. Lebih banyak lebih baik! Heap jelas penting bagi Elasticsearch. Ini digunakan oleh banyak struktur data dalam memori untuk menyediakan operasi cepat. Tetapi dengan itu, ada pengguna utama memori yang tidak aktif: cache file OS.

Lucene dirancang untuk memanfaatkan OS yang mendasari untuk caching struktur data dalam memori. Segmen Lucene disimpan dalam file individual. Karena segmen tidak dapat diubah, file-file ini tidak pernah berubah. Ini membuat mereka sangat ramah terhadap cache, dan OS yang mendasarinya akan dengan senang hati menyimpan segmen-segmen panas dalam memori untuk akses yang lebih cepat. Segmen-segmen ini mencakup indeks terbalik (untuk pencarian teks lengkap) dan nilai dokumen (untuk agregasi). Kinerja Lucene bergantung pada interaksi ini dengan OS. Tetapi jika Anda memberikan semua memori yang tersedia ke tumpukan Elasticsearch, tidak akan ada yang tersisa untuk cache file OS. Ini serius dapat mempengaruhi kinerja. Rekomendasi standar adalah untuk memberikan 50% dari memori yang tersedia ke tumpukan Elasticsearch, sementara meninggalkan 50% lainnya gratis. Itu tidak akan hilang; Lucene akan dengan senang hati mengonsumsi apa pun yang tersisa untuk cache file. Tumpukan Elasticsearch dapat dikonfigurasi dengan cara berikut,

ekspor ES_HEAP_SIZE = 10g

atau

ES_JAVA_OPTS = "- Xms10g -Xmx10g" ./bin/elasticsearch

CPU:

Elasticsearch mendukung agregasi dan kueri yang difilter. Menjalankan kueri yang difilter kompleks, pengindeksan intensif, perkolasi, dan kueri terhadap indeks membutuhkan CPU yang berat, jadi mengambil yang benar sangat penting. Seseorang harus memahami spesifikasi CPU dan bagaimana mereka berperilaku dengan Java ketika query dijalankan pada JVM.

Setiap kumpulan menjalankan sejumlah utas, yang dapat dikonfigurasi, dan memiliki antrian. Mengubah ini tidak disarankan kecuali Anda memiliki persyaratan yang sangat spesifik karena Elasticsearch mengalokasikan core secara dinamis.

Jenis pool benang:

Elasticsearch memiliki 3 jenis kumpulan Thread.

  1. Cached: Cached thread pool adalah thread pool yang tidak terikat yang akan menelurkan thread jika ada permintaan yang tertunda. Kumpulan utas ini digunakan untuk mencegah permintaan yang dikirimkan ke kumpulan ini agar tidak diblokir atau ditolak. Utas yang tidak digunakan di kumpulan utas ini akan diakhiri setelah tetap hidup kedaluwarsa (default hingga lima menit). Pool thread dalam cache dicadangkan untuk pool thread umum.
  2. Tetap: Kumpulan utas tetap memiliki ukuran utas tetap untuk menangani permintaan dengan antrian (opsional dibatasi) untuk permintaan yang tertunda yang tidak memiliki utas untuk melayani mereka. Parameter ukuran mengontrol jumlah utas, dan default ke jumlah inti kali 5.
  3. Penskalaan: Kelompok penskalaan penskalaan menampung jumlah utas yang dinamis. Angka ini sebanding dengan beban kerja dan bervariasi antara 1 dan nilai parameter ukuran.

Elasticsearch membagi penggunaan CPU ke dalam kumpulan thread dari berbagai jenis:

  • generik: untuk operasi standar seperti penemuan dan tipe kumpulan thread di-cache.
  • index: untuk operasi index / delete. Jenis pool thread sudah diperbaiki.
  • search: untuk operasi penghitungan / pencarian. Jenis pool thread sudah diperbaiki.
  • dapatkan: untuk mendapatkan operasi. Jenis pool thread sudah diperbaiki.
  • bulk: untuk operasi massal seperti pengindeksan massal. Jenis pool thread sudah diperbaiki. Konfigurasi dokumen massal terbaik tergantung pada konfigurasi cluster, ini dapat diidentifikasi dengan mencoba beberapa nilai.
  • perkolasi: untuk perkolasi. Jenis pool thread sudah diperbaiki.
  • refresh: Untuk operasi refresh. Jenis pool thread adalah penskalaan.

Mengubah kumpulan utas tertentu dapat dilakukan dengan mengatur parameter tipe-spesifiknya.

Baca selengkapnya https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-threadpool.html#types

Ukuran beling:

Shard adalah unit di mana Elasticsearch mendistribusikan data dalam cluster. Kecepatan di mana Elasticsearch dapat memindahkan pecahan saat menyeimbangkan kembali data, mis. setelah kegagalan, akan tergantung pada ukuran dan jumlah pecahan serta kinerja jaringan dan disk.

Di Elasticsearch, setiap kueri dieksekusi dalam utas tunggal per shard. Namun, beberapa pecahan dapat diproses secara paralel, seperti halnya beberapa kueri dan agregasi terhadap pecahan yang sama.

Ini berarti bahwa latensi kueri minimum, ketika tidak ada caching yang terlibat, akan tergantung pada data, jenis kueri, serta ukuran beling. Menanyakan banyak pecahan kecil akan membuat pemrosesan per pecahan lebih cepat, tetapi karena lebih banyak tugas yang harus di-antri dan diproses secara berurutan, itu tidak selalu akan lebih cepat daripada menanyakan sejumlah kecil pecahan yang lebih besar. Memiliki banyak pecahan kecil juga dapat mengurangi throughput kueri jika ada beberapa kueri bersamaan.

Setiap pecahan memiliki data yang perlu disimpan dalam memori dan menggunakan ruang tumpukan. Ini termasuk struktur data yang menyimpan informasi di tingkat beling dan juga di tingkat segmen untuk menentukan di mana data berada pada disk. Ukuran struktur data ini tidak tetap dan akan bervariasi tergantung pada kasus penggunaan. Namun, satu karakteristik penting dari overhead terkait segmen adalah tidak sepenuhnya proporsional dengan ukuran segmen. Ini berarti bahwa segmen yang lebih besar memiliki lebih sedikit overhead per volume data dibandingkan dengan segmen yang lebih kecil. Perbedaannya bisa sangat besar. Memilih jumlah pecahan yang tepat itu rumit karena Anda tidak pernah tahu berapa banyak dokumen yang akan Anda dapatkan sebelum Anda mulai. Memiliki banyak pecahan bisa baik dan mengerikan untuk sebuah cluster. Indeks dan manajemen pecahan dapat membebani master node, yang mungkin menjadi tidak responsif, menyebabkan beberapa perilaku aneh dan tidak menyenangkan. Alokasikan node master Anda sumber daya yang cukup untuk mengatasi ukuran cluster.

Yang buruk adalah bahwa jumlah pecahan tidak berubah dan ditentukan ketika Anda membuat indeks. Setelah indeks dibuat, satu-satunya cara untuk mengubah jumlah pecahan adalah dengan menghapus indeks Anda, membuatnya lagi, dan mengindeks ulang.

Replikasi

Elasticsearch mendukung replikasi, data direplikasi di antara simpul-simpul data sehingga hilangnya simpul tidak akan menyebabkan hilangnya data. Secara default faktor replikasi adalah 1, tetapi tergantung pada persyaratan produk Anda, itu dapat ditingkatkan. Semakin banyak replika, data Anda akan lebih tahan terhadap bencana. Keuntungan lain dari memiliki lebih banyak replika adalah bahwa setiap simpul memiliki replika beling, yang meningkatkan kinerja kueri karena replika juga digunakan untuk kueri.

Rumus replikasi yang digunakan oleh Elasticsearch untuk konsistensi adalah,

(primary + number_of_replicas) / 2 + 1

Mengoptimalkan alokasi

Berdasarkan persyaratan data produk, kami dapat mengklasifikasikan data menjadi panas dan dingin. Indeks yang diakses lebih sering daripada yang lain, dapat dialokasikan lebih banyak data node sementara indeks yang lebih jarang diakses indeks dapat memiliki lebih sedikit sumber daya yang dialokasikan. Strategi ini sangat berguna untuk menyimpan data deret waktu seperti log aplikasi (misalnya: ELK).

Ini dapat dicapai dengan menjalankan cronjob yang memindahkan indeks ke node yang berbeda secara berkala.

Node panas adalah jenis data yang melakukan semua pengindeksan dalam cluster. Mereka juga memegang indeks terbaru karena ini umumnya cenderung paling sering ditanyakan. Karena pengindeksan adalah operasi intensif CPU dan IO, server ini harus kuat dan didukung oleh penyimpanan SSD yang terpasang. Kami merekomendasikan menjalankan minimal 3 node Panas untuk ketersediaan tinggi. Bergantung pada jumlah data terbaru yang ingin Anda kumpulkan dan kueri, Anda mungkin perlu menambah angka ini untuk mencapai sasaran kinerja Anda.

Warm node adalah jenis data node yang dirancang untuk menangani sejumlah besar indeks read-only yang tidak cenderung sering ditanyakan. Karena indeks ini hanya baca, node hangat cenderung menggunakan disk yang terpasang besar (biasanya disk yang berputar) alih-alih SSD. Seperti hot node, kami merekomendasikan minimal 3 Warm node untuk ketersediaan tinggi. Dan seperti sebelumnya, dengan peringatan bahwa jumlah data yang lebih besar mungkin memerlukan node tambahan untuk memenuhi persyaratan kinerja. Perhatikan juga bahwa konfigurasi CPU dan memori sering kali perlu dicerminkan dari hot node Anda. Ini hanya dapat ditentukan dengan menguji dengan pertanyaan yang mirip dengan apa yang akan Anda alami dalam situasi produksi.

Untuk detail lebih lanjut tentang simpul panas dan hangat lihat di sini.

Strategi lain yang dapat Anda beradaptasi adalah, pengarsipan indeks ke s3 dan memulihkan ketika Anda membutuhkan data dari indeks tersebut. Anda dapat membaca lebih lanjut tentang ini dari sini.

Topologi Node:

Node Elasticsearch dapat dibagi menjadi tiga kategori master node, node data, node klien.

  1. Master node: Master node bisa kecil jika bukan merupakan simpul Data juga karena tidak menyimpan indeks / pecahan. Tanggung jawabnya adalah menyimpan status kluster terperinci dan membantu data dan node lain dalam pencarian indeks / pecahan meta-data. Elasticsearch harus memiliki beberapa master node untuk menghindari masalah otak terpecah.
  2. Node data: Node data bertanggung jawab untuk menyimpan / menanyakan data indeks aktual.
  3. Node klien: Node klien digunakan sebagai proxy untuk pengindeksan dan pencarian. Ini sangat dianjurkan jika agregasi banyak digunakan. Ini adalah node ElasticSearch khusus yang tidak memenuhi syarat data atau master. Node klien sadar cluster dan karenanya dapat bertindak sebagai penyeimbang beban cerdas. Anda dapat mengirim pertanyaan Anda ke node klien yang kemudian dapat mengambil tugas mahal mengumpulkan tanggapan ke hasil permintaan dari masing-masing node data.

tambahkan pengaturan ini ke file elasticsearch.yml untuk masing-masing node.

Master node: node.master: true node.data:false
Node data: node.master: false node.data:true
Node klien: node.master: false node.data:false

Kiat pemecahan masalah:

Kinerja Elasticsearch sangat bergantung pada mesin yang diinstal. CPU, Memory Usage, dan Disk I / O adalah metrik sistem operasi dasar untuk setiap node Elasticsearch. Disarankan agar Anda melihat ke metrik Java Virtual Machine (JVM) saat penggunaan CPU melonjak. Dalam contoh berikut, alasan lonjakan itu adalah aktivitas pengumpulan sampah yang lebih tinggi.

  1. Tekanan heap: Tekanan memori tinggi bekerja terhadap kinerja cluster dalam dua cara: Saat tekanan memori naik hingga 75% ke atas, lebih sedikit memori yang tersisa, dan cluster Anda sekarang juga perlu menghabiskan beberapa sumber daya CPU untuk mendapatkan kembali memori melalui pengumpulan sampah. Siklus CPU ini tidak tersedia untuk menangani permintaan pengguna saat pengumpulan sampah aktif. Akibatnya, waktu respons untuk permintaan pengguna meningkat seiring dengan semakin terbatasnya sumber daya sistem. Jika tekanan memori terus meningkat dan mencapai mendekati 100%, bentuk pengumpulan sampah yang jauh lebih agresif digunakan, yang pada gilirannya akan mempengaruhi waktu respons klaster secara dramatis. Metrik Index Response Times menunjukkan bahwa tekanan memori tinggi mengarah ke dampak kinerja yang signifikan.
  2. Pertumbuhan dalam memori non-heap JVM, menggerogoti memori yang dimaksudkan untuk cache halaman dan mungkin menyebabkan menuai OOM tingkat kernel.
  3. Hindari masalah otak terpecah. Otak terbelah adalah skenario di mana gugus terbelah. Misalnya, Anda memiliki 6 node cluster. 2 node terputus dari cluster, tetapi mereka masih dapat saling melihat. 2 node ini kemudian membuat cluster lain. Mereka bahkan akan memilih master baru di antara mereka sendiri. Kami sekarang memiliki dua cluster dengan nama yang sama, satu dengan 4 node dan lainnya dengan 2 node. Masing-masing memiliki simpul utama juga. Inilah yang disebut masalah otak terbelah dengan kluster ES. Untuk menghindarinya, setel parameter ES discovery.zen.minimum_master_nodes menjadi setengah dari jumlah node +1.
  4. Karena Elasticsearch banyak menggunakan perangkat penyimpanan, pemantauan I / O disk memastikan bahwa kebutuhan dasar ini terpenuhi. Ada banyak alasan untuk mengurangi I / O disk, yang dianggap sebagai metrik kunci untuk memprediksi berbagai jenis masalah. Ini adalah metrik yang baik untuk memeriksa efektivitas kinerja pengindeksan dan permintaan. Menganalisis operasi baca dan tulis secara langsung menunjukkan apa yang paling dibutuhkan sistem dalam kasus penggunaan khusus. Pengaturan sistem operasi untuk disk I / O adalah basis untuk semua optimasi lainnya, menyetel disk I / O dapat menghindari masalah potensial. Jika I / O disk masih tidak mencukupi, tindakan pencegahan seperti mengoptimalkan jumlah pecahan dan ukurannya, pembatasan gabungan, penggantian disk yang lambat, pindah ke SSD, atau menambahkan lebih banyak node harus dievaluasi sesuai dengan keadaan yang menyebabkan I / O kemacetan.
  5. Untuk aplikasi yang mengandalkan pencarian, pengalaman pengguna sangat berkorelasi dengan latensi permintaan pencarian. Ada banyak hal yang dapat memengaruhi kinerja kueri, seperti kueri yang dikonstruksi, gugus Elasticsearch yang tidak dikonfigurasi dengan benar, memori JVM dan masalah pengumpulan sampah, disk IO, dan sebagainya. Latensi kueri adalah metrik yang berdampak langsung pada pengguna, jadi pastikan Anda memberi peringatan.
  6. Sebagian besar filter di Elasticsearch di-cache secara default. Itu berarti bahwa selama eksekusi pertama permintaan yang difilter, Elasticsearch akan menemukan dokumen yang cocok dengan filter dan membangun struktur yang disebut "bitset" menggunakan informasi itu. Data yang disimpan dalam bitset berisi pengidentifikasi dokumen dan apakah dokumen yang diberikan cocok dengan filter. Eksekusi query yang memiliki filter yang sama akan menggunakan kembali informasi yang disimpan dalam bitset, sehingga membuat eksekusi query lebih cepat dengan menyimpan operasi I / O dan siklus CPU. Disarankan menggunakan filter dalam kueri. Untuk lebih jelasnya lihat di sini.
  7. Refresh waktu dan waktu gabung terkait erat dengan kinerja pengindeksan, ditambah lagi mempengaruhi keseluruhan kinerja cluster. Refresh waktu meningkat dengan jumlah operasi file untuk indeks Lucene (shard).
  8. Mengaktifkan pencatatan kueri lambat akan membantu dalam mengidentifikasi kueri mana yang lambat dan apa yang dapat dilakukan untuk memperbaikinya, terutama berguna untuk kueri wildcard.
  9. Tambah ukuran ulimit untuk memungkinkan file maks.
  10. Performa ElasticSearch dapat berkurang ketika OS memutuskan untuk menukar memori aplikasi yang tidak digunakan. Nonaktifkan swapping dengan mengatur pengaturan level OS atau atur hal-hal berikut dalam konfigurasi ElasticSearch config bootstrap.mlallall: true
  11. Nonaktifkan menghapus semua indeks dengan permintaan wildcard. Untuk memastikan bahwa seseorang tidak mengeluarkan operasi DELETE pada semua indeks (* atau _all) set action.destructive_requires_name menjadi true.

Sebelum selesai, berikut adalah daftar url yang berguna untuk menonton metrik.

  • / _cluster / health? pretty: Untuk indikator kesehatan cluster.
  • / _status? pretty: Untuk semua informasi tentang semua indeks.
  • / _nodes? pretty: Untuk semua informasi tentang node.
  • / _cat / master? pretty: Untuk master node.
  • / _stats? pretty: Untuk alokasi shard, indeks statistik.
  • / _nodes / stats? pretty: Untuk statistik node individu, ini termasuk, jvm, http, io stats untuk node.

Agregasi metrik dari Elasticsearch didukung oleh sebagian besar alat pemantauan sistem seperti Datadog, TICK. Dianjurkan untuk menggunakan alat-alat seperti itu dan membuat corong sangat disarankan untuk pemantauan berkelanjutan dari Elasticsearch.

Kesimpulan:

Elasticsearch adalah mesin pencarian dan analisis teks lengkap terdistribusi, yang memungkinkan beberapa penyewa untuk mencari melalui seluruh set data mereka, terlepas dari ukurannya, pada kecepatan yang belum pernah terjadi sebelumnya. Selain kemampuan pencarian teks lengkapnya, ElasticSearch berfungsi ganda sebagai sistem analisis dan basis data terdistribusi. ElasticSearch memiliki default yang bagus untuk memulai. Tetapi begitu melewati tahap eksperimen awal, Anda harus meluangkan waktu untuk mengubah pengaturan untuk kebutuhan Anda. Anda disarankan untuk mengunjungi kembali konfigurasi Anda nanti, bersama dengan dokumentasi resmi, untuk memastikan bahwa cluster Anda dikonfigurasi untuk memenuhi kebutuhan Anda.