Κοινή χρήση τεχνολογίας

Βελτιστοποίηση ELK

2024-07-12

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

Η βελτιστοποίηση ELK μπορεί να πραγματοποιηθεί από τις ακόλουθες πτυχές:

  • Βελτιστοποίηση πυρήνα linux
  • Βελτιστοποίηση JVM
  • Βελτιστοποίηση διαμόρφωσης ES
  • Βελτιστοποίηση αρχιτεκτονικής (το filebeat/fluentd αντικαθιστά το logstash, συνδέεται με το kafka ως ουρά μηνυμάτων)

Χαρακτηριστικά του ES ως αποθήκευσης αρχείων καταγραφής:

  • Υψηλή ταυτόχρονη γραφή
  • Διαβάστε λιγότερο
  • Αποδοχή καθυστέρησης εντός 30 δευτερολέπτων
  • Μπορεί να ανεχθεί μερική απώλεια δεδομένων καταγραφής

Βελτιστοποίηση Logstash

① Αυξήστε τη μνήμη διακομιστή και τη μνήμη σωρού JVM

② Χρησιμοποιήστε πολλαπλές περιπτώσεις για εξισορρόπηση φορτίου

③Χρησιμοποιήστε filebeat αντί για logstash για τη συλλογή δεδομένων καταγραφής

Βελτιστοποίηση Elasticsearch

(1) Βελτιστοποιήστε το ευρετήριο της ElasticSearch

① Βελτιστοποιήστε το 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"

②Βελτιστοποιήστε την ανανέωση

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

③ Βελτιστοποιήστε τη συγχώνευση

  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"

④ Βελτιστοποιήστε τις ρυθμίσεις

Πρέπει πρώτα να κλείσετε το ευρετήριο, μετά να το εκτελέσετε και τελικά να το ανοίξετε μετά την επιτυχία.

  • Κλείσιμο ευρετηρίου
curl -XPOST 'http://localhost:9200/_all/_close'
  • Τροποποιήστε τις ρυθμίσεις ευρετηρίου
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"}'
  • ανοιχτό ευρετήριο
curl -XPOST 'http://localhost:9200/_all/_open'

(2) Βελτιστοποιήστε τη διαμόρφωση της ομάδας νημάτων

Ο χώρος συγκέντρωσης νημάτων εγγραφής είναι γεμάτος, με αποτέλεσμα οι εργασίες να απορρίπτονται και ορισμένα δεδομένα δεν μπορούν να εγγραφούν. Μετά την παραπάνω βελτιστοποίηση, ο αριθμός των απορρίψεων έχει μειωθεί πολύ, αλλά εξακολουθούν να υπάρχουν περιπτώσεις απόρριψης εργασίας. Επομένως, πρέπει επίσης να βελτιστοποιήσουμε τη συγκέντρωση νημάτων εγγραφής.

Η ομάδα νημάτων εγγραφής χρησιμοποιεί έναν σταθερό τύπο συγκέντρωσης νημάτων, δηλαδή, ο αριθμός των νημάτων πυρήνα είναι ίδιος με τη μέγιστη τιμή νήματος. Ο αριθμός των νημάτων είναι ίσος με τον αριθμό των πυρήνων της CPU από προεπιλογή Η μέγιστη τιμή που μπορεί να οριστεί μπορεί να είναι μόνο ο αριθμός των πυρήνων της CPU συν 1. Για παράδειγμα, για μια CPU 16 πυρήνων, ο μέγιστος αριθμός νημάτων που μπορεί να οριστεί. να οριστεί είναι 17.

Βελτιστοποίηση

  • Ο αριθμός των νημάτων αλλάζει σε 17, που είναι ο συνολικός αριθμός των πυρήνων της CPU συν 1
  • Η χωρητικότητα της ουράς αυξάνεται. Ο ρόλος της ουράς αυτή τη στιγμή είναι να εξαλείψει τις κορυφές. Ωστόσο, η ίδια η αύξηση της χωρητικότητας της ουράς δεν θα αυξήσει την ταχύτητα επεξεργασίας, αλλά λειτουργεί μόνο ως buffer. Επιπλέον, η χωρητικότητα της ουράς δεν μπορεί να είναι πολύ μεγάλη, διαφορετικά θα καταληφθεί υπερβολική μνήμη σωρού όταν πολλές εργασίες έχουν καθυστερήσει.

Τροποποιήστε το αρχείο elasticsearch.yml για να προσθέσετε διαμόρφωση

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

(3) Κλειδώστε τη μνήμη και αποτρέψτε το JVM από τη χρήση του Swap

