Compartilhamento de tecnologia

Otimização ELK

2024-07-12

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

A otimização ELK pode ser realizada a partir dos seguintes aspectos:

  • otimização do kernel linux
  • Otimização JVM
  • Otimização da configuração ES
  • Otimização da arquitetura (filebeat/fluentd substitui logstash, junta-se ao kafka como fila de mensagens)

Características do ES como armazenamento de log:

  • Escrita simultânea alta
  • Leia menos
  • Aceite o atraso dentro de 30 segundos
  • Pode tolerar perda parcial de dados de log

Otimização do Logstash

① Aumente a memória do servidor e a memória heap JVM

② Use várias instâncias para balanceamento de carga

③Use filebeat em vez de logstash para coletar dados de log

Otimização do Elasticsearch

(1) Otimize o índice do ElasticSearch

①Otimizar 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"

②Otimizar atualização

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

③Otimizar mesclagem

  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"

④Otimizar configurações

Você precisa fechar o índice primeiro, depois executá-lo e, finalmente, abri-lo após o sucesso.

  • Fechar índice
curl -XPOST 'http://localhost:9200/_all/_close'
  • Modificar configurações de índice
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"}'
  • índice aberto
curl -XPOST 'http://localhost:9200/_all/_open'

(2) Otimizar a configuração do pool de threads

O conjunto de threads de gravação está cheio, fazendo com que as tarefas sejam rejeitadas e alguns dados não possam ser gravados. Após a otimização acima, o número de rejeições diminuiu muito, mas ainda há casos de rejeição de empregos. Portanto, também precisamos otimizar o pool de threads de gravação.

O pool de threads de gravação usa um tipo fixo de pool de threads, ou seja, o número de threads principais é igual ao valor máximo do thread. O número de threads é igual ao número de núcleos de CPU por padrão. O valor máximo que pode ser definido só pode ser o número de núcleos de CPU mais 1. Por exemplo, para uma CPU de 16 núcleos, o número máximo de threads que pode. ser definido é 17.

Otimização

  • O número de threads é alterado para 17, que é o número total de núcleos de CPU mais 1
  • A capacidade da fila aumenta. O papel da fila neste momento é eliminar picos. No entanto, aumentar a capacidade da fila em si não aumentará a velocidade de processamento, mas apenas atuará como um buffer. Além disso, a capacidade da fila não pode ser muito grande, caso contrário, muita memória heap será ocupada quando muitas tarefas estiverem acumuladas.

Modifique o arquivo elasticsearch.yml para adicionar configuração

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

(3) Bloqueie a memória e evite que a JVM use Swap

Partição swap swap: Quando a memória física do sistema não é suficiente, uma parte do espaço na memória física precisa ser liberada para uso pelo programa em execução no momento. O espaço liberado pode vir de alguns programas que não funcionam há muito tempo. O espaço liberado é salvo temporariamente no Swap. Quando esses programas estão prestes a ser executados, os dados salvos são restaurados do Swap para a memória. Desta forma, o sistema sempre realiza Swap quando a memória física é insuficiente.

A partição swap swap é muito prejudicial ao desempenho e à estabilidade do nó e deve ser desativada. Isso faz com que a coleta de lixo dure minutos em vez de milissegundos e pode fazer com que os nós respondam lentamente ou até mesmo se desconectem do cluster.

O método de partição swap não pode ser usado para implementar ES

1) Desligue o Swap no sistema Linux (temporariamente em vigor)

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

2) Reduzir ao máximo o uso de Swap em sistemas Linux (com efeito permanente)

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

3) Habilite bootstrap.memory_lock

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

(4) Reduza o número de fragmentos e cópias

1) Fragmentação

O tamanho do índice depende do tamanho dos fragmentos e segmentos. Se os fragmentos forem muito pequenos, os segmentos poderão ser muito pequenos, o que pode levar a um aumento da sobrecarga; se os fragmentos forem muito grandes, os fragmentos poderão ser mesclados com frequência; resultando em um grande número de operações de E/S, afetando o desempenho de gravação.
Como o tamanho de cada um dos nossos índices é inferior a 15G e o padrão é 5 fragmentos, não há necessidade de tantos fragmentos, então ajustamos para 3.

"index.number_of_shards": "3"

2) Número de cópias

Reduza o número de fragmentos de cópia do cluster Muitas cópias levarão à expansão de gravação interna do ES. O número de cópias é padronizado como 1. Se um nó onde um índice está localizado ficar inativo, outra máquina com uma cópia terá os dados de backup do índice, para que os dados do índice possam ser usados ​​normalmente. Mas gravar dados em uma cópia afeta o desempenho de gravação. Para dados de registro, 1 cópia é suficiente. Para índices com grandes quantidades de dados, você pode definir o número de cópias como 0 para reduzir o impacto no desempenho.

"index.number_of_replicas": "1"


Resumir

Método de otimização Logstash:

① Aumente a memória do servidor e a memória heap JVM

② Use várias instâncias para balanceamento de carga

③Use filebeat em vez de logstash para coletar dados de log

Método de otimização ElasticSearch:

① Otimize o índice: otimize o fsync e aumente adequadamente o intervalo de limpeza do disco

② Otimize a configuração do pool de threads de gravação para reduzir a rejeição de tarefas: modifique o arquivo de configuração ES elasticsearch.yml e defina o thread de gravação para o número de núcleos da CPU + 1

③Bloqueie a memória e evite que o ES use swap: swapoff -a, feche swap

④Reduza adequadamente o número de fragmentos e cópias do índice