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 先清数据再删除
  • 排错优先清理旧集群信息
相关推荐
czlczl2002092514 分钟前
理解 MySQL 行锁:两阶段锁协议与热点更新优化
数据库·mysql
AllData公司负责人23 分钟前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
哆啦A梦158840 分钟前
20, Springboot3+vue3实现前台轮播图和详情页的设计
javascript·数据库·spring boot·mybatis·vue3
渣渣盟1 小时前
Mysql入门到精通全集(SQL99)包含关系运算,软考数据库工程师复习首选
数据库·mysql·oracle
dishugj2 小时前
HANA 数据库的核心进程架构
数据库
2301_782040452 小时前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
.柒宇.2 小时前
Redis主从复制集群搭建详解
数据库·redis·缓存·主从复制
2301_808414382 小时前
MySQL中的函数
数据库·mysql
Mahir082 小时前
MySQL 数据一致性的基石:三大日志( redo log/undo log/binlog)与两阶段提交(Prepare 阶段和Commit 阶段)深度解密
数据库·后端·mysql·面试
x***r1513 小时前
dbeaver-ce-24.1.3-x86_64-setup安装步骤详解(附DBeaver数据库管理与SQL编写教程)
数据库·sql