Berbagi teknologi

Optimasi ELK

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Optimalisasi ELK dapat dilakukan dari aspek-aspek berikut:

  • optimasi kernel linux
  • optimasi JVM
  • Optimalisasi konfigurasi ES
  • Pengoptimalan arsitektur (filebeat/fluentd menggantikan logstash, menggabungkan kafka sebagai antrian pesan)

Karakteristik ES sebagai penyimpan log:

  • Penulisan serentak tinggi
  • Baca lebih sedikit
  • Terima penundaan dalam 30 detik
  • Dapat mentolerir kehilangan sebagian data log

Pengoptimalan logstash

① Meningkatkan memori server dan memori tumpukan JVM

② Gunakan beberapa instance untuk penyeimbangan beban

③Gunakan filebeat alih-alih logstash untuk mengumpulkan data log

Pengoptimalan pencarian elastis

(1) Optimalkan indeks ElasticSearch

①Optimalkan fsync

  1. 为了保证不丢失数据,就要保护 translog 文件的安全:
  2. Elasticsearch 2.0 之后,每次写请求(如 indexdelete、update、bulk 等)完成时,都会触发fsync将 translog 中的 segment 刷到磁盘,然后才会返回 200 OK 的响应;或者: 默认每隔5s就将 translog 中的数据通过fsync强制刷新到磁盘。
  3. 该方式提高数据安全性的同时,降低了一点性能。
  4. ==> 频繁地执行 fsync 操作,可能会产生阻塞导致部分操作耗时较久。 如果允许部分数据丢失,可设置异步刷新 translog 来提高效率,还有降低 flush 的阀值, 优化如下:
  5. "index.translog.durability": "async",
  6. "index.translog.flush_threshold_size":"1024mb",
  7. "index.translog.sync_interval": "120s"

②Optimalkan penyegaran

  1. 写入 Lucene 的数据,并不是实时可搜索的,ES 必须通过 refresh 的过程把内存中的数据转换成 Lucene 的完整 segment 后,才可以被搜索。
  2. 默认 1 秒后,写入的数据可以很快被查询到,但势必会产生大量的 segment,检索性能会受到影响。所以,加大时长可以降低系统开销。 对于日志搜索来说,实时性要求不是那么高,设置为 5 秒或者 10s;对于 SkyWalking,实时性要求更低一些,我们可以设置为 30s。
  3. 设置如下:
  4. "index.refresh_interval":"5s"

③Optimalkan penggabungan

  1. index.merge.scheduler.max_thread_count 控制并发的 merge 线程数,如果存储是并发性能较好的 SSD,可以用系统默认的 max(1, min(4, availableProcessors / 2)),当节点配置的 cpu 核数较高时,merge 占用的资源可能会偏高,影响集群的性能,普通磁盘的话设为1,发生磁盘 IO 堵塞。设置 max_thread_count 后,会有 max_thread_count + 2 个线程同时进行磁盘操作,也就是设置为 1 允许 3 个线程。
  2. 设置如下:
  3. "index.merge.scheduler.max_thread_count":"1"

④Optimalkan pengaturan

Anda harus menutup indeks terlebih dahulu, lalu menjalankannya, dan terakhir membukanya setelah berhasil.

  • Tutup indeks
curl -XPOST 'http://localhost:9200/_all/_close'
  • Ubah pengaturan indeks
curl -XPUT -H "Content-Type:application/json" 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{"index.merge.scheduler.max_thread_count" : "1","index.refresh_interval" : "10s","index.translog.durability" : "async","index.translog.flush_threshold_size":"1024mb","index.translog.sync_interval" : "120s"}'
  • buka indeks
curl -XPOST 'http://localhost:9200/_all/_open'

(2) Optimalkan konfigurasi kumpulan thread

Kumpulan thread tulis penuh, menyebabkan tugas ditolak, dan beberapa data tidak dapat ditulis. Setelah dilakukan optimasi di atas, jumlah penolakan mengalami penurunan yang cukup banyak, namun masih terdapat kasus penolakan pekerjaan. Jadi kita juga perlu mengoptimalkan kumpulan thread tulis.

Kumpulan thread tulis menggunakan jenis kumpulan thread tetap, yaitu jumlah thread inti sama dengan nilai thread maksimum. Jumlah thread sama dengan jumlah inti CPU secara default. Nilai maksimum yang dapat diatur hanya dapat berupa jumlah inti CPU ditambah 1. Misalnya, untuk CPU 16 inti, jumlah maksimum thread yang dapat diatur. ditetapkan adalah 17.

