logstash 初体验

logstash 是用 JRuby 的,但是打包成了 jar 的包,下载即用。
下面这个是在单机上运行 LS:
# java -jar logstash-1.1.1-monolithic.jar agent -f logstash-simple.conf --log /var/log/logstash
注意:需要给机器分配足够的内存,否则会出现 HEAP 用完的错误,造成程序直接被 kill 退出。

这个可以附带一个 web:
# java -jar logstash-1.1.1-monolithic.jar agent -f logstash-simple.conf -- web --backend elasticsearch:///?local
注意那个 "–",其实是个分隔符,也可以像下面这样写,不过要开两个 shell:
# java -jar logstash-1.1.1-monolithic.jar agent -f logstash-simple.conf
# java -jar logstash-1.1.1.-monolithic.jar web --backend elasticsearch:///?local

默认开启这五个端口,其中 9200, 9300 是 ES 做监听的;9301, 9302 是 ES 跟 web interface 通讯;9292 是 web UI 的监听端口。
如果不开 web,则只有 9200,9300 以及 9301 这三个端口。

LS 的命令参数很简单,只分 agent 和 web 两种,具体的请看这里

LS 的收集方式分为 standalonecentralized

standalone 就是自己发自己收,centralized 的就是众多的客户端端发,找台集中的主机收。在后者这种情况下,有两类的 server,一个用来 ship log,一个用来 collect & index log。LS 本身没有 shipper 以及 collector 的概念,这两种角色需要不同的配置。
官方推荐使用 redis 来代替 AMQP。
说说 centralized 的方式,在每台被收集 log 的机器上安装 shipper,这个主要是在 conf 文件里面指定,比如像下面这样:
# cat shipper.conf
input {
                stdin {
                                type => "stdin-type"
                }
}

output {
                stdout { debug => true debug_format => "json"}
                redis {host => "127.0.0.1" data_type => "list" key => "logstash"}
}

然后就可以运行 shipper 了:
# java -jar logstash-1.1.1-monolithic.jar agent -f shipper.conf

ES 的运行也也比较简单,解压缩即用,下载脚本这个链接有,用的是 0.19.8,然后就可以运行了:
# /opt/elasticsearch/bin/elasticsearch -f

redis 是用来替代 MQ 的,下载编译安装:
# wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz
# tar zxvf redis-2.4.17.tar.gz
# cd redis-2.4.17/src
# make

默认会起 6379 port,可以通过 redis-cli 来控制。LS 主要使用了 redis 的 list data type,然后通过 BLPOP 来取出消息,shipper 会把消息传递到 redis 的 list 中,然后通过 LS 的 indexer 从 redis 中取出消息,再导入导 ES 中或者直接 stdout。因此,redis 只是作为了传递者的角色,本身并不存储数据。各个组件之间的顺序可以看官方的这张图:

一个 indexer 的 conf 可以像下面这样:
# cat indexer.conf
input {
  redis {
    host => "127.0.0.1"
    type => "redis-input"
    data_type => "list"
    key => "logstash"
    message_format => "json_event"
  }
}

output {
  stdout { debug => true debug_format => "json"}
  elasticsearch {
                  host => "127.0.0.1"
  }
}

运行 indexer:
# java -jar logstash-1.1.1-monolithic.jar agent -f indexer.conf

打开 ES 默认的 9292 web 端口:
# java -jar logstash-1.1.1-monolithic.jar web --backend elasticsearch://127.0.0.1/

上面说的 ES 以及 redis 的物理位置没必要挤在一台机器上,在 conf 里面指定 host 地址就可以了。下面我会结合 Kibana 来部署几台做测试之用,下面的机器基本是 4G 内存,1 core 的配置,并且是跑在 xen 上的。
shipper_1, redis, indexer, Kibana:     192.168.1.253
shipper_2:                192.168.1.234
shipper_3:                192.168.1.233
shipper_4, ES:                192.168.1.249

所有的 shipper 的 LS 文件都一样,一个范例:
$ cat shipper.conf
input {

  stdin {
    type => "stdin-type"
  }

  file {
    type => "linux-syslog"
    path => [ "/var/log/*.log", "/var/log/messages", "/var/log/syslog", "/var/log/denyhosts", "/var/log/dmesg", "/var/log/faillog", "/var/log/aptitude" ]
  }

  file {
          type => "apache"
          path => "/var/log/apache2/access_json.log"
          format => json_event
  }  

}

output {
  stdout {
          debug => true debug_format => "json"
  }

  redis {
          host => "192.168.1.253" data_type => "list" key => "logstash"
  }

}

在所有的 shipper 上启动 LS:
# java -jar logstash-1.1.1-monolithic.jar agent -f shipper.conf

indexer 的配置如下:
$ cat indexer.conf
input {

  redis {
    host => "127.0.0.1"
    type => "redis-input"
    data_type => "list"
    key => "logstash"
    message_format => "json_event"
  }

}

output {

  stdout {
          debug => true debug_format => "json"
  }

  elasticsearch {
    host => "192.168.1.249"
  }
}

启动 indexer:
# java -jar logstash-1.1.1-monolithic.jar agent -f indexer.conf

启动 redis:
# pwd
/opt/redis/src
# ./redis-server

启动 ES:
# pwd
/opt/elasticsearch/bin
# ./elasticsearch -f

启动 Kibana:
# pwd
/opt/kibana
# ruby  kibana.rb

注意,上面所有的组件需要根据自己的需求修改,这个我没有贴出来。测试了一段时间,一个 ES 能达到 1500 的 QPS,加了一个 ES 能达到 2500 QPS,每分钟能收集 15w 左右的消息,还有大量的提升空间。下图是我们在上述条件下得到的数据,分别是 1s 的间隔和 1min 间隔得到的数据。

从上面的两张图可以看到,从 14:00:00 到 15:15:00 一共收集了 395w 条的消息,如果是 100 台机器的话,按每秒 3000 算的话,每台机器每条只能产生 30 条消息,看来需要调整的地方还很多。目前的这个只能说是 it works。

  • Storyskya

    得时时刻刻去想你那些 ES LS OPO 什么的到底是什么简写,累啊