1. logstash安装java
1) 安装javanode
2) 下载logstash安装包linux
3) rpm –i logstash-6.2.3.rpmredis
4) 装成功后, centos7默认会装到/usr/share/logstashcentos
5) 配置文件默认位于/etc/logstash缓存
2. 管道配置ruby
以输入stdin, syslog, 输出redis,stdout为例, 性能优化
eg: rsyslog.conf 服务器
1 input { 2 3 stdin {} 4 5 syslog { 6 7 host => "0.0.0.0" 8 9 port => 514 10 11 } 12 13 14 15 } 16 17 filter {} 18 19 output { 20 21 redis { 22 23 batch => true 24 25 batch_events => 1000 26 27 batch_timeout => 20 28 29 data_type => list 30 31 key => "syslog-%{+yyyy-MM-dd}" 32 33 host => ["127.0.0.1"] 34 35 port => 6379 36 37 db => 0 38 39 } 40 41 stdout{ 42 43 codec => rubycode 44 45 } 46 47 }
能够有多个input, filter, output多线程
3. logstash配置
logstash主要配置文件logstash.yml
java 堆栈配置文件 jvm.options
管道配置文件 pipeline.yml
主要配置:
1) logstash.yml
node.name 节点名称
path.data 缓冲数据本地存放的路径
pipeline.workers 并行执行filter+output的进程数,默认cpu核数
pipeline.batch.size 每次批量从input获取的数据量, 这块会涉及到一个问题, 分配给logstash的堆栈空间须要大于等于pipeline.workers * pipeline.batch.size, 由于logstash会将数据缓存到堆栈里。
path.config 管道配置文件的路径
config.reload.automatic 是否自动reload
queue.type 默认memory, 使用persisted会持久化到磁盘, 使用队列能够保证在宕机多出现其余可修复的问题时,来不及进行filter和output处理时, 将数据保存到磁盘,避免数据丢失,logstash重启后,会同时从input和磁盘上读取队列的数据,进行filter+output处理, 还有一种状况是若是filter+output的速度慢于input, 未来不及处理的数据缓存到磁盘, 有效渡过峰值, 避免性能问题或缓存被打爆丢失数据。
queue.max_bytes 永久队列容许持久化的最多字节数, mb或gb为单位。
2) jvm.options
+xms, +xmx调优
4. 启动
1) 用pv命令启动logstash 监控性能
a) /usr/share/logstash/bin/logstash –f rsyslog.conf 启动单个管道
b) /usr/share/logstash/bin/logstash –path.settings=/etc/logstash 会启动全部的管道, 读取配置文件, 事实上是将多个管道配置文件合为一个
c) 性能监控, 使用linux自带pv命令: /usr/share/logstash/bin/logstash –f rsyslog.conf|pv –abt > /dev/null
2) 向syslog端口发送数据
数据示例采用沙箱日志:
<12> Mar 26 16:30:35 localhost skyeye-sandbox: access_time:2017-08-15 7:24:10|!attacker:10.19.1.245:52868|!file_md5:0f51a34a9a1ce4d2026c772400f07910|!file_name:virussign.com_0f51a34a9a1ce4d2026c772400f07910.vir|!file_size:320541|!file_type:exe32|!proto_type:http|!subject:|!method:GET|!url:http://sample/test/virussign.com_0f51a34a9a1ce4d2026c772400f07910.vir|!victim:10.19.1.106:80|!malscore:7.0|!vir:win7-sp1;office2010;adobe11;java8;flash16;ie10,winxp-sp3;office2007;adobe10;java6;flash16;ie8|!static_report:Trojan.Lethic.Gen.11|!cloud_info: Win32/Worm.d2e.cloud |!sign_info: 北京科技有限责任公司; 79800E0C5BC7ABEFC387B56D0E89306A3926EC25|!link:10.95.24.3
3)测试工具采用yes
yes ‘字符串’|nc ip port
示例:
yes '<12> Mar 26 16:30:35 localhost skyeye-sandbox: access_time:2017-08-15 7:24:10|!attacker:10.19.1.245:52868|!file_md5:0f51a34a9a1ce4d2026c772400f07910|!file_name:virussign.com_0f51a34a9a1ce4d2026c772400f07910.vir|!file_size:320541|!file_type:exe32|!proto_type:http|!subject:|!method:GET|!url:http://sample/test/virussign.com_0f51a34a9a1ce4d2026c772400f07910.vir|!victim:10.19.1.106:80|!malscore:7.0|!vir:win7-sp1;office2010;adobe11;java8;flash16;ie10,winxp-sp3;office2007;adobe10;java6;flash16;ie8|!static_report:Trojan.Lethic.Gen.11|!cloud_info: Win32/Worm.d2e.cloud |!sign_info: 北京科技有限责任公司; 79800E0C5BC7ABEFC387B56D0E89306A3926EC25|!link:10.95.24.3' | nc 10.95.134.20 514
以上命令会不断的像10.95.134.20 514端口发送日志.
注意nc ip port 默认使用tcp, nc –u ip port使用udp
经测试udp的每秒处理条数要比tcp快一个数量级, 可是udp的接收和入库不成比例,待探究
4) 测试工具loggen
略
5. 知识点
1) 通过测试经过rsyslog接收syslog并转发给logstash的性能只有7k/s, 未必有logstash性能好。
2)logstash不支持集群, 只能横向扩展, 启动多个实例, 或增长机器。
6. 性能优化
1) 运行时内存堆栈, 修改jvm.options
+xms +xmx 16gb差很少
2) workers数量, 修改logstash.yml
pipeline.workers 默认cpu核数, 能够根据实际状况调整大于或小于cpu核数, 主要影响filters和output, filters和output使用多线程。
3) pipeline.batch.size 单进程批次从input获取的event数量, logstash按流程分为input, filter, output三个流程, 这块主要影响filter以前, 从input取数据的效率, heap_size>=workers * batch_size ,因此设置workers和batch_size的时候要根据分配给logstash的堆内存来分配,并非越大越好。
4) queue.type 默认memory, 表示不启用持久队列, persisted表明启用持久队列, 并持久到磁盘, 记得必定要启用, 避免数据丢失, 当output已满或者处理速度跟不上input的速度的时候, logstash会阻塞,并将input的数据先缓存到磁盘文件, 待output性能转好, 再同时从input和磁盘队列取数据,输送到filter进行处理。好比redis oom的状况,能够保证数据不丢失。
5)以下图:
在分配给logstash 16GB内存, 16核cpu的状况下(服务器32cpu, 256gb内存),input速度在1.5w/s-2w/s之间,redis入库速度与input差很少,能够看出heap和cpu的占比消耗很低。通过测试, 即便增长cpu核数, heap内存, input和output的速度并无增加, 也多是压力测试的力度不够。建议不必分配特别高的内存和cpu给logstash。
实际的input和output速度应该以生产环境压测为主。
6) 修改logstash自带的syslog.rb脚本可提升input速度。
Logstah处理syslog实际是经过syslog.rb脚本, 在我机器上,该脚本位于:
/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-syslog-3.4.0/lib/logstash/inputs
虽然咱们在pipeline的配置中设置filter为空,
可是logasth在处理syslog数据的时候,调用该脚本, 会注册grok_filter和date_filter并, 调用它们处理每一条告警, 若是注释掉这两个filter的调用, 能够稍微提升input的速度。经测试input的速度约为2w/s-2.5w/s。
7. elk监控
1) elk环境搭建
a) 安装java, 下载logstash, elasticsearch, kibana, 版本必须一致, 个人机器采用6.2.3版。
b) 安装logstash, elasticsearch, kibana
c) 分别安装x-pack, bin/logstash-plugin install x-pack, bin/elasticsearch-plugin install x-pack 等等。
d) 设置内置用户密码, x-pack内置logstash-system, kibana, elastic三个用户, elastic是权限最高的, 运行bin/x-pack/setup-passwords 修改默认密码, 并重启elaticsearch等
e) 配置kibana, 设置es地址, 必配:
elasticsearch.username: "elastic"
elasticsearch.password: "xxxx"
elasticsearch.url: “http://localhost:9200”
重启kibana
f) 配置logstash监控, 至少配置如下三项:
xpack.monitoring.elasticsearch.url: "http://localhost:9200/"
xpack.monitoring.elasticsearch.username: "logstash_system"
xpack.monitoring.elasticsearch.password: "situation"
重启logstash
g) 配置elasticsearch, elasticsearch其实能够不用配置的, 可是个人环境logstash向es写入数据的时候一直报403, 添加:
xpack.security.enabled: false, 重启elasticseach, 就ok
h) 经过http访问5601端口, 就能够看到kibana界面
2) logstash监控
Elk也能够监控logstash output非elasticsearch的数据流,好比redis, 配置x-pack便可。