ELK_11_ELK使用redis作为缓存收集日志

当日志的数量非常多的时候,可能需要引入缓存层作为临时存储数据的地方,防止因为ES处理不过来导致日志丢失的情况。
filebeat支持将日志发送到redis或者kafka作为消息队列缓存。
但是使用了缓存层,就不能使用模版来配置日志收集了。

所以最好日志是json格式



实验环境:
192.168.189.118----->elk01 nginx filebeat redis logstash es

redis logstash 也可以分开安装在不同的服务器
filebeat 安装参照前面文档

nginx 直接yum 安装,把nginx 日志,转成json格式。
vim /etc/nginx/nginx.conf

log_format json '{ "time_local": "$time_local", '
        '"remote_addr": "$remote_addr", '
        '"referer": "$http_referer", '
        '"request": "$request", '
        '"status": $status, '
        '"bytes": $body_bytes_sent, '
        '"agent": "$http_user_agent", '
        '"x_forwarded": "$http_x_forwarded_for", '
        '"up_addr": "$upstream_addr",'
        '"up_host": "$upstream_http_host",'
        '"upstream_time": "$upstream_response_time",'
'"request_time": "$request_time"' ' }';


+++++ 安装redis

mkdir -p /data/soft
mkdir -p /usr/local/redis_cluster/redis_6379/{conf,logs,pid}
mkdir -p /data/redis_cluster/redis_6379

cd /data/soft/
wget http://download.redis.io/releases/redis-5.0.8.tar.gz

tar zxf redis-5.0.8.tar.gz -C /usr/local/redis_cluster/
cd /usr/local/redis_cluster/
ln -s redis-5.0.8 redis
cd redis ##已经预编译了,直接make make install
make ## 编译并生成二进制命令
make install ## 把 生成的命令复制到/usr/local/bin下面
cd /usr/local/redis_cluster/redis_6379/conf

vim redis_6379.conf

# 以守护进程模式启动
daemonize yes
# 绑定的主机地址
bind 192.168.189.118
# 监听端口
port 6379
# pid 文件和log文件的保存地址
pidfile /usr/local/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /usr/local/redis_cluster/redis_6379/logs/redis_6379.log

# 设置数据库的数量,默认数据库为0
databases 16
# 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
# 本地数据库的目录
dir /data/redis_cluster/redis_6379


+++++++

启动redis
redis-server
/usr/local/redis_cluster/redis_6379/conf/redis_6379.conf

登录命令界面:
redis-cli
关闭redis-server
redis-cli -h 192.168.189.118 shutdown
也可以登录命令界面:直接输入 shutdown
++++++++++++++
先配置filebeat往redis里面写数据,修改filebeat的配置文件

官方文档:https://www.elastic.co/guide/en/beats/filebeat/6.6/redis-output.html
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["access"]
########## output
output.redis:
  hosts: ["192.168.189.118"]
  key: "filebeat"
  db: 0
  timeout: 5
保存,退出。重启filebeat

模拟一些nginx 访问日志
登录redis,查看是否有写入内容。


lrange filebeat 1 34 ##查看值


安装logstash
下载:
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.6.0.rpm

##官网下载非常慢
wget http://www.xchinagroup.top/softdown/centos7/13_elk/logstash-6.6.0.rpm
rpm -ivh logstash-6.6.0.rpm
+++++++++++++++++
logstash 所有配置文件都放在/etc/logstash/conf.d

cd /etc/logstash/conf.d

input {
  redis {
    host => "192.168.189.118"
    port => "6379"
    db => "0"
    key => "filebeat"
    data_type => "list"
   }
}

filter {
  mutate {
    convert => ["upstream_time", "float"]
    convert => ["request_time", "float"]
   }
}

output {
  stdout {}
  elasticsearch {
    hosts => "http://192.168.189.118:9200"
    manage_template => false
    index => "nginx-acc-redis-%{+yyyy.MM}"
   }
}

保存,退出。启动logstash
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/logstash
logstash -f /etc/logstash/conf.d/redis.conf
启动比较慢


ES查看数据:


Redis查看数据:
logstash 会从redis中读取数据,读取一条,redis里面就少一条,读完后,redis 里面就没有数据了。





++++++++++++

filebeat 根据tag判断,写入不同的key到redis,logstash读取不同的key写入ES

vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["access"]
- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: ["error"]
########## output
output.redis:
  hosts: ["192.168.189.118"]
  keys:
    - key: "nginx_redis_acc"
     when.contains:
       tags: "access"
   - key: "nginx_redis_err"
     when.contains:
       tags: "error"
保存退出。重启filebeat
先停止logstash,生成一些模拟nginx 的access和error数据
ab -n 20 -c 20 http://192.168.189.118/
ab -n 20 -c 20 http://192.168.189.118/yyy.php

登录redis 查看有没有两个key
redis-cli -h 192.168.189.118


修改logstash 下面的redis.conf 文件,加入判断。

vim /etc/logstash/conf.d/redis.conf
input {
  redis {
   host => "192.168.189.118"
   port => "6379"
   db => "0"
   key => "nginx_redis_acc"
   data_type => "list"
  }
  redis {
    host => "192.168.189.118"
    port => "6379"
   db => "0"
   key => "nginx_redis_err"
   data_type => "list"
  }
}

filter {
  mutate {
    convert => ["upstream_time", "float"]
    convert => ["request_time", "float"]
  }
}

output {
   stdout {}
   if "access" in [tags] {
   elasticsearch {
     hosts => "http://192.168.189.118:9200"
     manage_template => false
     index => "nginx-redis-access-%{+yyyy.MM}"
   }
 }
   if "error" in [tags] {
   elasticsearch {
     hosts => "http://192.168.189.118:9200"
     manage_template => false
     index => "nginx-redis-error-%{+yyyy.MM}"
   }
 }
}

保存,退出。

清空ES里面原来的索引数据
重启,logstash
logstash -f /etc/logstash/conf.d/redis.conf
查看ES数据:

登录Kibana 创建索引数据:







+++++++++ 优化配置:



logstash 根据tags 里面的值,判断 并写入不同的索引到ES

那么logstash 的 tags数据又是从那里来的?

logstash 的tags 数据 是redis里面来的

redis 里面的key 带有tags ,redis 的tags 又是从Filebeat 给的

由比可以看出,整个过程,其实根key没有什么关系。

因此我们就可以对filebeat 和 logstash 进行优化

优化后的filebeat.yml 配置:
filebeat.inputs:
- type: log
  enabled: true
  paths:
   - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["access"]
- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: ["error"]
########## output
output.redis:
  hosts: ["192.168.189.118"]
  keys:
    - key: "filebeat"
## filebeat 读取nginx 日志,都写入一个key

++++++++++
logstash 优化后的配置文件:
vim /etc/logstash/conf.d/redis.conf

input {
  redis {
    host => "192.168.189.118"
    port => "6379"
    db => "0"
    key => "filebeat"
    data_type => "list"
   }
}

filter {
  mutate {
    convert => ["upstream_time", "float"]
    convert => ["request_time", "float"]
  }
}
output {
  if "access" in [tags] {
  elasticsearch {
    hosts => "http://192.168.189.118:9200"
    manage_template => false
   index => "nginx-redis-access-%{+yyyy.MM}"
   }
  }
  if "error" in [tags] {
  elasticsearch {
    hosts => "http://192.168.189.118:9200"
    manage_template => false
    index => "nginx-redis-error-%{+yyyy.MM}"
  }
 }
}
#### logstash 只需要从redis 里面的 filebeat 这个key 读取数据就可以了。