Redis 介绍以及安装

4 阅读15分钟

一、模式简介

官网:redis.io/

主-从 + Sentinel

  • 主节点(master)承担写操作(也可读,根据业务情况),一个或多个从节点(replica)做数据的复制备份和可能的读操作。
  • Sentinel 是 Redis 提供的一个用来监控、告警、自动故障切换的机制。它监控 master 和 replica,当 master 宕机/不可用时,它会 提升一个 replica 为新的 master,并通知客户端新的 master 地址。
  • 这种模式没有自动做 数据分片(sharding),所有数据集中在一个 master(+其 replicas)上。

Redis Cluster 模式

  • Redis Cluster 支持 数据自动分片(按 hash slot 分布),数据被切分到多个 master 节点上,每个 master 也可以有一个或多个 replica。
  • 同时它也提供内建的高可用机制:如果某个 master 宕机,其 replica 可以被提升,且集群节点间通过“槽(slot)”迁移、再分配等机制来支持扩容或缩容。
  • 客户端访问时,需要支持 cluster 模式,某些多键操作(跨节点的)存在限制。

二、关键区别

维度主-从 + SentinelRedis Cluster
数据分片 / 容量扩展无分片:所有数据在一个 master,写操作瓶颈受限于单机资源。 ([Cloud Infrastructure Services][6])有分片:数据被拆分到多个 master 节点上,支持更大数据量与更高吞吐。
写入扩展能力写入基本局限于单 master(replica 多用于读或备份)可以多个 master 负责不同的 hash-槽,写入可并行到多个分片
读取扩展能力通过 replica 支持读分离,但主写瓶颈仍在 master可以读写分离 + 多分片,读扩展能力更强
高可用 / 故障切换Sentinel 提供 master 宕机后自动故障切换能力。Cluster 自带故障切换,且因为有分片,部分节点故障不会影响其他分片,可更高容错。
实现复杂度 /运维成本比较简单:一个 master + replicas + 几个 sentinel 即可。管理逻辑较少。较复杂:需要理解 hash slots、节点分片、slot 迁移、客户端支持、可能出现跨节点操作限制。
客户端 /命令限制客户端连接 master 或者根据 sentinel 得到新地址。大部分 Redis 命令都可用。某些跨分片操作(如 MULTI/EXEC 跨 key span 多分片)有局限;客户端必须支持 cluster 模式。
适用场景数据量不极大、写入量中等、要求高可用但扩展性要求不是很高;成本敏感。数据量大、写/读吞吐高、希望横向扩展(sharding)以应对增长。

三、适用建议 &场景

  • 如果系统目前数据规模不大、写入压力适中(master 能承担),想快速上线并保证高可用,推荐用 主-从 + Sentinel 模式
  • 如果预见数据会迅速增长、写入/读取都很大、或者单机资源成为瓶颈,那么建议直接考虑 Redis Cluster 模式
  • 如果仅做缓存/并发不是超大规模,可以用主-从 + Sentinel,配置 3 台做 master+replica+sentinel。
  • 如果未来要做大量数据、高并发、需要水平扩展,建议设计 Cluster 架构(例如 3 master + 3 replica 起步)。

四、总结一句话

  • 主-从 + Sentinel = “一主多备 + 高可用切换”,适合中等规模场景。
  • Redis Cluster = “分片+多主+高可用” = 面向“大规模+高吞吐+水平扩展”场景。

从这开始启动方式为systemd管理,也可以使用 nohup 启动根据自己系统需求来就行。

五、源码安装 Redis (单节点)

本次安装 redis 最新版本 8.2.3 官方下载地址:download.redis.io/releases/re…

安装编译环境

不用所有主机都去编译 再一台编译好了 所有主机都可以使用。

## 编译环境
dnf -y  groupinstall "Development Tools"
dnf -y install llvm cmake mlocate dpkg-dev python3 python3-pip  clang automake  

## 解压并编译安装 
tar -xf redis-8.2.3.tar.gz
cd redis-8.2.3

