NoSQL之Redis集群

Redis集群完整部署实战

本文基于 Redis 5.0.14 原生集群模式,提供可直接复现的 3 主 3 从部署步骤、扩容缩容、槽位均衡与高频排错方案,适合学习、实验与生产参考。


一、Redis 集群基础认知

Redis Cluster 是 Redis 官方原生分布式方案,核心特点:

  • 无中心架构,最少 3 个 Master 才能组成高可用集群
  • 数据按 Hash Slot 分片:共 16384 个槽,均匀分布在所有 Master
  • 自动故障转移:Master 宕机时,Slave 自动提升为 Master
  • 客户端自动路由,支持 -c 参数集群模式连接
  • 水平扩容:在线添加 / 删除节点,重新分片不中断业务

关键概念

  • cluster-enabled yes:开启集群模式
  • cluster-config-file:节点自动维护的集群配置文件,禁止手动修改
  • cluster-node-timeout:节点超时判定阈值
  • cluster-require-full-coverage no:关闭槽位全覆盖检查,避免部分节点宕机导致整个集群不可用

二、实验环境规划

本次采用 3 主 3 从 高可用架构,IP 规划如下:

  • Master1:192.168.8.101:6379
  • Master2:192.168.8.102:6379
  • Master3:192.168.8.103:6379
  • Slave1:192.168.8.104:6379(挂 Master1)
  • Slave2:192.168.8.105:6379(挂 Master2)
  • Slave3:192.168.8.106:6379(挂 Master3)

前置准备所有节点关闭防火墙与 SELinux:

bash

运行

复制代码
systemctl stop firewalld
setenforce 0

三、全节点安装 Redis 5.0.14

所有 6 个节点必须执行相同安装步骤

bash

运行

复制代码
# 安装依赖
yum -y install gcc* zlib-devel

# 解压源码
tar xvzf redis-5.0.14.tar.gz
cd redis-5.0.14/

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

