elk 第二篇 , 为elk加入redis, 替换下beats

为elk加入redis, 替换下beats

这是elk的第二篇文章php

elk支持多种输入输出方法 ,本文章主要描述经过redis作队列中间件 ,缓解elk平台的压力

使用场景

数据不可控时 ,例如日志不是文件 , 而是由TCP直接推送到elk的 ,filebeats就没法使用了

固然redis是能够和beats一块儿使用的, 例如beats读取文件解析后输出到redis ,再由elk正常流程处理, 具体的这里不作讨论linux

优点

在经过logstash以前走redis , 分散压力不至于logstash负载过高 ,处理缓慢甚至宕机

流程图

elk

请看第一篇文章 : 编译安装日志分析平台 elk + filebeat

redis

什么是redis

Redis是一个支持多种数据结构的开源(BSD许可)内存型数据库 , 除此以外它甚至能够被用做持久化数据库,缓存器和消息队列 查看更多

如何安装redis

极其简单 ,使用yum或下载源码make便可 , 再也不赘述nginx

  • yum安装
yum -y install redis
  • 源码安装
cd /opt
wget http://download.redis.io/releases/redis-4.0.11.tar.gz || curl -O http://download.redis.io/releases/redis-4.0.11.tar.gz

tar xzvf redis-4.0.11.tar.gz && \
    cd redis-4.0.11 && \ 
    yum -y install gcc && \
    make

配置redis

能够不配置 ,可是笔者须要从外部连接redis ,因此把监听地址修改成局域网IP
你们按需执行便可git

配置文件位置:
yum : /etc/redis.conf
源码 : /opt/redis-4.0.11/redis.confgithub

# 修改监听地址
sed -i 's/^bind 127.0.0.1/bind 192.168.1.147/' /opt/redis-4.0.11/redis.conf
# 修改监听端口
sed -i 's/^port 6379/port 6379/' /opt/redis-4.0.11/redis.conf

启动redis

这里也分两种
yum安装启动方法redis

systemctl redis start

源码安装启动方法数据库

/opt/redis-4.0.11/src/redis-server /opt/redis-4.0.11/redis.conf &

启动完成就像这样 , 而后回车便可

配置elk

和第一篇中为elk加入beats同样 , 只须要编辑logstash的配置文件就能够了json

修改logstash的输入输出配置

为了不你已经手动修改了配置文件 , 咱们再也不使用sed为改成手动修改配置文件

使用你喜好的编辑器打开 /opt/logstash-6.3.2/config/logstash-io.conf api

在input代码块中增长以下内容并保存缓存

redis {
    key => "redis_log"
    data_type => "list"
    type => "redis"
    host => "192.168.1.147"
    port => "6379"
    threads => 12
    # 若是存进redis的数据是json才须要这一行
    codec => "json"
}

在input代码块的同级增长以下内容并保存