export BUILD_TLS=yes BUILD_WITH_MODULES=yes INSTALL_RUST_TOOLCHAIN=yes DISABLE_WERRORS=yes
make -j "$(nproc)" all

创建配置目录与用户

出于安全考虑,不建议以 root 身份运行 Redis:

useradd -r -s /sbin/nologin redis
mkdir -p /etc/redis /var/lib/redis /var/log/redis /var/run/redis/ /usr/local/redis/bin
chown -R redis:redis /var/lib/redis /var/log/redis /var/run/redis/ /usr/local/redis/bin

复制默认配置文件:

cp redis.conf /etc/redis/redis.conf

修改 redis 配置文件(单机模式)

这个配置不能拿来直接用,这个只是参数介绍,用下面的那个。

# ======================== 网络/访问控制 ========================
bind 0.0.0.0                  # 默认只允许本地访问;如需远程访问请改为特定内网IP或0.0.0.0 + 防火墙
protected-mode yes            # 启用“保护模式”
port 6379                     # TCP 连接端口
tcp-backlog 511               # 操作系统等待连接队列长度
timeout 0                     # 客户端连接空闲多长时间被断开(0 表示永不自动断开)
tcp-keepalive 300             # TCP keep-alive 探测间隔(秒)

# ======================== 启动方式/守护进程 ========================
daemonize no                  # 使用 systemd 管理时设为 no
supervised systemd            # 指定被 systemd 管理
pidfile /var/run/redis/redis-server.pid
loglevel verbose              # 日志级别 :debug最详细 verbose次于debug notice中等级别 arning最精简
logfile /var/log/redis/redis-server.log
dir /var/lib/redis            # 工作目录(持久化文件、快照位置)
databases 16                  # 支持的逻辑数据库数量(0-15 共16个)

# ======================== 持久化配置 ========================
save 900 1                          # 每900秒如果至少1个键变化,则做快照
save 300 10                         # 每300秒如果至少10个键变化,则做快照
save 60 10000                       # 每60秒如果至少10000键变化,则做快照
stop-writes-on-bgsave-error yes     # 若后台快照失败,停止写入以防数据进一步异常
rdbcompression yes                  # RDB快照是否压缩
rdbchecksum yes                     # 是否开启 RDB 校验和
dbfilename dump.rdb                 # RDB 文件名
appendonly yes                      # 启用 AOF 模式,增强持久化安全性
appendfilename "appendonly.aof"     # AOF 文件名
appendfsync everysec                # AOF 每秒同步一次(性能/安全折中)
no-appendfsync-on-rewrite no        # AOF 重写期间是否禁止 fsync,no 表示不禁止
auto-aof-rewrite-percentage 100     # AOF 文件增长至原始的100%时触发重写
auto-aof-rewrite-min-size 64mb      # 最小AOF文件大小达到64 MB才考虑重写
aof-load-truncated yes              # 若 AOF 末尾损坏,是否加载并忽略损坏部分

# ======================== 内存与驱逐策略 ========================
maxmemory 4g                       # 例如:4gb(假设服务器总内存8GB)
maxmemory-policy allkeys-lru       # 当内存超限,从所有键中按最近最少使用驱逐
maxmemory-samples 5                # 驱逐算法采样数(默认5即可)

# ======================== 客户端认证/安全控制 ========================
requirepass ugwFsSNuzgS4e62e         # **务必设置强密码**
rename-command FLUSHDB ""            # 将 FLUSHDB 命令重命名为空字符串(即禁止该命令)。
rename-command FLUSHALL ""           # 将 FLUSHALL 命令重命名为空字符串(即禁止该命令)。
rename-command KEYS ""               # 将 KEYS 命令重命名为空字符串(即禁止该命令)。
# 根据需要禁用或重命名更多危险命令