Optimasi

  • Jumlah thread diubah menjadi 17, yang merupakan jumlah total inti CPU ditambah 1
  • Kapasitas antrian meningkat. Peran antrian saat ini adalah menghilangkan puncak. Namun peningkatan kapasitas antrian itu sendiri tidak akan meningkatkan kecepatan pemrosesan, melainkan hanya bertindak sebagai buffer. Selain itu, kapasitas antrian tidak boleh terlalu besar, jika tidak, terlalu banyak memori heap yang akan terisi ketika banyak tugas yang di-backlog.

Ubah file elasticsearch.yml untuk menambahkan konfigurasi

  1. # 线程数设置
  2. thread_pool:
  3. write:
  4. # 线程数默认等于cpu核数,即16
  5. size: 17
  6. # 因为任务多时存在任务拒绝的情况,所以加大队列大小,可以在间歇性任务量陡增的情况下,缓存任务在队列,等高峰过去逐步消费完。
  7. queue_size: 10000

(3) Kunci memori dan cegah JVM menggunakan Swap

Swap partisi swap: Ketika memori fisik sistem tidak mencukupi, sebagian ruang di memori fisik perlu dilepaskan untuk digunakan oleh program yang sedang berjalan. Ruang yang dikosongkan mungkin berasal dari beberapa program yang sudah lama tidak beroperasi. Ruang yang dikosongkan untuk sementara disimpan di Swap. Saat program tersebut hendak dijalankan, data yang disimpan akan dikembalikan dari Swap ke memori. Dengan cara ini, sistem selalu melakukan Swap ketika memori fisik tidak mencukupi.

Partisi swap swap sangat merugikan kinerja dan stabilitas node dan harus dinonaktifkan. Hal ini menyebabkan pengumpulan sampah berlangsung selama beberapa menit, bukan milidetik, dan dapat menyebabkan node merespons dengan lambat atau bahkan terputus dari cluster.

Metode partisi swap tidak dapat digunakan untuk mengimplementasikan ES

1) Matikan Swap di sistem Linux (efektif sementara)

  1. 执行命令 sudo swapoff -a
  2. 可以临时禁用 Swap 内存,但是操作系统重启后失效

2) Kurangi penggunaan Swap sebanyak mungkin di sistem Linux (efektif secara permanen)

  1. 执行下列命令
  2. echo "vm.swappiness = 1" >> /etc/sysctl.conf
  3. 正常情况下不会使用 Swap,除非紧急情况下才会 Swap

3) Aktifkan bootstrap.memory_lock

  1. config/elasticsearch.yml 文件增加配置
  2. #锁定内存,不让 JVM 写入 Swap,避免降低 ES 的性能
  3. bootstrap.memory_lock: true

(4) Kurangi jumlah pecahan dan salinan

1) Pembagian

Ukuran indeks bergantung pada ukuran pecahan dan segmen. Jika pecahan terlalu kecil, segmen mungkin terlalu kecil, yang dapat menyebabkan peningkatan overhead; jika pecahan terlalu besar, pecahan mungkin sering digabungkan, menghasilkan sejumlah besar operasi IO, yang memengaruhi kinerja penulisan.
Karena ukuran masing-masing indeks kami di bawah 15G, dan defaultnya adalah 5 shard, jadi tidak perlu banyak, jadi kami sesuaikan menjadi 3.

"index.number_of_shards": "3"

2) Jumlah salinan

Mengurangi jumlah pecahan salinan klaster. Terlalu banyak salinan akan menyebabkan perluasan penulisan internal ES. Jumlah salinan defaultnya adalah 1. Jika node tempat indeks berada turun, mesin lain yang memiliki salinan akan memiliki data cadangan indeks, sehingga data indeks dapat digunakan secara normal. Namun menulis data ke salinan mempengaruhi kinerja penulisan. Untuk data log, 1 salinan sudah cukup. Untuk indeks dengan data dalam jumlah besar, Anda dapat mengatur jumlah salinan ke 0 untuk mengurangi dampak terhadap kinerja.

"index.number_of_replicas": "1"


Meringkaskan

Metode pengoptimalan logstash:

① Meningkatkan memori server dan memori tumpukan JVM

② Gunakan beberapa instance untuk penyeimbangan beban

③Gunakan filebeat alih-alih logstash untuk mengumpulkan data log

Metode optimasi ElasticSearch:

① Optimalkan indeks: optimalkan fsync dan tingkatkan interval pembilasan disk dengan tepat

② Optimalkan konfigurasi kumpulan thread tulis untuk mengurangi penolakan tugas: ubah file konfigurasi ES elasticsearch.yml dan atur thread tulis ke jumlah inti CPU + 1

③Kunci memori dan cegah ES menggunakan swap: swapoff -a, tutup swap

④ Kurangi jumlah pecahan indeks dan salinannya dengan tepat