elasticsearch+logstash之间传输效率以及es-sql查询效率简单测试

来源:互联网 发布:东四命与西四命算法 编辑:程序博客网 时间:2024/05/16 08:53

      对于logstash解析大批量数据并传输到elasticsearch中的过程简单进行一些数据的测试,条件4G内存,logstash中配置index.refresh_interval=5s,(这个数据是es索引刷新速率,就是数据传输到es中,es不会实时展示,延迟五秒,一般来说es配置1s),index.refresh_interval的增加可以较大提高插入数据的效率,特别的,可以将其改为-1,等到大批量数据导入完成后,再改回去

    这里有几个优化logstash、elasticsearch的博客,连接挂在最后啦。

    标准方法:

input {    generator {        count => 10000000        message => '{"key1":"value1","key2":[1,2],"key3":{"subkey1":"subvalue1"}}'        codec => json    }}
inputs/generator 是无中生有,output/null 则是锯嘴葫芦。事件流转到这里直接就略过,什么操作都不做。相当于只测试 Logstash 的 pipe 和 filter 效率。

$ time ./bin/logstash -f generator_null.conf
output {    stdout {        codec => dots    }}

下面就要介绍 pv 命令了。这个命令的作用,就是作实时的标准输入、标准输出监控。我们这里就用它来监控标准输出:

$ ./bin/logstash -f generator_dots.conf | pv -abt > /dev/null
可以很明显的看到在前几秒中,速度是 0 B/s,因为 JVM 还没启动起来呢。开始运行的时候,速度依然不快。慢慢增长到比较稳定的状态,这时候的才是你需要的数据。

但是在Centos上面过 yum 安装的 pv 命令,版本较低,可能还不支持 -a 参数(我用的centos7,已经完全没有pv命令了)

方法来自:logstash中文文档,很不错


   我的实际测试:

     测试elastic的流程:复制文件到指定位置,logstahs先启动后会不断检测并传输到es

    最终测试结果:
一份168条文档,2mb,复制50次
最终是8400份数据,没有错误
9:25 -- 9:25         200条/s(左右?)    一条日志36000字符
order by log_json_content.trace.linenumber 1s不到,很快
group by linenumber 0,50,100,150  1s不到,很快
分词器全文检索(en?) 1s不到,很快   type=matchQuery('ERRor')  ('error')  1s不到,很快

一份168条文档,2mb,复制100次
最终是16800份数据,没有错误
10:27 -- 10:28      1分10s   240条/s(可能sql不断查询还耽误了点时间)  一条日志36000字符
order by log_json_content.trace.linenumber 1s不到,很快
group by linenumber 0,50,100,150  1s不到,很快
type=matchQuery('ERRor')  ('error')  1s不到,很快



附上复制系统自带的日志数据到指定位置的shell代码,很简单(大神见笑)

#!/bin/bash   file_in_Name="/home/cuixuange/Public/elk/syslog"  cd /home/cuixuange/Public/elk/test_logfor i in $(seq 1 50)do    name=$(printf shell_%02d.log $i)    touch  $name    while read line      do          echo $line >>$name    done < $file_in_Name     chmod -R 777 /home/cuixuange/Public/elk/test_log/$name    sleep 0.1sdone

其中cd 使用注意下;后面我是为了模范真实情况使用逐条读取复制再写入的方式,也可以直接用cp cat 之类的

注意:ubuntu日志数据中的日期空格应该是tab隔开的,因为同样的数据在centos系统中发现长度就不一样,会使得logstash中的即将使用的conf文件中grok解析会出现问题(所以要注意到统一的问题,空格是空格,tab是tab)

下面把;logstash解析ubuntu syslog 的conf文件放上来吧

input {   file{    path => ["/home/cuixuange/Public/elk/test_log/*.log"]    start_position=>"beginning"   #  discover_interval => 15   #  stat_interval => 1   #  sincedb_write_interval => 15   } }filter{  grok{    match=>{ "message" => "(?m)%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}"            }  }  date {    match => [ "timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss"  ]   # locale => "en"   # timezone=>"+00:00"    remove_field => [ "timestamp"]   }}output {     elasticsearch {         host => "192.168.88.130"     #    index => "logstash-shell-%{+2016.MMM.dd}"   #logstash-* to find    #    index => "logstash-shell"     #    protocol => transport         workers =>5         template_overwrite =>true  }}

elasticsearch-sql插件就不多说了,支持各种查询方法,可以到github上面去看一下,有很多简单例子,特别是其中的全文分词检索的支持,很棒,一般中文的话考虑ik分词器

点击打开链接


还有一开始说的es,logstash的优化问题:

配置index.refresh_interval参数

如何提高ElasticSearch 索引速度

如何提高ElasticSearch 索引速度

linux日志信息

shell 的echo命令会将输入的字符串送往标准输出





2 0
原创粉丝点击