一、Redis 三种高可用模式总览

Redis 官方提供主从复制、哨兵、Cluster 集群三种高可用方案,能力逐级增强,适用场景从单机备份到分布式海量缓存逐步升级。

表格

模式 核心能力 缺陷 适用场景
主从复制 数据备份、读负载均衡 故障需人工切换、写无法扩容 小型业务、只读高并发
哨兵模式 主节点自动故障转移 从节点不自动切换、存储受限 中等规模、需主高可用
Redis Cluster 分布式分片、读写全均衡、水平扩容 不支持多键命令、仅用 0 号库 海量数据、高并发、大型分布式

二、核心知识点补充

1. 三种分片方案对比

  • 客户端分片:业务代码直连多节点,无中间件,性能高,但扩容需改代码,运维复杂。
  • 代理分片:通过 Twemproxy/Codis 转发请求,业务无感知,Codis 支持可视化与平滑扩容。
  • 服务端分片(Redis Cluster):官方原生,无中心、P2P 通信,自动槽分配,生产首选。

2. 哈希槽(Hash Slot)机制

  • Redis Cluster 固定16384 个槽,数据路由公式:HASH_SLOT = CRC16(key) mod 16384
  • 仅主节点分配槽,从节点只做备份,不承担槽读写。
  • cluster-require-full-coverage no:允许部分槽不可用时集群仍可用,避免单点故障导致整体不可用。

3. 故障转移与选举

  • 主节点下线:超过半数主节点投票判定 FAIL,触发从节点升级。
  • 选举基于 Raft 协议:从节点收集 ≥N/2+1 张主节点选票,自动成为新主。
  • 原主恢复后:不会自动抢主,变为从节点同步新主数据。

4. 集群通信机制

  • 节点间用Gossip 协议两两通信,同步节点状态、槽信息、主从关系。
  • 通信端口:业务端口 6379 + 集群端口 16379,必须开放防火墙。

三、Redis Cluster 集群部署(全量代码・6 节点)

环境说明

  • 系统:OpenEuler24
  • 节点:3 主 3 从(最小高可用集群)
  • IP:192.168.10.101~106,端口:6379
  • Redis 版本:5.0.14

1. 所有节点通用前置操作(每台执行)

bash

运行

# 关闭防火墙与SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 安装编译依赖
dnf -y install gcc* zlib-devel tar make

# 上传并解压Redis源码
tar -zxvf redis-5.0.14.tar.gz
cd redis-5.0.14/

# 编译安装
make
make PREFIX=/usr/local/redis install

# 软链接方便全局调用
ln -s /usr/local/redis/bin/* /usr/local/bin/

# 初始化Redis服务
cd utils/
./install_server.sh

2. 所有节点修改集群配置(每台执行,仅 IP 不同)

bash

运行

vim /etc/redis/6379.conf

核心配置项(必改)

ini

bind 127.0.0.1 192.168.10.101(不同ip)
protected-mode yes
port 6379
daemonize yes
appendonly yes

# 集群核心配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-require-full-coverage no

重启服务

bash

运行

# 若bind未监听127.0.0.0,用绝对路径启动
redis-server /etc/redis/6379.conf

# 验证端口
netstat -anpt | grep 6379

3. 创建集群(任意一台主节点执行)

bash

运行

redis-cli --cluster create --cluster-replicas 1 \
192.168.10.101:6379 \
192.168.10.102:6379 \
192.168.10.103:6379 \
192.168.10.104:6379 \
192.168.10.105:6379 \
192.168.10.106:6379
  • --cluster-replicas 1:每个主节点配 1 个从节点。
  • 输入 yes 确认集群配置。

四、集群常用操作命令(全量代码)

1. 集群连接与基础测试

bash

运行

# -c 参数:自动路由到对应槽节点
redis-cli -h 192.168.10.101 -p 6379 -c

# 测试数据读写
set test_key hello_cluster
get test_key

2. 集群状态查看

bash

运行

# 查看所有节点信息
redis-cli -h 192.168.10.101 -p 6379 cluster nodes

# 检查集群健康度
redis-cli --cluster check 192.168.10.101:6379

# 查看集群信息
redis-cli -h 192.168.10.101 -p 6379 cluster info

3. 新增节点

方式 1:cluster meet

bash

运行

# 新节点192.168.10.107已配置集群模式
redis-cli -c -h 192.168.10.101 -p 6379 cluster meet 192.168.10.107 6379
方式 2:add-node

bash

运行

redis-cli --cluster add-node 192.168.10.108:6379 192.168.10.101:6379

4. 设置从节点

bash

运行

# 让108成为107的从节点(替换为实际节点ID)
redis-cli -h 192.168.10.108 -p 6379 cluster replicate 节点ID

5. 槽位重新平衡

bash

运行

redis-cli --cluster rebalance \
--cluster-threshold 1 \
--cluster-use-empty-masters \
192.168.10.101:6379

6. 删除节点

删除从节点(直接删)

bash

运行

redis-cli --cluster del-node 192.168.10.101:6379 节点ID
删除主节点(先清槽再删除)

bash

运行

# 清空数据与集群配置
redis-cli -h 192.168.10.108 -p 6379 flushall
redis-cli -h 192.168.10.108 -p 6379 cluster reset

# 删除节点
redis-cli --cluster del-node 192.168.10.101:6379 节点ID

五、集群常见故障排错(全量解决方案)

错误 1:Slot 0 is already busy

原因:节点残留旧集群数据 / 槽信息。解决

bash

运行

redis-cli -h 节点IP -p 6379 flushall
redis-cli -h 节点IP -p 6379 cluster reset
rm -rf /var/lib/redis/6379/nodes-6379.conf
redis-server /etc/redis/6379.conf

错误 2:启动失败,提示连接 127.0.0.1 拒绝

原因:配置未监听本地回环,脚本无法连接。解决

bash

运行

# 强制用配置文件启动
redis-server /etc/redis/6379.conf

# 安全关闭
redis-cli -h 节点IP -p 6379 shutdown

错误 3:集群创建卡住 Waiting for cluster to join

原因:节点未互相 meet,防火墙未放通 16379 端口。解决

bash

运行

# 从节点执行,加入主节点
redis-cli -h 127.0.0.1 -p 6379 cluster meet 192.168.10.101 6379

错误 4:从节点无法读取数据

解决:连接从节点后执行 readonly,单次连接生效:

bash

运行

redis-cli -h 从节点IP -p 6379 -c
readonly
get key_name

六、生产环境最佳实践补充

  1. 节点规划:至少 3 主 3 从,主从跨物理机 / 机架,避免单机故障。
  2. 持久化:必须开启 appendonly yes,防止内存数据丢失。
  3. 端口安全:开放 6379(业务)+16379(集群通信),禁止外网直接访问。
  4. 扩容原则:先加节点→设从节点→重平衡槽位,避免数据迁移中断。
  5. 监控:用 Prometheus+Grafana 监控槽使用率、节点状态、响应时间。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