# 软链接到系统PATH
ln -s /usr/local/redis/bin/* /usr/local/bin/

# 执行初始化脚本
cd utils/
./install_server.sh

安装完成后,Redis 默认配置文件路径:/etc/redis/6379.conf


四、全节点修改集群配置文件

所有节点配置仅 IP 不同,其余完全一致:

bash

运行

复制代码
vim /etc/redis/6379.conf

核心配置项

ini

复制代码
# 监听所有地址
bind 0.0.0.0
protected-mode yes
port 6379

# 后台运行
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis_6379.log

# 开启AOF持久化
appendonly yes

# 开启集群
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-require-full-coverage no

配置说明

  • cluster-require-full-coverage no必须改,默认 yes 会导致任意节点宕机→集群停服务
  • cluster-config-file:Redis 自动生成,存储节点、槽位、主从关系,禁止编辑
  • cluster-node-timeout 15000:15 秒无响应则判定节点宕机

配置完成后重启服务:

bash

运行

复制代码
/etc/init.d/redis_6379 restart
# 验证端口监听(6379业务端口+16379集群总线端口)
netstat -anpt | grep 6379

五、一键创建 Redis 集群

Redis 5.0 弃用 redis-trib.rb,直接用 redis-cli --cluster 命令:

bash

运行

复制代码
redis-cli --cluster create --cluster-replicas 1 \
192.168.8.101:6379 \
192.168.8.102:6379 \
192.168.8.103:6379 \
192.168.8.104:6379 \
192.168.8.105:6379 \
192.168.8.106:6379

参数说明

  • --cluster-replicas 1:每个 Master 对应 1 个 Slave
  • 节点顺序:前 3 个自动为 Master,后 3 个为 Slave
  • 执行后输入 yes 确认槽位分配

六、集群功能测试

必须加 -c 参数 以集群模式连接,支持自动路由:

bash

运行

复制代码
# 连接任意节点
redis-cli -h 192.168.8.106 -p 6379 -c

# 写入数据
set centos 7.3
get centos

# 切换另一节点读取
redis-cli -h 192.168.8.105 -p 6379 -c
get centos

七、集群信息查看

bash

运行

复制代码
redis-cli -c cluster nodes

返回结果包含:节点 ID、IP: 端口、角色(Master/Slave)、槽位范围、主从关系。


八、集群扩容:添加新节点

方法 1:cluster meet 加入集群

bash

运行

复制代码
redis-cli -c -p 6379 cluster meet 192.168.8.107 6379

新节点默认角色为 Master,无槽位、无数据。

方法 2:redis-cli --cluster add-node

bash

运行

复制代码
redis-cli --cluster add-node 192.168.8.108:6379 192.168.8.107:6379
  • 第一个地址:新节点
  • 第二个地址:集群中任意已有节点

设置新节点为 Slave

bash

运行

复制代码
# 连接新节点
redis-cli -h 192.168.8.108 -p 6379
# 执行主从绑定(ID为目标Master的节点ID)
cluster replicate 5472bbc9226737ca2199e146080ddaa41686a694

九、槽位自动均衡

新 Master 无槽位,需重新分片均衡:

bash

运行

复制代码
redis-cli --cluster rebalance \
--cluster-threshold 1 \
--cluster-use-empty-masters \
192.168.8.101:6379

补充知识点

  • --cluster-threshold 1:槽位差异≤1 个时触发均衡
  • --cluster-use-empty-masters:允许空 Master 接收槽位
  • 自动将 16384 个槽均匀分配给所有 Master,无需手动指定

十、集群缩容:删除节点

1. 删除 Slave 节点

直接删除,无需清理槽位:

bash

运行

复制代码
redis-cli --cluster del-node 集群节点IP:端口 节点ID

2. 删除 Master 节点(必须先清槽 + 清数据)

bash

运行

复制代码
# 连接待删节点,清空数据+重置集群
redis-cli -h 192.168.8.107 -p 6379
flushall
cluster reset

# 执行删除
redis-cli --cluster del-node 192.168.8.101:6379 fe75330d96c2c3af9c5a02b9819d66b2e8a48da2

十一、高频排错大全

错误 1:ERR Slot 0 is already busy

原因 :节点残留旧集群数据 / 槽位信息解决:所有节点执行:

bash

运行

复制代码
redis-cli flushall
redis-cli cluster reset

错误 2:启动服务提示 127.0.0.1:6379 连接失败

原因 :bind 未监听本地,init 脚本无法连接解决:用绝对路径启动 / 关闭:

bash

运行

复制代码
# 启动
redis-server /etc/redis/6379.conf
# 关闭
redis-cli -h 本机IP -p 6379 shutdown

错误 3:集群创建一直 Waiting for cluster to join

原因 :节点 bind 127.0.0.1,节点间无法通信解决 :配置bind 0.0.0.0,并在 Slave 执行:

bash

运行

复制代码
cluster meet MasterIP 6379

十二、补充重要知识点

  1. 主从自动切换Master 宕机→Slave 自动升主;原 Master 恢复后,变为当前 Master 的 Slave。

  2. Slave 只读设置 Slave 默认只读,客户端需执行 readonly 才能读取 Slave 数据,连接断开后失效。

  3. 启动必须用绝对路径若用相对路径启动,会生成新的 nodes 文件,导致集群主从错乱、崩溃。

  4. 集群不支持的命令多键操作(如 mset、mget、事务)需保证所有 key 在同一槽位,否则执行失败。

  5. 集群选举机制半数以上 Master 投票通过,Slave 才能升主,因此集群节点数建议为奇数。


十三、总结

本文完整复现 Redis 5.0 集群 安装→配置→创建→测试→扩容→缩容→排错 全流程,基于原生redis-cli --cluster工具,无第三方依赖,适合实验与生产落地。

核心要点:

  • 3 主 3 从是高可用最低标准
  • cluster-require-full-coverage no 必改
  • 扩容先加节点→设主从→均衡槽位
  • 删 Master 先清数据再删除
  • 排错优先清理旧集群信息
相关推荐
2401_883600252 小时前
如何配置Oracle的外部口令存储_安全外部密码库Wallet自动登录
jvm·数据库·python
2401_897190552 小时前
如何在MongoDB中实现连表查询_group与累计求和操作
jvm·数据库·python
justjinji2 小时前
PHP源码运行是否受硬盘转速影响_7200转vs5400转对比【指南】
jvm·数据库·python
2301_796588502 小时前
如何用 error 事件全局捕获页面图片或脚本加载失败状态
jvm·数据库·python
GitCode官方2 小时前
G-Star 精选开源项目推荐|第十四期
数据库·人工智能·自动化
qq_413847402 小时前
JavaScript中利用Range对象实现复杂的文本选择操作
jvm·数据库·python
qq_654366982 小时前
Vue.js组件通信Emit处理长列表滚动到底部后的数据请求
jvm·数据库·python
qq_654366982 小时前
CSS3 按钮悬停时显示手型光标(cursor- pointer)的正确写法
jvm·数据库·python
Greyson12 小时前
如何交换表分区_ALTER TABLE EXCHANGE PARTITION实现数据快速导入导出
jvm·数据库·python