rsyslog 替换logstash-shipper 方案 2 rsyslog omfwd 性能测试

本文主要测试rsylog的日志转发能力,所得数据作为rsyslog转发能力的基准水平。

 
一:准备工作:
1.rsyslog v8.8.1的安装:参见http://www.yubingzhe.com/?p=157
2.rsyslog-ng的安装:首先要安装epel包,
到此下载或wget:http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm  然后yum install rsyslog-ng -y
3.elk的安装:见官网

二.测试机结构与各个组件的解释:rsyslog_test

1.测试机性能:
测试机A:4核4G
测试机B:4核8G
2.各个组件的解释:
使用syslog-ng自带的loggen日志生成器生成日志。
使用rsyslog omfwd 模块向logstash的tcp_input发送日志,同时logstash 将日志转至 null output,即logstash空转,这样做的主要目的是为了去掉logstash所造成的性能瓶颈。
这里使用了rsyslog impstat模块用来进行rsyslog的性能记录。
为了可以更直观的观察rsyslog的性能数据,这里使用了logstash来处理rsyslog-impstat输出的日志,并输入到elasticsearch中,并使用kibana3做为数据展现。
另外使用zabbix监控各个测试机的基础信息,如cpu负载,内存,网络带宽等等。


三 rsyslog的队列配置,此处使用的是DA队列:
这两个文件放在 A机的/etc/rsyslog.d/ 目录下:
test_syslog.conf
module(load="imtcp")

input(type="imtcp" port="514" ruleset="syslog−test")

template(name="syslog−template"
type="string"
string="%msg%\n")

ruleset(name="syslog−test")
{
action(
     type="omfwd"
     Target="10.232.38.176"
     Port="1234"
     Protocol="tcp"
     template="syslog−template"
     name="act_syslog"
     queue.type="linkedlist"
     queue.filename="syslog_test_queue"
     queue.workerthreads="1"
     queue.size="10000"
     queue.maxfilesize="500M"
)
stop
}

impstat.conf

