ELK 7.17.10 + Redis 5.0.7 构建高可用 Nginx 日志收集系统(Rocky Linux 9.6 实战)

ELK+redis安装部署

========================================================================

文章开始前我想说的

Elasticsearch 7.17.10 双节点集群部署实战(基于 Rocky Linux 9.6)

Elasticsearch 7.17.10 双节点集群部署(二):安装 elasticsearch-head 插件实现可视化

ELK日志分析平台(三):Logstash 7.17.10 独立节点部署与基础测试(基于Rocky Linux 9.6)

ELK日志分析平台(四):Kibana 7.17.10 部署与基本配置(与ES01同机,基于Rocky Linux 9.6)

ELK日志分析平台(五):Filebeat 部署与 Nginx 日志采集(输出至 Logstash)(基于Rocky Linux 9.6)

这 5 篇文章已经完整覆盖了 ELK 日志分析平台从 0 到 1 的全部搭建流程,可以直接用于生产环境!

Elasticsearch + Logstash + Kibana + Filebeat 通常被称为 ELK StackElastic Stack

我之前发的这5篇实现了Elasticsearch + Logstash + Kibana + Filebeat

现在为Elasticsearch + Logstash + Kibana + Filebeat + redis

=========================================================================

一、前言 典型的elk架构图

引入redis架构图 nginx+filebeat+redis+logstash+elasticsearch+kibana 工作展示图

对于高访问量,日志频繁写入的应用场景,使用redis做高速缓存,提高了elk架构的可用性,logstash从redis里再收集日志并过滤处理,最后提交到es群集里分片存储。

1、工作流程如下:

。当有用户访问的时候,就会产生日志,filebeat负责把指定路径的日志收集起来提交到redis;

。redis会以key的形式存储日志,从服务器做好备份,提高redis的冗余性;

。logstash会在redis里面input日志信息并做分析过滤,然后转发给es;

。es对日志分片和索引; 。kibana通过web形式将es里面的日志展示出来,便于管理员集中管理。

redis在ELK架构里的作用(缓冲层)

存储日志,可以是nginx,apache,tomcat等其他只要产生都可以存储,只要打上标签,flebeat在input时就会分好类,就像京东快递仓库一样,把所有的快递全部集中到一起,只要写好目标地址,就会送到你手里

。提高冗余性,若redis后面的全部宕机了,也不至于数据丢失

。加快日志的读取速度

。全部日志集中一起,打好标签,便于操作管理

Nginx的作用(负载均衡)

。接收多个节点的feilbeat的数据,还可以根据情况分配到多个logstash

。提高系统可靠性

2、实验环境
hostname IP role 配置
es01 192.168.92.14 es+kibana+es-head 4G内存
es02 192.168.92.15 es 2G
logstash 192.168.92.16 logstash 2G
filebeat01 192.168.92.17 filebeat+nginx 2G
redis 192.168.92.18 redis 2G

二、redis安装部署

其他节点已经部署好,再增加一个redis节点

初始化配置

安装基础软件

复制代码
#配置rockylinux9.6的yum源
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky*.repo
dnf makecache

yum install wget vim net-tools -y

selinux、firewall关闭、设置时区

复制代码
timedatectl set-timezone Asia/Shanghai
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
1、下载redis
复制代码
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
2、安装redis
复制代码
cp redis-5.0.7.tar.gz /opt #将当前目录下的 Redis 源码包 redis-5.0.7.tar.gz 复制到 /opt 目录。
cd /opt
tar -zxvf redis-5.0.7.tar.gz -C .
yum install gcc -y
# redis依赖包
yum install tcl -y
cd redis-5.0.7
make

说明:tcl全称"ToolCommandLanguage"意思为"工具命令语言"是一种基于字符串的命令语言,是一种解释性语言。 成功后,继续操作。

复制代码
cd src
make test
make clean #如果执行make install失败的话
make install

说明

复制代码
//编译,如果出现Hint:It's a good idea to run 'make test';),则是编译OK
make
//或者安装到当前目录下
make install

启动redis

