ELK+redis高级架构

前言

前面零零碎碎的已经把ELK搭建和收集日志基本都已经说过了,现在把前面的都放到一起,仅做参考:
ELK收集nginx正确和错误日志
ELK单体介绍和es群集的搭建
现在这篇解决了高访问量,日志频繁写入的场景,使用redis做高速缓存,也提高了该架构的可用性,logstash从redis里再收集日志并过滤处理,最后提交到es群集里分片存储

nginx+redis+filebeat+logstash+elasticsearch+kibana 工作展示图

在这里插入图片描述
工作流程如下:

  1. 当有用户访问的时候,就会产生日志,filebeat负责把指定路径的日志收集起来提交到redis;
  2. redis会以key的形式存储日志,从服务器做好备份,提高redis的冗余性;
  3. logstash会在redis里面input日志信息并做分析过滤,然后转发给es;
  4. es对日志分片和索引;
  5. kibana通过web形式将es里面的日志展示出来,便于管理员集中管理。

redis在ELK架构里的作用

  • 存储日志,可以是nginx,apache,tomcat等其他只要产生都可以存储,只要打上标签,logstash在input时就会分好类,就像京东快递仓库一样,把所有的快递全部集中到一起,只要写好目标地址,就会送到你手里
  • 提高冗余性,若redis后面的全部宕机了,也不至于数据丢失
  • 加快日志的读取速度
  • 全部日志集中一起,打好标签,便于操作管理

构建filebeat+redis+logstash+es+kibana架构

环境:

主机IP描述
Centos7(192.168.10.8)es群集,kibana
Centos7(192.168.10.7)es群集,nginx,filebeat
Centos7(192.168.10.1)logstash,redis

部署es群集

  1. 下载安装es
wget https://mirror.tuna.tsinghua.edu.cn/elasticstack/yum/elastic-6.x/6.6.0/elasticsearch-6.6.0.rpm
rpm -ivh elasticsearch-6.6.0.rpm
warning: elasticsearch-6.6.0.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing...                          ################################# [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK

  1. 修改配置文件
grep -Ev '^#|^$' /etc/elasticsearch/elasticsearch.yml 
cluster.name: ES_cluster
node.name: node-1
path.data: /data/es        #数据存放目录
path.logs: /var/log/elasticsearch  #日志存放目录
bootstrap.memory_lock: true   #开启内存锁定,会与/etc/elasticsearch/jvm.options有关联
network.host: 0.0.0.0         #0.0.0.0代表所有主机,集群里面不管那一台主机ip:9200,都可以进入
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node-1", "node-2","node-3"]
discovery.zen.minimum_master_nodes: 2
  1. 创建目录,修改权限
mkdir -p /data/elasticsearch 
chown -R elasticsearch:elasticsearch /data/elasticsearch/
  1. 分配内存锁定
vim /etc/elasticsearch/jvm.options
-Xms2g		#分配最小内存	,根据你自己的而定=你物理内存的一半
-Xmx2g		#分配最大内存,官方推荐为物理内存的一半,但最大为32G,超过了32G,反而可能会有副作用

还没有完,添加以下内容

systemctl edit elasticsearch
添加:
[Service]
LimitMEMLOCK=infinity
F2 回车 保存退出

systemctl daemon-reload
systemctl start elasticsearch

在这里插入图片描述
node-2配置和node-1一模一样
es群集配置完会通过单播的形式在节点之间互相发现,所以节点IP不要写错

部署kibana

  1. 安装kibana
cd /data/soft
rpm -ivh kibana-6.6.0-x86_64.rpm 
  1. 修改配置文件
    vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "192.168.10.8"
server.name: "db01"
elasticsearch.hosts: ["http://192.168.10.8:9200"]
保存退出
  1. 启动kibana
    systemctl start kibana
    在这里插入图片描述

部署redis

  1. 安装redis,并启动
    准备安装和数据目录
	mkdir -p /data/soft
	mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}
  1. 下载redis安装包
	cd /data/soft
	wget http://download.redis.io/releases/redis-5.0.7.tar.gz
  1. 解压redis到/opt/redis_cluster/
	tar xf redis-5.0.7.tar.gz -C /opt/redis_cluster/
	ln -s /opt/redis_cluster/redis-5.0.7  /opt/redis_cluster/redis
  1. 切换目录安装redis
	cd /opt/redis_cluster/redis
	make && make install 
  1. 编写配置文件

