Stay hungry Stay foolish

Rsyslog Performance Kafka

Posted on By blue

1、测试流程

在上一文,《rsyslog介绍及测试》中,介绍了rsyslog相关知识、及udp数据转发测试,本次主要针对rsyslog数据转发kafka进行测试。

测试流程如下:

  1. 使用Nginx搭建一个Web服务,并配置访问日志的格式、存储位置等信息

  2. 使用ab进行访问,使其产生大量的日志

  3. 配置rsyslog,收集ab访问产生的日志,并转发到Kafka指定的Topic中

  4. 消费日志,观察对应中的Topic中的日志情况,系统资源消耗等

2、环境配置

配置Nginx

修改 /etc/nginx/nginx.conf 文件,配置日志格式为Json格式,存储位置为 /var/log/nginx/access.log

http {
   	log_format log_json '{ "@timestamp": "$time_local", '
                     '"@fields": { '
                     '"remote_addr": "$remote_addr", '
                     '"remote_user": "$remote_user", '
                     '"body_bytes_sent": "$body_bytes_sent", '
                     '"request_time": "$request_time", '
                     '"status": "$status", '
                     '"request": "$request", '
                     '"request_method": "$request_method", '
                     '"http_referrer": "$http_referer", '
                     '"body_bytes_sent":"$body_bytes_sent", '
                     '"http_x_forwarded_for": "$http_x_forwarded_for", '
                     '"http_user_agent": "$http_user_agent" } }';


access_log  /var/log/nginx/access.log  log_json;

sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;

include             /etc/nginx/mime.types;
default_type        application/octet-stream;

include /etc/nginx/conf.d/*.conf;
}

修改完成后,重启Nginx,输入服务器IP,进行访问。

查看Web服务是否可以正常访问,/var/log/nginx/access.log 访问日志是否正确输出。

{ "@timestamp": "08/Oct/2016:11:11:29 +0800", "@fields": { "remote_addr": "132.118.125.106", "remote_user": "-", "body_bytes_sent": "0", "request_time": "0.000", "status": "304", "request": "GET / HTTP/1.1", "request_method": "GET", "http_referrer": "-", "body_bytes_sent":"0", "http_x_forwarded_for": "-", "http_user_agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2853.0 Safari/537.36" } }

配置rsyslog - kafka

安装rsyslog中的kafka模块:

yum install rsyslog-kafka rsyslog-imptcp

增加配置文件nginx_kafka.conf,文件内容如下:

# 加载omkafka和imfile模块
module(load="omkafka")
module(load="imfile")

# 日志格式模板
template(name="json_lines" type="list" option.json="on") {
  constant(value="{")
  constant(value="\"timestamp\":\"")
  property(name="timereported" dateFormat="rfc3339")
  constant(value="\",\"message\":\"")
  property(name="msg" format="json") 
  constant(value="\",\"host\":\"")
  property(name="hostname")
  constant(value="\",\"app-name\":\"")
  property(name="programname")
  constant(value="\"}\n")
}


# ruleset
ruleset(name="nginx-kafka") {
    #日志转发kafka
    action (
        type="omkafka"
        template="json_lines"
        confParam=["compression.codec=snappy", "queue.buffering.max.messages=400000"]
        partitions.number="3"
        topic="test_rsyslog"
        broker="192.168.117.201:9092,192.168.117.202:9092,192.168.117.203:9092"
        queue.spoolDirectory="/tmp"
        queue.filename="test_rsyslog_kafka"
        queue.size="360000"
        queue.maxdiskspace="2G"
        queue.highwatermark="216000"
        queue.discardmark="350000"
        queue.type="LinkedList" 
        queue.dequeuebatchsize="4096"
        queue.timeoutenqueue="0"
        queue.maxfilesize="10M" 
        queue.saveonshutdown="on"
        queue.workerThreads="3"
    )
}

# 定义消息来源及设置相关的action
input(type="imfile" Tag="nginx" File="/var/log/nginx/access.log" Ruleset="nginx-kafka")

将该文件放入到 /etc/rsyslog.d 中,并重启rsyslog

3、数据测试

数据测试分为以下四步:

  1. 关闭rsyslog

  2. 使用ab访问web,产生大约1G的日志

  3. 启动rsyslog,转发日志数据到Kafka,并观察对应的Topic中的消息条数

  4. 验证源(nginx产生的日志),和目标(kafka对应topic中的日志)的日志条数

关闭rsyslog

service rsyslog stop

产生日志

清空access.log日志内容,

-rw-r--r-- 1 nginx root 1 Oct  8 14:11 access.log

使用ab重复执行,

ab -c100 -n10000000  http://132.198.117.101/

直至1G大小,

-rw-r--r-- 1 nginx root 1.1G Oct  8 14:17 access.log

启动rsylog,观察Kafka消费

service rsyslog start

使用KafkaOffsetMonitor进行查看

通过图片,可以得出,1G的日志,大约在22秒内,全部转发到Kafka对应的topic中。

验证条数

源:nginx 日志

$wc -l access.log
3050656 access.log

目标:kafka topic中的 日志

两次logsize相减,得出本次新增的日志条数:

12204142 - 9153489 = 3050653

可以看出,再数据转发过程中,丢失了 3050656 - 3050653 = 3 条数据。

依次增加nginx日志中的大小,进行数据转发,其结果如下:

数据文件大小 数据条数 数据转发耗(写入kafka) 接收丢失条数
1.1G 3,050,667 28s 3
5G 14,995,016 91s 7
10G 27,725,881 332s 0

4、资源消耗情况

通过观察rsyslog 在转发数据到 kafka的过程,通过CDH中的图表来观察硬件的资源消耗情况:

并在后台使用top、pidstat等命令,统计进程资源消耗情况:

Linux 2.6.32-504.el6.x86_64 (hadoop103) 	09/19/2016 	_x86_64_	(12 CPU)

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
15940 root      20   0 1070m  34m 1388 S 100.2  0.1  11:58.24 rsyslogd 

发现rsyslog 在转发数据到kafka的过程中,对内存消耗较少,使用了一部分CPU资源,主要用到了IO、网络带宽资源。

5、librdkafka

通过rsyslog官方网站,可以了解到,rsyslog数据转发到kafka中的omkafka (write to Apache Kafka) 模块,底层使用的是 librdkafka

librdkafka 是Apache Kafka 客户端C语言的高性能实现,也是Kafka官网推荐使用的C语言API。

官网:https://github.com/edenhill/librdkafka

引用一份librdkafka的测试结果:

Test1: 2 brokers, 2 partitions, required.acks=2, 100 byte messages: 850000 messages/second, 85 MB/second

Test2: 1 broker, 1 partition, required.acks=0, 100 byte messages: 710000 messages/second, 71 MB/second

Test3: 2 broker2, 2 partitions, required.acks=2, 100 byte messages, snappy compression: 300000 messages/second, 30 MB/second

Test4: 2 broker2, 2 partitions, required.acks=2, 100 byte messages, gzip compression: 230000 messages/second, 23 MB/second

引用网址:https://github.com/edenhill/librdkafka/blob/master/INTRODUCTION.md

可以看出,librdkafka的性能还是非常高的。

目前librdkafka已经经过了几个比较大的版本迭代,通过本人在实际项目中的使用经验,其性能、稳定性都比较可靠。

6、测试结论

  • 使用rsyslog转发数据到Kafka,性能高,资源消耗少

  • rsyslog更适合进行数据转发,当然也可以对数据进行基本的过滤,但如果对单条数据进行加工,实现起来较为麻烦