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 Stack 或 Elastic 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"