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 规划如下Master1192.168.8.101:6379Master2192.168.8.102:6379Master3192.168.8.103:6379Slave1192.168.8.104:6379挂 Master1Slave2192.168.8.105:6379挂 Master2Slave3192.168.8.106:6379挂 Master3前置准备所有节点关闭防火墙与 SELinuxbash运行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-fileRedis 自动生成存储节点、槽位、主从关系禁止编辑cluster-node-timeout 1500015 秒无响应则判定节点宕机配置完成后重启服务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、槽位范围、主从关系。八、集群扩容添加新节点方法 1cluster meet 加入集群bash运行redis-cli -c -p 6379 cluster meet 192.168.8.107 6379新节点默认角色为Master无槽位、无数据。方法 2redis-cli --cluster add-nodebash运行redis-cli --cluster add-node 192.168.8.108:6379 192.168.8.107:6379第一个地址新节点第二个地址集群中任意已有节点设置新节点为 Slavebash运行# 连接新节点 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:端口 节点ID2. 删除 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十一、高频排错大全错误 1ERR 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十二、补充重要知识点主从自动切换Master 宕机→Slave 自动升主原 Master 恢复后变为当前 Master 的 Slave。Slave 只读设置Slave 默认只读客户端需执行readonly才能读取 Slave 数据连接断开后失效。启动必须用绝对路径若用相对路径启动会生成新的 nodes 文件导致集群主从错乱、崩溃。集群不支持的命令多键操作如 mset、mget、事务需保证所有 key 在同一槽位否则执行失败。集群选举机制半数以上 Master 投票通过Slave 才能升主因此集群节点数建议为奇数。十三、总结本文完整复现 Redis 5.0 集群安装→配置→创建→测试→扩容→缩容→排错全流程基于原生redis-cli --cluster工具无第三方依赖适合实验与生产落地。核心要点3 主 3 从是高可用最低标准cluster-require-full-coverage no必改扩容先加节点→设主从→均衡槽位删 Master 先清数据再删除排错优先清理旧集群信息