# ======================== 性能/监控调优 ========================
hz 10                              # 主循环每秒处理次数
lua-time-limit 5000                # Lua 脚本最长执行时间(毫秒)
slowlog-log-slower-than 10000      # 慢日志阈值,10000 µs = 10 ms
slowlog-max-len 128                # 慢日志保留条数
latency-monitor-threshold 0        # 如果不使用延迟监控,可设为0(0表示禁用)

# ======================== 客户端输出缓冲限制 ========================
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 256mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# client-output-buffer-limit normal 0 0 0
# 类别:normal(普通客户端)
# 硬上限:0 字节 — “0”一般表示“没有硬限制”。
# 软上限:0 字节 — “没有软限制”。
# 软秒数:0 秒 — 无持续时间限制。
# 所以这行意思就是:对普通客户端,不设输出缓冲区大小的限制。正常客户端发送命令/接收响应,不会因为缓冲区太大而自动被断开。
# 
# client-output-buffer-limit slave 256mb 256mb 60
# 类别:slave(从节点/复制链路客户端)
# 硬上限:256 MB — 如果该客户端(从节点)输出缓冲区超过了 256 MB,马上断开。
# 软上限:256 MB — 如果缓冲区 ≥256 MB 并且持续 ≥60秒,就断开。
# 软秒数:60 秒。
# 含义:为从节点或复制链路设置输出缓冲区限制,因为如果从节点跟不上主节点写入的速度,缓冲区可能暴涨,从而耗尽服务器内存或阻塞主节点。 
# 
# 
# client-output-buffer-limit pubsub 32mb 8mb 60
# 类别:pubsub(发布/订阅客户端)
# 硬上限:32 MB — 如果 pub/sub 客户端的输出缓冲区超过 32 MB,马上断开。
# 软上限:8 MB — 如果输出缓冲区 ≥8 MB 且持续 ≥60秒,则断开连接。
# 软秒数:60 秒。
# 含义:对于订阅客户端而言,如果它订阅很多频道或消息生产远比消费快,就会造成输出缓冲区积压。这个限制可以保护 Redis 不被慢订阅客户端拖垮。

# ======================== 内部数据结构优化 ========================
hash-max-ziplist-entries 512      # 哈希( HASH )类型如果字段数 ≤ 512 条,则可使用 ziplist(紧凑编码)存储,从而节省内存。:contentReference[oaicite:0]{index=0}
hash-max-ziplist-value 64         # 哈希类型如果每个字段/值字符串长度 ≤ 64 字节,且条数 ≤ 上项值,则使用 ziplist 编码;否则转为标准哈希表。:contentReference[oaicite:1]{index=1}
list-max-ziplist-size -2          # 列表( LIST )类型中,ziplist 节点的最大 “条目数或字节数” 限制。负值(-2)表示按大约 8 KB 字节数限制。:contentReference[oaicite:2]{index=2}
list-compress-depth 0             # 列表( LIST )类型的 quicklist 节点压缩深度。0 表示关闭压缩;若 >0,则头尾若干节点保留未压缩,其它节点可压缩以节省内存。:contentReference[oaicite:3]{index=3}
set-max-intset-entries 512        # 集合( SET )类型如果全部成员为整数且数目 ≤ 512 条时,则使用 intset(整数集合紧凑编码)存储,从而节省内存。:contentReference[oaicite:4]{index=4}
zset-max-ziplist-entries 128      # 有序集合( ZSET )类型如果成员数 ≤ 128 条,且每个成员字符串长度 ≤ 下项 zset-max-ziplist-value,则使用 ziplist 编码,否则用标准编码。:contentReference[oaicite:5]{index=5}
zset-max-ziplist-value 64         # ZSET 成员字符串长度上限(64 字节)用于决定是否可以使用 ziplist 编码。:contentReference[oaicite:6]{index=6}
hll-sparse-max-bytes 3000         # HyperLogLog(HLL)稀疏模式最大字节数为 3000。如果超过该大小,则转换为密集模式。:contentReference[oaicite:7]{index=7}
activerehashing yes               # 是否开启“主动重哈希(rehash)”机制。当哈希表扩容或收缩时,启用后主线程会逐步做 rehash 而不是一次性,大幅减缓阻塞。:contentReference[oaicite:8]{index=8}
aof-rewrite-incremental-fsync yes # 在启用 AOF 持久化并触发重写时,是否使用“增量 fsync”方式(分批同步磁盘写入)以减少 I/O 峰值阻塞。:contentReference[oaicite:9]{index=9}


