注:请在上一篇文章基础上,在server端安装redis,其他软件包安装方式不变。

上一篇文章:http://linuxg.blog.51cto.com/4410110/1760376

一、在Server端配置

1、说明

上一篇博客中介绍的是单个logstash进程(就是在每个客户端配置安装logstash,直接将日志output到ElasticSearch上),实现对数据的读取、解析和输出处理

但是在生产环境中,在每台应用服务器运行logstash进程并将数据直接发送到Elasticsearch里,显然是不科学的,原因:

第一,过多的客户端连接对Elasticsearch是一种额外的压力;

第二,网络抖动会影响到 logstash 进程,进而影响生产应用;

第三,运维人员未必愿意在每台生产服务器上部署 Java,或者让logstash跟业务代码争夺Java资源。

所以,在实际运用中,logstash 进程会被分为两个不同的角色。运行在应用服务器上的,尽量减轻运行压力,只做读取和转发,这个角色叫做shipper;

运行在独立服务器上,完成数据解析处理,负责写入Elasticsearch 的角色,叫indexer。

Logstash 社区通常习惯用 shipper,broker 和 indexer 来描述数据流中不同进程各自的角色。

如下图:本次实验将broker(redis)和Indexer、Search&Storage、kibana都安装在10.0.90.24这台server 端上

ELK配置之通过redis进行架构扩展_第1张图片

2、安装redis,通过redis来传输,充当Broker角色

Redis服务器是logstash官方推荐的broker选择,Broker角色也就意味着会同时存在输入和输出两个插件,做为缓存队列。

Redis服务器通常都是用作NoSQL数据库,不过logstash只是用来做消息队列,所以不要担心logstash里的Redis会撑爆你的内存和磁盘。

开始安装配置:

#wget http://download.redis.io/releases/redis-3.0.7.tar.gz

#tar xf redis-3.0.7.tar.gz -C /usr/local/

#cd /usr/local/redis-3.0.7

#make

注:如果想运行make test 需要升级tcl软件包(版本在8.0以上)

复制程序变量

#cp src/redis-cli /usr/bin

#cp src/redis-server /usr/bin

创建目录

#mkdir conf log db data

修改redis配置文件

#cp sentinel.conf conf/redis-6379.conf

修改为如下:

# cat redis-6379.conf | egrep -v "^#|^$"

daemonize yes

pidfile /var/run/redis_6379.pid

port 6379

tcp-backlog 511

bind 10.0.90.24

timeout 0

tcp-keepalive 0

loglevel notice

logfile /var/log/redis/redis_6379.log

databases 16

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename redis_6379.rdb

dir /usr/local/redis-3.0.7/db/

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

appendonly no

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes

启动redis

#redis-server /usr/local/redis-3.0.7/conf/redis-6379.conf

3、修改shipper的配置

#cd /usr/local/logstash/config

修改logstash-indexer.conf为如下内容:

#cat logstash-indexer.conf

input {

    redis {

    host => "10.0.90.24"

    port => "6379"

    type => "redis-input"

    data_type => "list"

    key => "logstash:redis"

    }

}

output {

    stdout {}

    elasticsearch {

     hosts => "10.0.90.24"

     codec => "json"

     }

}

测试:

#/usr/local/logstash/bin/logstash --configtest -f logstash-indexer.conf 

Configuration OK

启动

#nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash-indexer.conf &

通过kibana查看刷新界面,就可以看到日志已经传送过来,如下图:

ELK配置之通过redis进行架构扩展_第2张图片二、在Client端配置

1、首先配置logstash

注:我已经在客户端安装了httpd,本次以httpd日志为例

#cd /usr/local/logstash/config

修改配置,如下:

# cat logstash-http.conf 

input {

  file {

        type => "http_access"

        path => ["/var/log/httpd/access_log"]

    }

}

output {

        redis {

        host => ["10.0.90.24:6379"]

        data_type => "list"

        key => "logstash:redis"

}

}

测试:

#/usr/local/logstash/bin/logstash --configtest -f logstash-http.conf 

Configuration OK

启动

#nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash-http.conf &

2、测试日志收集情况

先通过浏览器访问http://10.0.90.25,出现http的测试页面即可

再通过echo一条测试命令到http的access_log日志,如下

#echo "this is a test for http log file" >> access_log

3、在kibana界面刷新页面,查看情况,如下:

ELK配置之通过redis进行架构扩展_第3张图片

可以看到已经通过redis将日志收集到了elasticsearch中。

以上是简单的log收集,还在进一步研究,不足之处请多多指出,谢谢。