rsyslog v8.8 替换logstash-shipper 方案 1

本文主要介绍使用rsyslog 代替logstash-shipper的解决方案
一 rsyslog架构说明:
rsyslog的几大优点(官网):高性能,高安全性,模块化设计
当在不方便启动java程序的服务器上收集日志时可以使用rsyslog作为log-shipper将日志发到logstash-indexer中,由于rsyslog提供了队列机制,所以新的结构图如下:
屏幕快照 2015-04-04 下午12.10.34


二 rsyslog队列详解:
1.在rsyslog中有两种类型的队列:
                    第一种叫做main队列,主要是将input进rsyslog的数据放于其中,等待处理;
                    第二种叫做action队列,当message进入到main队列之后,filter engine会对从main队列中读取数据,并将message发送到action队列,等待action将数据通过各种不同的output发到logstash-indexer 中。然后通过logstash-indexer对其进行处理。
2.rsyslog有四种队列设置:
2.1 direct queues:其实就是不进行处理,当接受方不能处理时便丢弃
2.2 disk queues:使用磁盘作为缓冲处理,这种队列有一个特点就是不会使用任何内存空间进行队列缓冲,所以这种队列处理是可靠处理。同时由于进行磁盘读写所以这种队列也是最慢的一种队列模式。这种队列处理比较适合那种对数据安全性要求较高的日志处理。
2.3 in-memory queues:使用内存作为缓冲,这种模式的速度最快,当然它不能逃脱系统故障。它甚至可以在目标系统down掉的情况下缓存日志文件。另外它不会在内存以外的地方缓存日志,但是当发送端出现问题的时候内存中的日志就over了。
     它有两种模式:LinkedList:动态分配。
                                        FixedArray:预分配。
2.4 disk-assisted memory queues:当一个disk queue 的QueueFileName被定义在in-memory queues队列设置中时,这个in-memory queue 会自动变成disk-assisted memory queue。这种队列模式集成了disk-queue和in-memory queue 的优点,当primary queue满了或者需要关闭rsyslog的时候就会激活disk-queue的磁盘读写。
这种队列官方推荐为通过 tcp action 发数据到database场景下的队列。
原理:首先其内部设定了两个变量:high watermark和low watermark,当queue达到high watermark 时,会将message写进disk queue,直到达到 low watermark。
2.5 DA-queue需要注意的相关配置:
     要设置:  $QueueMaxDiskSpace 这个设置是指在disk缓冲队列的文件大小,如果不设置,则上限为磁盘大小空间。
                   $QueueWorkerThreadMinimumMessages :当message达到这个数字时,会开启一个新的线程。
                   $QueueWorkerThreads:这个数字的意思是当线程数达到这个数字时就不再开新的线程,与上一条配置配合使用。
                   $QueueWorkerTimeoutThreadsShutdown:(单位是millisecond)当QueueWorkerThread被创建后,如果此线程闲置时间超过QueueWorkerTimeoutThreadsShutdown设置的时间时,线程会被关闭。如果设置为0则为立刻关闭,如果设置为-1则为永远不关闭。由于开线程会产生系统消耗,所以最好设置的相对大一些,或直接设置成-1。
                   $QueueDiscardSeverity  $QueueDiscardMark:当队列长度达到QueueDiscardMark时,会根据QueueDiscardSeverity 来丢弃一些低等级的日志。

三 对于此种架构的可优化点:
1.此处使用rsyslog的omfwd模式,将日志通过tcp发送到后端。
3.对于logstash的input插件的选择:在logstash input插件中含有rsyslog 这个input模块,但这个模块是使用单线程处理模式,一次处理codec.decode,grok,date,然后才算处理完成。所以这里使用的办法是使用tcp  input 代替rsyslog input,同时在filter阶段开多线程处理日志事件。使用 -w 参数来指定要在filter阶段启动的进程。
使用命令:nohup java -jar logstash-1.3.3-flatjar.jar agent -f indexer.conf -w 5 &
4.对于rsyslog的性能监控。可以使用impstats 监控日志进程的相关信息,可以对队列的长度,以及开始服务到现在所处理的日志数量等性能信息进行监控。方便可以实时监控rsyslog日志的处理情况。
 

rsyslog v8.8 替换logstash-shipper 方案 1》上有3条评论

  1. 方言

    你好 博主:

    能说一些 详细的 rsyslog 配置么
    比如,测试组网的具体配置过程,发送日志或者任何日志 推到 indexer 的 客户端和服务器端的配置信息

    回复
  2. spark

    请问rsyslog,作为日志服务器,如何组建,优化?
    我搭建了一台rsyslog日志服务器,接收几十台服务器日志,日志量大约是一小时几十g,
    发现很多数据都在内存里堵着,网卡流量4MB/s左右,iotop,rsyslog写在3-4MB/s左右,服务器是dell R720,8核 64g的配置,请教如何优化,多谢!

    回复

发表评论

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

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