# ======================== 集群模式(已禁用,单机版) ========================
cluster-enabled no
# cluster-config-file nodes.conf
# cluster-node-timeout 15000

# ======================== 其他安全/日志项 ========================
notify-keyspace-events ""

Redis 配置文件里的注释只能以 # 开头,并且:

  • #必须在 行首;
  • 不能写在配置项的后面(即同一行后注释);
  • 不支持行尾注释!
bind 0.0.0.0               
protected-mode yes         
port 6379                  
tcp-backlog 511            
timeout 0                  
tcp-keepalive 300          
daemonize no               
supervised systemd         
pidfile /var/run/redis/redis-server.pid
loglevel verbose             
logfile /var/log/redis/redis-server.log
dir /var/lib/redis            
databases 16                  
save 900 1                         
save 300 10                        
save 60 10000                      
stop-writes-on-bgsave-error yes    
rdbcompression yes                 
rdbchecksum yes                    
dbfilename dump.rdb                
appendonly yes                     
appendfilename "appendonly.aof"    
appendfsync everysec               
no-appendfsync-on-rewrite no       
auto-aof-rewrite-percentage 100    
auto-aof-rewrite-min-size 64mb     
aof-load-truncated yes             
maxmemory 2g                       
maxmemory-policy allkeys-lru       
maxmemory-samples 5                
requirepass ugwFsSNuzgS4e62e       
rename-command FLUSHDB ""          
rename-command FLUSHALL ""         
rename-command KEYS ""             
hz 10                              
lua-time-limit 5000                
slowlog-log-slower-than 10000      
slowlog-max-len 128                
latency-monitor-threshold 0        
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 256mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hash-max-ziplist-entries 512      
hash-max-ziplist-value 64         
list-max-ziplist-size -2          
list-compress-depth 0             
set-max-intset-entries 512        
zset-max-ziplist-entries 128      
zset-max-ziplist-value 64         
hll-sparse-max-bytes 3000         
activerehashing yes               
aof-rewrite-incremental-fsync yes 
cluster-enabled no
notify-keyspace-events ""

移动编译好的二进制文件

cd /root/redis-8.2.3/src
mv redis-benchmark  redis-cli  redis-sentinel  redis-server /usr/local/redis/bin
chown -R redis.redis /usr/local/redis

启动文件

cat /etc/systemd/system/redis.service 
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
Type=simple
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis.conf
ExecStop=/bin/kill -s TERM $MAINPID
Restart=always
LimitNOFILE=10032

[Install]
WantedBy=multi-user.target

启动 Redis 服务

systemctl daemon-reload
systemctl enable --now redis
systemctl status redis

六、主-从 + Sentinel 哨兵配置

环境规划

角色IP地址示例Redis端口Sentinel端口说明
主节点192.168.1.11637926379主库
从节点1192.168.1.12637926379从库
从节点2192.168.1.13637926379从库

