ELK性能优化说明
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混部 |
各组件的部署逻辑图如下:
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中指定的
- 该参数标识至少会占用
kafka
的partition
的数目 - 配置的时候需要注意,避免占用过多的
partition
,导致其他logstash进程饿死
Output.flush_size&Output.idle_flush_time
- 用来表示flush的大小以及频率
- 控制着bulk的大小
Filter.grok
- grok是logstash的filter插件中的功能,用来对日志数据进行正则匹配实现各个字段的切割
- 增加锚点可以有效提升性能,比如:^、$等
- 使用合适的类型去分割字段,尽量避免使用
DATA
经过对logstash的优化,可以做到logstash单点导入速度有2000/s 提升到 18000/s