一、模式简介
官网: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 模式,某些多键操作(跨节点的)存在限制。
二、关键区别
| 维度 | 主-从 + Sentinel | Redis 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.11 | 6379 | 26379 | 主库 |
| 从节点1 | 192.168.1.12 | 6379 | 26379 | 从库 |
| 从节点2 | 192.168.1.13 | 6379 | 26379 | 从库 |
建议:
- 每台机器都已源码安装 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:ok、cluster_slots_assigned = 16384(如果使用默认槽总数)、cluster_slots_fail = 0。如果 cluster_state:fail 或 cluster_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输出中,如果某节点标记为fail或pfail,意味着这个节点通信不通或被标记为失败。 - 如果某主节点 +其从节点同时失败,会导致对应槽无法服务。
- 检查网络、节点负载、日志看是否有 frequent failover、频繁主从切换。
槽分配完整性
- 要确保所有 16384 个槽都被分配且处于 OK 状态。
- 检查
cluster_slots_assigned= 16384,cluster_slots_ok= 16384。若小于则说明有槽未被服务。 - 若
cluster-require-full-coverage yes被开启,在槽未覆盖时集群会拒绝服务。
复制延迟与主从一致性
- 在每个从(replica)节点,检查其同步状态:比如
INFO replication输出中master_link_status应为up,master_last_io_seconds_ago应较低。 - 若从节点延迟过大或复制中断,则在主节点失败时,备节点无法及时接管。
持久化与内存/资源状态
-
检查
INFO persistence、INFO memory、INFO stats:- AOF/RDB 是否有错误或延迟很大。
- 内存是否接近
maxmemory、是否发生大量淘汰。 - CPU、磁盘 IO 是否异常。
-
检查慢查询日志(
SLOWLOG)、延迟监控(如latency-monitor-threshold)以排查性能问题。
客户端重定向与响应状况
- 对客户端而言,检查是否频繁收到
MOVED或ASK重定向命令。过多重定向可能表明槽迁移/网络问题。 - 简单测试:使用
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 > 0或cluster_slots_assigned < 16384→ 槽未覆盖、某分片无主。- 从节点
master_link_status:down或master_last_io_seconds_ago很大 → 复制中断或延迟严重。 - 主节点内存接近或达
maxmemory且淘汰过于频繁 → 潜在数据丢失风险。 - 出现大量慢查询、CPU/IO 瓶颈或
latency指标异常。 - 节点日志中有频繁
FAILOVER,CLUSTER FORGET,CLUSTER REPLICATE等操作提示。 - 客户端出现大量
MOVED/ASK重定向错误或超时。
九、优化和备份
参考这个链接点击跳转