建议:

  • 每台机器都已源码安装 Redis(如 /usr/local/redis/bin
  • 安装方法和 上面单节点安装方法一致,只是配置文件不一样。
  • redis 用户和数据目录一致(如 /var/lib/redis

部署编译好的安装包

## 创建用户
useradd -r -s /sbin/nologin redis
mkdir -p /etc/redis /var/lib/redis /var/log/redis /usr/local/redis/bin /var/lib/redis/sentinel /var/run/redis/
chown -R redis:redis /var/lib/redis /var/log/redis /etc/redis /var/run/redis/ /usr/local/redis

## 
cd /root/redis-8.2.3/src
mv redis-benchmark  redis-cli  redis-sentinel  redis-server /usr/local/redis/bin

修改配置文件

主库配置文件

bind 0.0.0.0               
protected-mode yes         
port 6379                  
tcp-backlog 511            
timeout 0                  
tcp-keepalive 300          
daemonize no               
supervised systemd         
pidfile /var/run/redis/redis-server.pid
loglevel verbose             
logfile /var/log/redis/redis-server.log
dir /var/lib/redis            
databases 16                  
save 900 1                         
save 300 10                        
save 60 10000                      
stop-writes-on-bgsave-error yes    
rdbcompression yes                 
rdbchecksum yes                    
dbfilename dump.rdb                
appendonly yes                     
appendfilename "appendonly.aof"    
appendfsync everysec               
no-appendfsync-on-rewrite no       
auto-aof-rewrite-percentage 100    
auto-aof-rewrite-min-size 64mb     
aof-load-truncated yes             
maxmemory 2g                       
maxmemory-policy allkeys-lru       
maxmemory-samples 5                
requirepass ugwFsSNuzgS4e62e       

# 允许从节点使用复制认证 对于单节点  只添加这个
masterauth ugwFsSNuzgS4e62e  

rename-command FLUSHDB ""          
rename-command FLUSHALL ""         
rename-command KEYS ""             
hz 10                              
lua-time-limit 5000                
slowlog-log-slower-than 10000      
slowlog-max-len 128                
latency-monitor-threshold 0        
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 256mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hash-max-ziplist-entries 512      
hash-max-ziplist-value 64         
list-max-ziplist-size -2          
list-compress-depth 0             
set-max-intset-entries 512        
zset-max-ziplist-entries 128      
zset-max-ziplist-value 64         
hll-sparse-max-bytes 3000         
activerehashing yes               
aof-rewrite-incremental-fsync yes 
cluster-enabled no
notify-keyspace-events ""

从配置文件(多个从也是用这一个配置文件)

bind 0.0.0.0               
protected-mode yes         
port 6379                  
tcp-backlog 511            
timeout 0                  
tcp-keepalive 300          
daemonize no               
supervised systemd         
pidfile /var/run/redis/redis-server.pid
loglevel verbose             
logfile /var/log/redis/redis-server.log
dir /var/lib/redis            
databases 16                  
save 900 1                         
save 300 10                        
save 60 10000                      
stop-writes-on-bgsave-error yes    
rdbcompression yes                 
rdbchecksum yes                    
dbfilename dump.rdb                
appendonly yes                     
appendfilename "appendonly.aof"    
appendfsync everysec               
no-appendfsync-on-rewrite no       
auto-aof-rewrite-percentage 100    
auto-aof-rewrite-min-size 64mb     
aof-load-truncated yes             
maxmemory 2g                       
maxmemory-policy allkeys-lru       
maxmemory-samples 5                
requirepass ugwFsSNuzgS4e62e       

# 从节点认证主库密码
masterauth ugwFsSNuzgS4e62e

# 指定主库地址和端口
replicaof 192.168.1.11 6379

rename-command FLUSHDB ""          
rename-command FLUSHALL ""         
rename-command KEYS ""             
hz 10                              
lua-time-limit 5000                
slowlog-log-slower-than 10000      
slowlog-max-len 128                
latency-monitor-threshold 0        
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 256mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hash-max-ziplist-entries 512      
hash-max-ziplist-value 64         
list-max-ziplist-size -2          
list-compress-depth 0             
set-max-intset-entries 512        
zset-max-ziplist-entries 128      
zset-max-ziplist-value 64         
hll-sparse-max-bytes 3000         
activerehashing yes               
aof-rewrite-incremental-fsync yes 
cluster-enabled no
notify-keyspace-events ""

创建启动文件

所有节点添加这个文件 cat /etc/systemd/system/redis-sentinel.service

[Unit]
Description=Redis Sentinel
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-sentinel /etc/redis/sentinel.conf --supervised systemd
ExecStop=/usr/local/redis/bin/redis-cli -p 26379 shutdown
Restart=on-failure
RestartSec=5
LimitNOFILE=10032

[Install]
WantedBy=multi-user.target

启动主从集群

systemctl daemon-reload
systemctl enable --now redis
systemctl status redis

查看集群是否启动成功

/usr/local/redis/bin/redis-cli -h 192.168.1.11 -p 6379 -a ugwFsSNuzgS4e62e INFO REPLICATION

输出如下

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.13,port=6379,state=online,offset=1258009,lag=0
slave1:ip=192.168.1.12,port=6379,state=online,offset=1258009,lag=1
master_failover_state:no-failover
master_replid:f01b7a2d5a96a1884f924ab4cb7719d93fcfda96
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1258148
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:192655
repl_backlog_histlen:1065494

部署哨兵 sentinel

部署三台哨兵服务,配置文件都一样。

protected-mode no                
bind 0.0.0.0                     
port 26379
daemonize no
pidfile /var/run/redis/redis-sentinel.pid
logfile /var/log/redis/redis-sentinel.log
loglevel notice
dir /var/lib/redis/sentinel      

sentinel monitor mymaster 192.168.1.11 6379 2   
sentinel down-after-milliseconds mymaster 10000 
sentinel failover-timeout mymaster 180000       
sentinel parallel-syncs mymaster 1              
sentinel deny-scripts-reconfig yes      

## 这个是复制密码 需要与redis.conf 配置一致。        
sentinel auth-pass mymaster ugwFsSNuzgS4e62e

部署启动文件

cat /etc/systemd/system/redis-sentinel.service

[Unit]
Description=Redis Sentinel
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-sentinel /etc/redis/sentinel.conf --supervised systemd
ExecStop=/usr/local/redis/bin/redis-cli -p 26379 shutdown
Restart=on-failure
RestartSec=5
LimitNOFILE=10032

[Install]
WantedBy=multi-user.target

启动哨兵服务

systemctl daemon-reload
systemctl enable --now redis-sentinel
systemctl status redis-sentinel

检查哨兵是否正常

/usr/local/redis/bin/redis-cli -p 26379 -a ugwFsSNuzgS4e62e  SENTINEL masters

你会看到监控的主库条目,例如名字、IP、端口、状态(ok/down)等,输出如下:

1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.1.11"
    5) "port"
    6) "6379"
    7) "runid"
    8) "3bbfb5978d0cecbb4caf0c0ab7dc7ee65376e979"
    9) "flags"
   10) "master"
   11) "link-pending-commands"
   12) "-2"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "290"
   19) "last-ping-reply"
   20) "290"
   21) "down-after-milliseconds"
   22) "10000"
   23) "info-refresh"
   24) "1996"
   25) "role-reported"
   26) "master"
   27) "role-reported-time"
   28) "6030701"
   29) "config-epoch"
   30) "0"
   31) "num-slaves"
   32) "2"
   33) "num-other-sentinels"
   34) "2"
   35) "quorum"
   36) "2"
   37) "failover-timeout"
   38) "180000"
   39) "parallel-syncs"
   40) "1"