module( load="impstats" interval="10" severity="6" log.syslog="on" format="json" resetCounters="off")
template( name=“template−rsyslog" type="string" string="/var/log/impstats/impstats_50000_250.log" )
if ( $syslogfacility−text == 'syslog' ) then
{
action ( type="omfile" DynaFile="template−rsyslog" FileCreateMode="0600" )
stop
}
另外注意要将 /etc/rsyslog.conf 文件中的$WorkDirectory /var/lib/rsyslog 这一选项打开,不然不能正常开启磁盘辅助队列(DA队列)。
此处要注意一个问题:即我们每次进行完测试都要把impstat.conf 中的数据统计日志的文件名称修改一下,这样做的主要目的是为了使每次的测试的数据分开,便于后期用logstash做数据统计,比如当我们测试.5000条每秒  单条日志长度250字节时,我们可以将路径写成string=”/var/log/impstats/impstats_5000_250.log”。
rsyslog 的队列配置见此文章:
impstat 中注意将resetCounters关掉这样可以观察到rsyslog的性能数据。format设置为json主要是为了处理日志方便。
这里再简单的说明一下impstat模块各个监控数据项的含义:
          Queue:
                    size:当前在队列内的日志数量
                    enqueued:经队列流转的日志数量。
                    maxsize:在队列中日志数量最大数。
                    full:发生队列满的次数。
                    discarded.full:因队列满而丢弃的日志数量。
                    discarded.nf:因接近队列满时丢弃的日志数量。
          Actions:
                    processed:rsyslog处理的日志数量。
                    failed:在处理中失败的次数。
                    suspended:action被挂起的次数。
日志接受端(B机)logstash 的配置文件,此处使用的是tcp作为input模块:
input{
     tcp{
               port => "1234"
               type => "test−syslog"
          }
}
output{
          null{
          }
}

四测试:
此处使用的是loggen来生成日志,loggen是syslog-ng的一个组件。我们可以 loggen -help 查看loggen的各个参数:
Generate syslog messages at the specified rate
Options:
–rate, or -r <msg/sec> Number of messages to generate per second
–inet, or -i Use IP based transport (TCP, UDP)
–unix, or -x Use UNIX domain socket transport
–stream, or -S Use stream socket (TCP and unix-stream)
–dgram, or -D Use datagram socket (UDP and unix-dgram)
–size, or -s Specify the size of the syslog message
–interval, or -I Number of seconds to run the test for
–syslog-proto, or -P Use the new syslog-protocol message format (see also framing)
–no-framing, or -F Don’t use syslog-protocol style framing, even if syslog-proto is set
–read-file or -R Read log messages from file
–skip-tokens or -K Skip the given number of tokens (delimined by a space) at the beginning of each line
–csv, or -C Produce CSV output
–verbose or -V print the msg/sec data
此处我们使用 -r参数:每秒生成日志的数量,-i参数:发送到下端的IP地址,-s参数:日志单条的字节长度,-l测试的时间,-s 使用的TCP传输层协议。
我们在四种情况下进行测试:
测试1.5000条每秒  单条日志长度250字节  测试时间一小时
[root@newsync-3 impstats]# loggen -r 5000 -i -s 250 -I 3600 localhost 514
average rate = 4957.72 msg/sec, count=17847775, time=3600.000, (last) msg size=250, bandwidth=1210.38 kB/sec
测试2:10000条每秒  单条日志长度250字节 测试一小时
[root@newsync-3 impstats]# loggen -r 10000 -i -s 250 -I 3600 localhost 514
average rate = 9913.18 msg/sec, count=35687464, time=3600.000, (last) msg size=250, bandwidth=2420.21 kB/sec
测试3:5000条每秒  单条日志长度2500字节 测试一小时
[root@newsync-3 impstats]# loggen -r 5000 -i -s 2500 -I 3600 localhost 514
average rate = 4959.25 msg/sec, count=17853307, time=3600.001, (last) msg size=2500, bandwidth=12107.55 kB/sec
测试4:50000条每秒 单条日志长度250字节 测试一小时
[root@newsync-3 rsyslog.d]# loggen -r 50000 -i -s 250 -I 3600 localhost 514
average rate = 20535.32 msg/sec, count=73927825, time=3600.320, (last) msg size=250, bandwidth=5013.51 kB/sec
注意每次测试之前都要重新启动rsyslog,并修改impstat的数据输出路径。

五测试数据的展现与处理
我们首先将日志的统计数据拷贝下来,并使用elk来处理这些数据,由于内部测试环境是shipper --》redis --》indexer --elasticsearch的结构,所以logstash的配置如下:
logstash shipper端:
input{
     file{
          start_position => "beginning"
          path => "/var/log/testlog/test_50000_250.log"
          type => "test_50000_250"
     }
}

filter{
if [type] == "test_50000_250"{
     grok{
          match => ["message","%{DATA:date}\snewsync−3\srsyslogd−pstats:\s%{DATA:json_info}$"]
     }

     date{
          locale => "en"
          match => ["date","MMM d HH:mm:ss"]
          target => "date"
          }
     }
}

output{
     redis{
          host => “redis−host"
          data_type => "list"
          key => "logstash_5"
          port => 6379
     }
}
logstash indexer端:
input{
     redis{
          host => “redis−host"
          data_type => "list"
          key => "logstash_5"
          port => 6379
          }
}

filter{
     if [type] == "test_50000_250"{
          json{
               source => "json_info"
          }
     }
}

output{
     if [type] == "test_50000_250"{
          elasticsearch_http{
                    host => “elasticsearch−host"
                    index => "logstash−test_50000_250−%{+YYYY.MM}"
                    flush_size => 4000
          }
     }
}
此处的需注意每次导入数据的时候都要修改elasticsearch的index名称和shipper端的文件路径。
测试1.5000条每秒  单条日志长度250字节  测试时间一小时
rsyslog 主要性能指标如下:
rsyslog处理日志的数量,action挂起数量,进出队列次数:
 屏幕快照 2015-04-03 下午12.17.38
rsyslog队列达到上限次数:
屏幕快照 2015-04-03 上午11.58.51
rsyslog队列在测试过程的队列长度,最大长度,因发生队列满时丢弃日志次数,因接近队列慢时发生丢弃日志的次数:
屏幕快照 2015-04-03 下午12.03.16
网络带宽使用情况:
屏幕快照 2015-04-02 下午4.37.19
测试2:10000条每秒  单条日志长度250字节 测试一小时
rsyslog 主要性能指标如下:
rsyslog处理日志的数量,action挂起数量,进出队列次数:
屏幕快照 2015-04-03 下午12.10.21
rsyslog队列达到上限次数:
屏幕快照 2015-04-03 下午12.12.49
rsyslog队列在测试过程的队列长度,最大长度,因发生队列满时丢弃日志次数,因接近队列慢时发生丢弃日志的次数:
 屏幕快照 2015-04-03 下午12.19.06
网络带宽使用情况:
屏幕快照 2015-04-02 下午5.42.01
测试3:5000条每秒  单条日志长度2500字节 测试一小时
rsyslog处理日志的数量,action挂起数量,进出队列次数:
屏幕快照 2015-04-03 下午12.17.38
rsyslog队列达到上限次数:
屏幕快照 2015-04-jjjj下午12.18.47
rsyslog队列在测试过程的队列长度,最大长度,因发生队列满时丢弃日志次数,因接近队列慢时发生丢弃日志的次数:
屏幕快照 2015-04-03 下午12.19.06
网络带宽使用情况:
 屏幕快照 2015-04-02 下午6.52.47
测试4:50000条每秒 单条日志长度250字节 测试一小时
rsyslog处理日志的数量,action挂起数量,进出队列次数:
88888
rsyslog队列达到上限次数:  3000
rsyslog队列在测试过程的队列长度,最大长度,因发生队列满时丢弃日志次数,因接近队列慢时发生丢弃日志的次数:
 size
 网络带宽使用情况:
屏幕快照 2015-04-03 上午11.37.07
由此可以得出结论:
1.在logstash空转的情况下,通过rsyslogV8 的omfwd向logstash TCP发送短日志,在每秒5000条和每秒10000条的情况下,基本不会出现满队列的情况,这基本上已经达到现在业务水平的要求。当以每秒50000条的速度发送日志时,开始出现频繁满队列的情况。
2.在使用rsyslog发送长日志(单条长度为2500字节)时,以5000条每秒的速度发送日志,可以看出rsylog仍然性能良好,但此时要注意网络带宽的情况,已经达到100Mbps。
3.另外测试时发现,rsyslog对内存和cpu的使用虑并不是很高。几乎无影响,当然这是在使用DA队列的条件下,如果使用的是内存队列那么可能会在性能降低的时候产生日志在内存堆积的情况。

rsyslog 替换logstash-shipper 方案 2 rsyslog omfwd 性能测试》上有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>