ELK性能优化简要说明

1. 系统部署说明

组件

机器配置

说明

ElasticSearch&Kibana

3 * (32 core + 128GB mem + SAS 3.6T*12)

EK混部

Logstash

3 * (40 core + 32GB mem)

单独部署,比较耗cpu

DS&Kafka

5 * (56 core + 256GB mem + 1.8TB*16)

DS&Kafka&ZK混部

各组件的部署逻辑图如下:

elk 最低硬件配置 elk性能优化_kafka

2. 瓶颈点说明

日志主要卡在kafka,导致kafka上有很多lag。

当前我们的ELK系统的写入速度是1.2万条,每天仅能写入10亿条左右,但是我们的日志量已经达到每天25亿条,每秒产生超过3万条的日志,这仅是私有云FrontNginx、NosProxy以及NosAuth的日志量,日志导入的速度已经跟不上了,更何况我们还需要接入其他模块的日志,写入优化迫在眉睫。

写入优化的方向总共有三个:
* Kafka
* ElasticSearch
* Logstash

3. Kafka

优化的点分别是partition的数目以及分成不同的topic
* 不同的业务日志写入到不同的topic
* 由于partition限制着消费者的数量,将partition的数据增大到40

4. ElasticSearch

  • index.number_of_shards:36
  • index.number_of_replicas:0
  • index.refresh_interval:60s
  • index.translog.durability:async
  • index.translog.sync_interval:60s
  • Mapping.all.enabled:false
  • client: Bulk write

index.number_of_shards

  • 该参数表示分片的数量,默认是5个分片
  • 分片的数量提升有助于提升写性能,但是也不能太多,太多的话元数据存储压力大
  • 一般来时每个分片的大小最好在32GB左右
  • number_of_shards = index.size / 32GB

index.number_of_replicas
- 索引分片副本数量,默认是2
- 可以在大量导入的时候临时将该参数设成0,大批量导入完成之后再设置回去,能很好的提高些性能

index.refresh_interval

  • 建立的索引,不会立马查到,refresh_interval表示索引刷新的时间间隔,默认为1s
  • 在写优化的时候可以适当将该参数调大一点

index.translog

  • translog的作用类似有binlog
  • durability表示translog的持久化方式,默认是request
  • sync_interval表示translog刷盘的间隔

client

  • bulk写入能成倍的提升写入性能
  • 建议的bulk大小是:5-15MB

5. Logstash

  • worker: 40
  • batch_size: 150
  • Input.consumer_threads:5
  • Output.flush_size:1500
  • Output.idle_flush_time:30
  • Output.workers: 20
  • Filter.grok
    单机写入提升: 2000/s -> 18000/s

worker

  • logstash worker的数量,默认是机器cpu的核心数
  • logstash的瓶颈一般都在filter上,增大worker的数量,可以有效提升filter的效率
  • 可以设置为略高于CPU核心数
  • ./bin/logstash -w 48 ...

batch_size

  • 表示worker一次批量处理的数据条数,默认是150
  • 和ES的bulk写入有关系:worker * batch_size / flush_size = ES bulk index api 调用次数
  • ./bin/logstash -w 48 -b 300 ...

Input.consumer_threads

  • 该参数用于标识消费者的线程数,是在logstash.conf中指定的
  • 该参数标识至少会占用kafkapartition的数目
  • 配置的时候需要注意,避免占用过多的partition,导致其他logstash进程饿死

Output.flush_size&Output.idle_flush_time

  • 用来表示flush的大小以及频率
  • 控制着bulk的大小

Filter.grok

  • grok是logstash的filter插件中的功能,用来对日志数据进行正则匹配实现各个字段的切割
  • 增加锚点可以有效提升性能,比如:^、$等
  • 使用合适的类型去分割字段,尽量避免使用DATA

经过对logstash的优化,可以做到logstash单点导入速度有2000/s 提升到 18000/s

6. reference