列出该主库下的所有从库节点。

## 输出结果不在展示了  太长了 
/usr/local/redis/bin/redis-cli -p 26379 -a ugwFsSNuzgS4e62e  SENTINEL slaves mymaster

查看当前主节点

/usr/local/redis/bin/redis-cli -p 26379 -a ugwFsSNuzgS4e62e SENTINEL get-master-addr-by-name  mymaster
# 1) "192.168.1.11"
# 2) "6379"

七、Redis 集群模式安装教程

节点规划

  • 最少为 3 个主节点(masters),每个主节点至少配置一个 从节点(replica),这样至少 6 个节点(3主+3从)比较推荐。
  • 在生产环境中,建议主从节点物理或虚拟分布在不同的机器/机房,以提升容错。
  • 每个节点内存、网络、磁盘 I/O 要提前评估。Redis 是单线程,其瓶颈往往在内存和网络延迟。
  • 所有节点都是源码包安装,安装教程参考单节点安装就行。

创建 Redis Cluster

6 台机器或 6 个节点(3 主 + 3 从)

  • 192.168.1.11:6379
  • 192.168.1.12:6379
  • 192.168.1.13:6379
  • 192.168.1.14:6379
  • 192.168.1.15:6379
  • 192.168.1.16:6379

配置 redis.conf