vim /opt/redis_cluster/redis_6379/conf/6379.conf

添加:

bind 127.0.0.1 192.168.1.108
port 6379
daemonize yes
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
databases 16
dbfilename redis.rdb
dir /opt/redis_cluster/redis_6379

开启redis

sh redis_shell.sh login 6379
此脚本在之前的博文也出现过,redis集群控制脚本
https://blog.csdn.net/weixin_43815140/article/details/106163920

[root@localhost ~]# netstat -anpt | grep redis
tcp        0      0 192.168.10.1:6379       0.0.0.0:*               LISTEN      49231/redis-server  
tcp        0      0 192.168.10.1:6379       192.168.10.7:46470      ESTABLISHED 49231/redis-server  
[root@localhost ~]# 

部署filebeat

  1. 安装filebeat
rpm -ivh filebeat-6.6.0-x86_64.rpm
  1. 修改filebeat配置文件

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"]

setup.template.settings:
  index.number_of_shards: 5

setup.kibana:
  hosts: ["192.168.10.8"]

output.redis:
  hosts: ["192.168.10.1"]
  key: "filebeat"
  db: 0
  timeout: 5

启动filebeat
systemctl start filebeat
启动过程中会有些慢,要等一会,不要来回重启

在这里插入图片描述
到现在,nginx的access日志和error日志都会被存到redis里filebeat的可以里面;接下来安装配置logstash,从redis里面拉取数据并过滤处理发给es集群

部署logstash

  1. 安装logstash
    rpm -ivh logstash-6.6.0.rpm
  2. 修改配置文件
    vim /etc/logstash/conf.d/redis.conf
input {
  redis {
    host => "192.168.10.1"
    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.10.8:9200"]
    index => "nginx_access-%{+YYYY.MM}"
    manage_template => false
  }
}

filter部分意思为把upstream_timerequest_time的时间转换为浮点化,为了后面方便排序和查询
3. 启动logstash
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis.conf
开启的时候比filebeat还慢,刚开始回合卡住一样,等着等着等着…

直到屏幕上会有日志信息出来,这时候,你就可以去es去看存储的日志了
不过前提是你得准备好nginx服务并开启

ab命令去压力测试

在这里插入图片描述
这时候去看redis里的key
在这里插入图片描述
会变成空值,只要logstash把数据拉过去,redis就会消失数据,所以不必担心redis内存不够的情况,只要logstash不出现故障,日志就会很快被送到logstash,redis只是起到个缓存作用

nginx 开启日志JSON转换

nginx配置文件添加以下内容:

 log_format log_json '{ "@timestamp": "$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",'
'"up_resp_time": "$upstream_response_time",'
'"request_time": "$request_time"'
' }';

最后要记得更改

access_log /var/log/nginx/access.loglog_json;在这里插入图片描述
我们在filebeat配置文件里已经添加了下面2行,不过还是要注意

json.keys_under_root: true
json.overwrite_keys: true

在这里插入图片描述

实现access和error日志分离

需要修改logstash的配置文件,修改output部分,添加上根据标签来判断分离
在output添加if判断
如果前面“大仓库”里还有tomcat日志,在filebeat里面添加上tomcat标签,在这里就可以定义tomcat索引的日志

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

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

output {
  stdout {}
   if "access" in [tags] {
    elasticsearch {
      hosts => ["http://192.168.10.8:9200"]
      index => "nginx_access-%{+YYYY.MM}"
      manage_template => false
    }
   }
   if "error" in [tags] {
    elasticsearch {
      hosts => ["http://192.168.10.8:9200"]
      index => "nginx_error-%{+YYYY.MM}"
      manage_template => false
    }
   }
}

修改完后,重启logstash
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis.conf

手动去清空原来的索引,测试

在这里插入图片描述
在这里插入图片描述
到这里,这个ELK架构基本上已经完成了,
各个节点也已经协同工作,万事具备,只欠数据!

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值