博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elk 第二篇 , 为elk加入redis, 替换下beats
阅读量:6974 次
发布时间:2019-06-27

本文共 5313 字,大约阅读时间需要 17 分钟。

为elk加入redis, 替换下beats

这是elk的第二篇文章

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

使用场景

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

当然redis是可以和beats一起使用的, 例如beats读取文件解析后输出到redis ,再由elk正常流程处理, 具体的这里不做讨论

优势

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

流程图

elk

请看第一篇文章 :

redis

什么是redis

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

如何安装redis

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

  • yum安装
yum -y install redis
  • 源码安装
cd /optwget http://download.redis.io/releases/redis-4.0.11.tar.gz || curl -O http://download.redis.io/releases/redis-4.0.11.tar.gztar xzvf redis-4.0.11.tar.gz && \    cd redis-4.0.11 && \     yum -y install gcc && \    make

配置redis

可以不配置 ,但是笔者需要从外部链接redis ,所以把监听地址修改为局域网IP

大家按需执行即可

配置文件位置:

yum : /etc/redis.conf
源码 : /opt/redis-4.0.11/redis.conf

# 修改监听地址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安装启动方法

systemctl redis start

源码安装启动方法

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

启动完成就像这样 , 然后回车即可

配置elk

和第一篇中为elk加入beats一样 , 只需要编辑logstash的配置文件就可以了

修改logstash的输入输出配置

为了避免你已经手动修改了配置文件 , 我们不再使用sed为改为手动修改配置文件

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

在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推送数据

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段的功劳

大功告成

转载地址:http://icrsl.baihongyu.com/

你可能感兴趣的文章
oracle extract()截取时间值函数
查看>>
[安卓] 10、悬浮窗与获取其他任务信息
查看>>
JDOM入门实例:读取与创建xml文档
查看>>
Knockout 新版应用开发教程之"text"绑定
查看>>
Android 分享微信好友 朋友圈
查看>>
java内存分配研究
查看>>
第 25 章 Munin
查看>>
【iOS】在Swift中使用JSONModel
查看>>
Node.js与Sails~Model数据模型
查看>>
Swift Internal Parameter and External Parameter 外部参数和内部参数
查看>>
DDD~领域层
查看>>
冷备份校验和恢复
查看>>
RedHat 6.8 内核编译
查看>>
I.MX6 Android 设备节点权限
查看>>
mysql中order by 和limit一起使用不当会导致效率极慢的4种优化方法
查看>>
您的Docker 容器还健康吗?一条简单命令帮您找出答案 [转载]
查看>>
WPF自定义控件与样式(14)-轻量MVVM模式实践
查看>>
HDD-FAT32 ZIP-FAT32
查看>>
当iPhone用上联发科,你还会爱上它吗?
查看>>
HDOJ(HDU) 1491 Octorber 21st
查看>>