六台主机的配置文件一样 cat /etc/redis/redis.conf

bind 0.0.0.0               
protected-mode yes         
port 6379                  
tcp-backlog 511            
timeout 0                  
tcp-keepalive 300          
daemonize no               
supervised systemd         
pidfile /var/run/redis/redis-server.pid
loglevel verbose             
logfile /var/log/redis/redis-server.log
dir /var/lib/redis            
databases 1              
save 900 1                         
save 300 10                        
save 60 10000                      
stop-writes-on-bgsave-error yes    
rdbcompression yes                 
rdbchecksum yes                    
dbfilename dump.rdb                
appendonly yes                     
appendfilename "appendonly.aof"    
appendfsync everysec               
no-appendfsync-on-rewrite no       
auto-aof-rewrite-percentage 100    
auto-aof-rewrite-min-size 64mb     
aof-load-truncated yes             
maxmemory 2g                       
maxmemory-policy allkeys-lru       
maxmemory-samples 5                
requirepass ugwFsSNuzgS4e62e       
masterauth ugwFsSNuzgS4e62e
rename-command FLUSHDB ""          
rename-command FLUSHALL ""         
rename-command KEYS ""             
hz 10                              
lua-time-limit 5000                
slowlog-log-slower-than 10000      
slowlog-max-len 128                
latency-monitor-threshold 0        
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 256mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hash-max-ziplist-entries 512      
hash-max-ziplist-value 64         
list-max-ziplist-size -2          
list-compress-depth 0             
set-max-intset-entries 512        
zset-max-ziplist-entries 128      
zset-max-ziplist-value 64         
hll-sparse-max-bytes 3000         
activerehashing yes               
aof-rewrite-incremental-fsync yes 
notify-keyspace-events ""
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

启动文件

六台主机的启动文件 全都是一样的 cat /etc/systemd/system/redis.service

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
Type=simple
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis.conf
ExecStop=/bin/kill -s TERM $MAINPID
Restart=always
LimitNOFILE=10032

[Install]
WantedBy=multi-user.target

启动 Redis 服务

systemctl daemon-reload
systemctl enable --now redis
systemctl status redis

创建集群

/usr/local/redis/bin/redis-cli -a ugwFsSNuzgS4e62e --cluster create 192.168.1.11:6379 192.168.1.12:6379 192.168.1.13:6379 192.168.1.14:6379 192.168.1.15:6379 192.168.1.16:6379 --cluster-replicas 1

集群状态

主要查看 cluster_state:okcluster_slots_assigned = 16384(如果使用默认槽总数)、cluster_slots_fail = 0。如果 cluster_state:failcluster_slots_fail > 0,说明集群有槽丢失或主节点挂了。

redis-cli -h 192.168.1.11 -p 6379 -a ugwFsSNuzgS4e62e cluster info

输出结果参考

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:174
cluster_stats_messages_pong_sent:181
cluster_stats_messages_sent:355
cluster_stats_messages_ping_received:176
cluster_stats_messages_pong_received:174
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:355
total_cluster_links_buffer_limit_exceeded:0

检查每个节点的角色、状态(connected、fail、pfail)和槽分配情况。

redis-cli -h 192.168.1.11 -p 6379 -a ugwFsSNuzgS4e62e cluster nodes

输出结果参考