复制代码
[root@redis redis-5.0.7]# cd utils/
[root@redis utils]# pwd
/opt/redis-5.0.7/utils
[root@redis utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
cp: cannot create regular file '/etc/init.d/redis_6379': No such file or directory
ERROR: Could not copy redis init script to  /etc/init.d/redis_6379. Aborting!
[root@redis utils]#

这个错误是因为您的系统使用 systemd 管理服务,而 Redis 的 install_server.sh 脚本是旧式的 SysV init 脚本,它试图将启动脚本复制到 /etc/init.d/ 目录,但该目录在 Rocky Linux 9.6 中默认不存在(即使存在,systemd 也不会使用它)。您可以采用以下两种方式解决:

方法二(推荐):手动配置 Redis 为 systemd 服务

既然已经编译完成,可以直接使用编译好的二进制文件,并创建 systemd 服务单元文件,这是 Rocky Linux 的标准做法。

复制代码
#1. 创建 Redis 配置文件
sudo mkdir -p /etc/redis
sudo cp /opt/redis-5.0.7/redis.conf /etc/redis/6379.conf
sudo vim /etc/redis/6379.conf  

根据您的需求修改配置(如 daemonize yes、pidfile、logfile 等)。至少确保以下设置:
daemonize no      # systemd 管理时不需要守护进程
pidfile /run/redis/redis_6379.pid
#logfile /var/log/redis/redis_6379.log
dir /var/lib/redis/6379  

然后创建目录并授权:
sudo mkdir -p /var/log/redis
sudo chown redis:redis /var/log/redis 

#创建数据目录:
sudo mkdir -p /var/lib/redis/6379  

#2. 创建 systemd 服务单元文件
sudo vi /etc/systemd/system/redis_6379.service
写入以下内容: 
[Unit]
Description=Redis 6379
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf --supervised systemd
ExecStop=/usr/local/bin/redis-cli -p 6379 shutdown
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
#3. 创建 redis 用户和组(如果不存在) 
sudo groupadd --system redis
sudo useradd --system -g redis --home-dir /var/lib/redis redis
sudo chown redis:redis /etc/redis/6379.conf 
sudo chown -R redis:redis /var/lib/redis
#4. 重新加载 systemd 并启动服务
sudo systemctl daemon-reload
sudo systemctl start redis_6379
sudo systemctl enable redis_6379 
#5. 验证服务状态 
sudo systemctl status redis_6379
redis-cli -p 6379 ping   # 应返回 PONG

[root@redis ~]# sudo systemctl daemon-reload
sudo systemctl start redis_6379
sudo systemctl status redis_6379   # 查看状态
● redis_6379.service - Redis 6379
     Loaded: loaded (/etc/systemd/system/redis_6379.service; enabled; preset: disabled)
     Active: active (running) since Wed 2026-03-18 13:44:15 CST; 43ms ago
   Main PID: 30747 (redis-server)
      Tasks: 4 (limit: 4402)
     Memory: 8.7M
        CPU: 6ms
     CGroup: /system.slice/redis_6379.service
             └─30747 "/usr/local/bin/redis-server 127.0.0.1:6379"

Mar 18 13:44:15 redis systemd[1]: Started Redis 6379.

您已经通过 手动创建 systemd 服务单元 成功启动并运行了 Redis(从 systemctl status 可以看到 active (running))。这说明 Redis 服务已经正常工作,无需再运行 install_server.sh

3、编辑redis配置文件
复制代码
[root@redis utils]# cp /etc/redis/6379.conf{,.bak}
[root@redis utils]# vi /etc/redis/6379.conf 
#修改bind0.0.0.0让所有的人都可以连接上去
bind 0.0.0.0 
[root@redis utils]# systemctl restart redis_6379

查看redis服务对应端口号

复制代码
#ss -ltn 是一个用于查看系统当前监听的 TCP 端口的命令。
[root@redis utils]# ss -ltn
State            Recv-Q           Send-Q                      Local Address:Port                       Peer Address:Port
LISTEN           0                511                               0.0.0.0:6379                            0.0.0.0:*
LISTEN           0                128                               0.0.0.0:22                              0.0.0.0:*
LISTEN           0                128                                  [::]:22                                 [::]:*

此时,redis节点已经部署好了。

三、elk+redis功能测试

在filebeat01节点上,修改filebeat配置文件(vi /etc/filebeat/filebeat.yml)

复制代码
  # 之前这里是写到了logstash上,注释掉这里
  #output.logstash:
  #  The Logstas hosts
  # hosts: ["192.168.92.16:5044"]

#粘贴为下面的内容
output.redis:
  hosts: ["192.168.92.18:6379"]
  key: "nginx"
  db: 0
  data_type: "list"

重启filebeat服务

复制代码
systemctl restart filebeat

访问nginx产生几条日志,然后查看redis数据(key,value的数据存储模式);redis有16个初始化库,编号0到15,默认使用0号库

复制代码
# 进入 Redis 命令行
redis-cli

# 查看当前库的全部 key
keys *

# 获取列表 nginx 的长度
llen nginx

# 查看 key nginx 的类型
type nginx

# 按照索引从左往右获取列表 nginx 中对应索引的值(例如索引 0)
lindex nginx 0

# 退出 redis-cli
exit

为配置logstash服务运行时,此时数据临时存储在redis节点中。 在logstash节点上,新建redistest.conf配置文件

复制代码
[root@logstash ~]# cd /etc/logstash/conf.d/
[root@logstash conf.d]# pwd
/etc/logstash/conf.d 
[root@logstash conf.d]# vi redistest.conf
input {
  redis {
    host => "192.168.92.18"
    port => 6379
    key => "nginx"
    data_type => "list"
    db => 0
  }
}

filter {
  json {
    source => "message"
    remove_field => ["beat", "offset", "tags", "prospector"]
  }
  date {
    match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
    target => "@timestamp"
  }
}

output {
  stdout { }
}
#这里是输出到elasticsearch上
#output {
#  stdout { }
#  elasticsearch {
#    hosts => ["192.168.10.197"]
#    index => "logstash-nginx-%{+YYYY.MM.dd}"
#  }
#}

效果测试

如果这个时候logstash挂掉,则数据会停留在redis中,没有消费掉

复制代码
127.0.0.1:6379> keys *
2) "nginx"
相关推荐
czlczl200209253 小时前
Redis集群批处理下的陷阱
数据库·redis·缓存
人道领域4 小时前
Day | 07 【苍穹外卖:菜品套餐的缓存】
java·开发语言·redis·缓存击穿·springcache
独断万古他化4 小时前
【抽奖系统开发实战】Spring Boot 活动模块设计:事务保障、缓存优化与列表展示
java·spring boot·redis·后端·缓存·mvc
y = xⁿ4 小时前
【黑马点评二刷日记】分布式锁和Redisson
java·redis·分布式·缓存
prince054 小时前
SpringBoot + 多级缓存(Caffeine + Redis + 空值缓存):防穿透、防雪崩、低延迟三合一
spring boot·redis·缓存
sszdzq4 小时前
docker 安装 Nginx
nginx·docker·容器
Fang fan4 小时前
高并发、分布式场景下的ID生成策略
数据库·redis·分布式·缓存
霖霖总总5 小时前
[Redis小技巧19]缓存雪崩深度解析:原理、防御策略与工程实践
redis·缓存
qq_246839755 小时前
Redis lua本地调试环境配置
数据库·redis·lua