Swap swap partition: Όταν η φυσική μνήμη του συστήματος δεν είναι αρκετή, ένα μέρος του χώρου στη φυσική μνήμη πρέπει να απελευθερωθεί για χρήση από το τρέχον πρόγραμμα που εκτελείται. Ο ελευθερωμένος χώρος μπορεί να προέρχεται από ορισμένα προγράμματα που δεν έχουν λειτουργήσει για μεγάλο χρονικό διάστημα. Με αυτόν τον τρόπο, το σύστημα εκτελεί πάντα Swap όταν η φυσική μνήμη είναι ανεπαρκής.

Το διαμέρισμα swap swap είναι πολύ επιζήμιο για την απόδοση και τη σταθερότητα του κόμβου και πρέπει να απενεργοποιηθεί. Αναγκάζει τη συλλογή σκουπιδιών να διαρκεί για λεπτά αντί για χιλιοστά του δευτερολέπτου και μπορεί να προκαλέσει αργή απόκριση κόμβων ή ακόμα και αποσύνδεση από το σύμπλεγμα.

Η μέθοδος Swap partition δεν μπορεί να χρησιμοποιηθεί για την υλοποίηση ES

1) Απενεργοποιήστε το Swap σε σύστημα Linux (προσωρινά ενεργό)

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

2) Μειώστε τη χρήση του Swap όσο το δυνατόν περισσότερο σε συστήματα Linux (ισχύει μόνιμα)

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

3) Ενεργοποιήστε το bootstrap.memory_lock

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

(4) Μειώστε τον αριθμό των θραυσμάτων και των αντιγράφων

1) Sharking

Το μέγεθος του δείκτη εξαρτάται από το μέγεθος των θραυσμάτων και των τμημάτων, τα θραύσματα μπορεί να είναι πολύ μικρά, γεγονός που μπορεί να οδηγήσει σε αυξημένη επιβάρυνση, εάν τα θραύσματα είναι πολύ μεγάλα, με αποτέλεσμα μεγάλο αριθμό λειτουργιών IO, επηρεάζοντας την απόδοση εγγραφής.
Επειδή το μέγεθος κάθε ευρετηρίου μας είναι κάτω από 15G και η προεπιλογή είναι 5 θραύσματα, δεν χρειάζονται τόσα πολλά, γι' αυτό το προσαρμόσαμε στο 3.

"index.number_of_shards": "3"

2) Αριθμός αντιγράφων

Μειώστε τον αριθμό των θραυσμάτων αντιγραφής συμπλέγματος Τα πάρα πολλά αντίγραφα θα οδηγήσουν σε επέκταση εγγραφής ES. Ο αριθμός των αντιγράφων είναι προεπιλεγμένος σε 1. Εάν ένας κόμβος στον οποίο βρίσκεται ένα ευρετήριο μειωθεί, ένα άλλο μηχάνημα με αντίγραφο θα έχει τα εφεδρικά δεδομένα ευρετηρίου, επομένως τα δεδομένα ευρετηρίου μπορούν να χρησιμοποιηθούν κανονικά. Αλλά η εγγραφή δεδομένων σε ένα αντίγραφο επηρεάζει την απόδοση εγγραφής. Για δεδομένα καταγραφής, αρκεί 1 αντίγραφο. Για ευρετήρια με μεγάλο όγκο δεδομένων, μπορείτε να ορίσετε τον αριθμό των αντιγράφων σε 0 για να μειώσετε τον αντίκτυπο στην απόδοση.

"index.number_of_replicas": "1"


Συνοψίζω

Μέθοδος βελτιστοποίησης Logstash:

① Αυξήστε τη μνήμη διακομιστή και τη μνήμη σωρού JVM

② Χρησιμοποιήστε πολλαπλές περιπτώσεις για εξισορρόπηση φορτίου

③Χρησιμοποιήστε filebeat αντί για logstash για τη συλλογή δεδομένων καταγραφής

Μέθοδος βελτιστοποίησης ElasticSearch:

① Βελτιστοποιήστε το ευρετήριο: βελτιστοποιήστε το fsync και αυξήστε κατάλληλα το διάστημα έκπλυσης δίσκου

② Βελτιστοποιήστε τη διαμόρφωση του χώρου συγκέντρωσης νημάτων εγγραφής για να μειώσετε την απόρριψη εργασιών: τροποποιήστε το αρχείο διαμόρφωσης ES elasticsearch.yml και ορίστε το νήμα εγγραφής στον αριθμό των πυρήνων της CPU + 1

③Κλειδώστε τη μνήμη και αποτρέψτε το ES από τη χρήση swap: swapoff -a, κλείσιμο εναλλαγής

④Μειώστε κατάλληλα τον αριθμό των θραυσμάτων ευρετηρίου και των αντιγράφων