这里是处理nginx日志的过滤器 , 稍候会讲里面的grok语法
filter {
 if [type] == "redis" {
    grok {
      match => { "message" => "%{IPORHOST:remote_ip} - - \[%{HTTPDATE:datetime}\] \"(:?%{WORD:request_method} %{NOTSPACE:uri}) (:?HTTP/%{NUMBER:http_version})\" (:?%{NUMBER:http_code}) (:?%{NUMBER:contents_length}) \"(:?%{NOTSPACE:domail})\" \"(:?%{DATA:ua}) \((:?%{DATA:os})%{NUMBER:os_version}\) %{DATA}\) %{DATA:browser}/%{DATA:browser_version} (:?%{DATA:safari_version})\"" }
    }

    geoip {
      source => "client_ip"
    }

    date {
      match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
  }
}

修改output代码为以下这样

这为了按类型划分索引
output {
    if [type] == "redis" {
        elasticsearch {
            hosts => ["192.168.1.147:9200"]
            manage_template => false
            index => "redis-%{+YYYY.MM.dd}"
        }
    } else if [type] == "beats" {
        elasticsearch {
            hosts => ["192.168.1.147:9200"]
            manage_template => false
            index => "beats-%{+YYYY.MM.dd}"
        }
    } else {
        elasticsearch {
            hosts => ["192.168.1.147:9200"]
            manage_template => false
            index => "unkown-%{+YYYY.MM.dd}"
        }
    }
}

最终配置文件大概会是这个样子

input {
    beats {
        port => 5044
        type => "beats"
    }

    redis {
        key => "redis_log"
        data_type => "list"
        type => "redis"
        host => "192.168.1.147"
        port => "6379"
        threads => 12
        codec => "json"
    }
}

filter {
 if [type] == "redis" {
    grok {
      match => { "message" => "%{IPORHOST:remote_ip} - - \[%{HTTPDATE:datetime}\] \"(:?%{WORD:request_method} %{NOTSPACE:uri}) (:?HTTP/%{NUMBER:http_version})\" (:?%{NUMBER:http_code}) (:?%{NUMBER:contents_length}) \"(:?%{NOTSPACE:domail})\" \"(:?%{DATA:ua}) \((:?%{DATA:os})%{NUMBER:os_version}\) %{DATA}\) %{DATA:browser}/%{DATA:browser_version} (:?%{DATA:safari_version})\"" }
    }

    geoip {
      source => "client_ip"
    }

    date {
      match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
  }
}

output {
    if [type] == "redis" {
        elasticsearch {
            hosts => ["192.168.1.147:9200"]
            manage_template => false
            index => "redis-%{+YYYY.MM.dd}"
        }
    } else if [type] == "beats" {
        elasticsearch {
            hosts => ["192.168.1.147:9200"]
            manage_template => false
            index => "beats-%{+YYYY.MM.dd}"
        }
    } else {
        elasticsearch {
            hosts => ["192.168.1.147:9200"]
            manage_template => false
            index => "unkown-%{+YYYY.MM.dd}"
        }
    }
}

而后和第一篇同样 , 使用screen启动elk

screen -S elk
/opt/elasticsearch-6.3.2/bin/elasticsearch & \
/opt/logstash-6.3.2/bin/logstash -f /opt/logstash-6.3.2/config/logstash-io.conf & \
/opt/kibana-6.3.2-linux-x86_64/bin/kibana &

# 本次不切换回去了
# Ctrl A + c

若是配置没有问题的话, 最后会输出12行 [logstash.inputs.redis ] Registering Redis... 这样的句子

会输出12行由于咱们在input部分指定了threads为12

而后咱们再看一看熟悉的kibana , 而且作一些事情

若是启动完成可是看不到kibana ,就回到root关闭防火墙 systemctl stop firewalld

测试elk + redis

任何语言的redis客户端均可以向redis推送数据

测试逻辑

连接到redis后, 向redis_log这个list结构循环推送下面的日志内容
127.0.0.1 - - [21/Aug/2018:06:00:32 +0800] "GET /api/index/game-type HTTP/1.0" 200 269 "http://yooooooooo.com/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"

以php的predis客户端为例向redis推送数据

predis下载地址
<?php
use Predis\Client;
require __DIR__ . '/src/Autoloader.php';

Predis\Autoloader::register();

// 使用predis来连接redis
$client = new Client('tcp://192.168.1.147:6379');
// 开始一个死循环
while (true) {
    // 每次向redis的redis_log这个list推送10000条数据
    foreach (range(0 ,10000) as $value) {
        $client->lpush('redis_log' ,'127.0.0.1 - - [21/Aug/2018:06:00:32 +0800] "GET /api/index/game-type HTTP/1.0" 200 269 "http://yooooooooo.com/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"');

        echo "$value \n";
    }

    // 推送完成休息一秒 
    sleep(1);
}

运行这个php例子

php ./pushToRedis.php

假设连接没有问题 , 你会在elk那个终端里看到输出 , 我这里由于配置了json却输入的字符串 , 才会输出的全是错误

在kibana创建redis索引

来到 management 部分

一路下一步 ,建立完成

回到首页(必定到确保左上角是redis... 若是不是就点名字旁边的按钮来切换到redis) ,而后打开自动刷新 , 数据就会源源不断的渲染到页面上了

而且咱们发现 , 左侧是筛选条件和右侧的数据都多了不少字段 , 这就是修改配置文件时 ,加入的filter段的功劳

大功告成

相关文章
相关标签/搜索