0787e5f3f2c9172ad309ea5e842c05354b5d44c8 192.168.1.14:6379@16382 slave a2273f63c823cd99748a6497d309d5cfe256778d 0 1763032731000 2 connected
ee0324a85259fa7a6079829f662f5d5893961dba 192.168.1.13:6379@16381 master - 0 1763032732000 3 connected 10923-16383
fd67f1409a6ae87f9c6c943d50afe824f2e5318f 192.168.1.15:6379@16383 slave ee0324a85259fa7a6079829f662f5d5893961dba 0 1763032730000 3 connected
a2273f63c823cd99748a6497d309d5cfe256778d 192.168.1.12:6379@16380 master - 0 1763032731543 2 connected 5461-10922
6316717a2faef6143498576e246299e02eab387c 192.168.1.16:6379@16384 slave 5fee607e52a51291efa134b51b31e63830ef378d 0 1763032732599 1 connected
5fee607e52a51291efa134b51b31e63830ef378d 192.168.1.11:6379@16379 myself,master - 0 0 1 connected 0-5460

节点失败情况

  • cluster nodes 输出中,如果某节点标记为 failpfail,意味着这个节点通信不通或被标记为失败。
  • 如果某主节点 +其从节点同时失败,会导致对应槽无法服务。
  • 检查网络、节点负载、日志看是否有 frequent failover、频繁主从切换。

槽分配完整性

  • 要确保所有 16384 个槽都被分配且处于 OK 状态。
  • 检查 cluster_slots_assigned = 16384,cluster_slots_ok = 16384。若小于则说明有槽未被服务。
  • cluster-require-full-coverage yes 被开启,在槽未覆盖时集群会拒绝服务。

复制延迟与主从一致性

  • 在每个从(replica)节点,检查其同步状态:比如 INFO replication 输出中 master_link_status 应为 upmaster_last_io_seconds_ago 应较低。
  • 若从节点延迟过大或复制中断,则在主节点失败时,备节点无法及时接管。

持久化与内存/资源状态

  • 检查 INFO persistenceINFO memoryINFO stats

    • AOF/RDB 是否有错误或延迟很大。
    • 内存是否接近 maxmemory、是否发生大量淘汰。
    • CPU、磁盘 IO 是否异常。
  • 检查慢查询日志(SLOWLOG)、延迟监控(如 latency-monitor-threshold)以排查性能问题。

客户端重定向与响应状况

  • 对客户端而言,检查是否频繁收到 MOVEDASK 重定向命令。过多重定向可能表明槽迁移/网络问题。
  • 简单测试:使用 redis-cli -c 模式在不同节点写读数据,确认响应正常且稳定。

推荐命令汇总

# 检查集群状态
redis-cli -h <node> -p <port> -a <pwd> cluster info

# 检查所有节点状态
redis-cli -h <node> -p <port> -a <pwd> cluster nodes

# 检查单节点基础健康
redis-cli -h <node> -p <port> -a <pwd> ping
redis-cli -h <node> -p <port> -a <pwd> info replication
redis-cli -h <node> -p <port> -a <pwd> info memory
redis-cli -h <node> -p <port> -a <pwd> info persistence

# 检查从节点延迟情况
redis-cli -h <replica_node> -p <port> -a <pwd> info replication | grep master_last_io_seconds_ago

八、常见预警/问题指标

  • cluster_state:fail → 集群状态不正常。
  • cluster_slots_fail > 0cluster_slots_assigned < 16384 → 槽未覆盖、某分片无主。
  • 从节点 master_link_status:downmaster_last_io_seconds_ago 很大 → 复制中断或延迟严重。
  • 主节点内存接近或达 maxmemory 且淘汰过于频繁 → 潜在数据丢失风险。
  • 出现大量慢查询、CPU/IO 瓶颈或 latency 指标异常。
  • 节点日志中有频繁 FAILOVER, CLUSTER FORGET, CLUSTER REPLICATE 等操作提示。
  • 客户端出现大量 MOVED / ASK 重定向错误或超时。

九、优化和备份

参考这个链接点击跳转