NoSQL 之 Redis 集群
·
一、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
六、生产环境最佳实践补充
- 节点规划:至少 3 主 3 从,主从跨物理机 / 机架,避免单机故障。
- 持久化:必须开启
appendonly yes,防止内存数据丢失。 - 端口安全:开放 6379(业务)+16379(集群通信),禁止外网直接访问。
- 扩容原则:先加节点→设从节点→重平衡槽位,避免数据迁移中断。
- 监控:用 Prometheus+Grafana 监控槽使用率、节点状态、响应时间。
更多推荐




所有评论(0)