Redis分布式缓存-分片集群

发布时间:2026/7/22 22:35:19

Redis分布式缓存-分片集群 2.散列插槽3.集群伸缩-reshred命令4.故障转移Redis 分片集群Cluster全解析突破单机容量与性能极限一、为什么需要 Redis 分片集群Redis 主从 哨兵架构解决了高可用和读并发问题但仍存在核心瓶颈容量瓶颈单节点内存有限推荐不超过 16GB无法存储海量数据性能瓶颈单节点 CPU / 网络带宽有限写操作无法横向扩展扩展局限主从架构仅能扩展读能力写能力仍依赖单主节点。Redis Cluster分片集群是 Redis 官方提供的分布式解决方案核心目标是数据分片将数据分散存储到多个节点突破单机容量限制读写扩展写操作随节点数量线性扩展支撑更高并发自动故障转移内置高可用能力无需依赖哨兵去中心化无中心节点所有节点对等避免单点故障。简单来说主从 哨兵解决 “高可用”分片集群解决 “海量数据 高并发写”。二、分片集群核心原理1. 数据分片机制Redis Cluster 采用哈希槽Hash Slot实现数据分片核心规则总共有16384个哈希槽每个节点负责一部分槽位计算规则槽位 CRC16(key) % 16384若指定{hash-tag}则按 tag 计算保证相关 key 落在同一节点数据迁移槽位可在节点间无缝迁移扩展 / 缩容时不影响业务。2. 集群架构特性节点角色主节点负责哈希槽和数据读写可配置从节点从节点备份主节点数据主节点故障时自动升级为主节点通信机制节点间通过 Gossip 协议交换状态槽位分配、节点健康端口为63791000016379故障检测主观下线PFAIL单个节点判定某节点无响应客观下线FAIL超过半数主节点达成共识标记为客观下线故障转移从节点选举升级为主节点接管槽位。3. 核心特性表格特性说明应用价值无中心架构所有节点平等无主从之分避免中心节点性能瓶颈哈希槽分片16384 个槽位灵活分配 / 迁移支持动态扩缩容原子性操作同一槽位的 key 可执行 MULTI/EXEC跨槽位需客户端分片保证数据一致性读写分离主节点写从节点读需客户端支持提升读并发三、核心配置与关键操作1. 核心配置redis.confconf# 开启集群模式 cluster-enabled yes # 集群配置文件自动生成无需手动修改 cluster-config-file nodes-6379.conf # 节点超时时间毫秒 cluster-node-timeout 15000 # 开启AOFRDB混合持久化 aof-use-rdb-preamble yes # 其他基础配置 bind 0.0.0.0 protected-mode no port 6379 daemonize yes requirepass 123456 masterauth 1234562. 关键操作创建集群Redis5.0bash运行redis-cli --cluster create 192.168.1.100:6379 192.168.1.101:6379 192.168.1.102:6379 \ --cluster-replicas 1 -a 123456 # --cluster-replicas 1每个主节点配1个从节点查看集群状态bash运行redis-cli -c -a 123456 CLUSTER INFO redis-cli -c -a 123456 CLUSTER NODES槽位迁移扩缩容bash运行# 添加节点并分配槽位 redis-cli --cluster add-node 192.168.1.103:6379 192.168.1.100:6379 -a 123456 redis-cli --cluster reshard 192.168.1.100:6379 -a 123456客户端接入Java 示例java运行// Lettuce客户端示例 RedisURI uri1 RedisURI.create(192.168.1.100, 6379); RedisURI uri2 RedisURI.create(192.168.1.101, 6379); RedisURI uri3 RedisURI.create(192.168.1.102, 6379); uri1.setPassword(123456.toCharArray()); RedisClusterClient client RedisClusterClient.create(Arrays.asList(uri1, uri2, uri3)); StatefulRedisClusterConnectionString, String connection client.connect(); RedisClusterCommandsString, String commands connection.sync(); commands.set(user:100, cluster-test); System.out.println(commands.get(user:100)); connection.close(); client.shutdown();四、常见问题与解决方案跨槽位操作报错MOVED/ASK原因MGET/MSET 操作的 key 分布在不同槽位解决方案使用{hash-tag}强制 key 落在同一槽位如{user}:100、{user}:101或客户端拆分操作。集群扩容后数据迁移慢原因迁移时并发度低或节点网络延迟高解决方案调整cluster-migration-barrier参数增加迁移并发度确保节点网络通畅。主节点故障后未自动切换原因从节点数量不足或故障检测超时设置过短解决方案每个主节点至少配置 1 个从节点合理设置cluster-node-timeout推荐 15 秒。集群脑裂原因网络分区导致节点失联出现多个主节点解决方案配置cluster-require-full-coverage no允许部分槽位不可用避免脑裂。五、生产环境最佳实践集群规模最小配置 3 主 3 从每个主节点 1 个从节点推荐 5 主 5 从兼顾性能与高可用部署策略节点跨服务器 / 机房部署避免单机 / 单机房故障容量规划每个主节点内存不超过 16GB槽位均匀分配避免数据倾斜性能优化禁用慢查询如 KEYS、SCAN避免阻塞节点开启管道Pipeline减少网络往返合理设置hash-tag减少跨槽位操作监控告警重点监控槽位分配、节点状态、数据迁移进度、内存使用率运维建议扩缩容在低峰期执行迁移前备份数据避免直接删除节点。总结Redis 分片集群通过哈希槽实现数据分片突破单机容量和写性能瓶颈集群内置高可用能力无需哨兵主节点故障时从节点自动升级生产环境需部署 3 主 3 从以上集群客户端需适配集群模式避免跨槽位操作。

相关新闻