
一、分片集群的出现背景主从 哨兵只能解决高可用、读高并发无法解决两个痛点海量数据存储单 master 容量上限写高并发写请求只能打在 master写压力无法水平扩展分片集群Redis Cluster可以同时解决上面两个问题。分片集群特征集群内多个 master 节点每个 master 保存不同分片数据每个 master 可以挂载多个 slaveslave 作为 master 副本实现故障兜底master 之间互相 ping检测节点健康状态客户端访问任意节点请求会被转发到存放对应 slot 的正确节点二、哈希插槽hash slot核心考点Redis Cluster 一共16384 个插槽0 ~ 16383数据key 绑定插槽不是绑定节点master 节点负责管理一段连续 slot 区间计算 slot 公式CRC16(有效key) % 16384有效 key 规则key 带{xxx}且{}内部非空只拿 {} 里面的内容做 CRC16。例{itcast}num用itcast计算 slot无{}整个 key 作为有效部分计算作用利用 {} 可以实现哈希标签让多个 key 落到同一个 slot支持集群内多 key 操作mget/multi示例3 主 3 从集群分配70010~546070025461~10922700310923~16383三、集群配置文件核心参数# 集群节点配置文件redis自动维护不用手动创建 cluster-config-file /tmp/6379/nodes.conf # 节点心跳超时超过这个时间判定疑似下线 cluster-node-timeout 5000 # 持久化目录 dir /tmp/6379 # 绑定地址 bind 0.0.0.0 # 后台运行 daemonize yes # 对外暴露的实例IP宿主机IP容器环境必配 replica-announce-ip 192.168.150.101 protected-mode no # 集群只能用db0只支持1个数据库 databases 1 logfile /tmp/6379/run.log重点集群模式下databases 只能为 1只有 db0四、故障转移自动故障master 宕机自动故障转移流程故障 master 与集群其他节点断开连接其他 master 持续 ping超时后标记为master,fail?疑似宕机集群过半 master 确认宕机标记master,fail自动将它的 slave 提升为新 master客户端收到集群通知更新 slot 与节点映射后续请求访问新 master五、手动故障迁移 cluster failover在 slave 节点执行cluster failover实现无感知主从切换常用于运维停机升级。完整 6 步流程slave 通知旧 master停止接收客户端写请求master 返回当前数据 offset 给 slaveslave 等待 offset 对齐保证数据完全一致开始故障转移准备slave 标记自己为新 master向全集群广播变更其他 master 收到广播更新集群信息客户端访问新 master三种模式表格模式说明风险默认完整 6 步等待 offset 对齐安全等待数据同步force跳过 offset 校验不等数据完全一致可能丢少量数据takeover直接执行第 5 步忽略数据一致性、集群其他节点意见高风险极易数据不一致六、集群运维命令 redis-cli --cluster# 创建集群 redis-cli --cluster create ... # 检查集群状态 redis-cli --cluster check host:port # 查看集群信息 redis-cli --cluster info host:port # 修复集群 redis-cli --cluster fix host:port # 添加新节点 redis-cli --cluster add-node new_host:new_port exist_host:exist_port # 添加从节点--cluster-slave --cluster-master-id 主节点id redis-cli --cluster add-node new_host:new_port exist_host:exist_port --cluster-slave --cluster-master-id xxx七、SpringBoot RedisTemplate 访问集群Lettuce 底层步骤和哨兵基本一致仅配置不同引入 spring-boot-starter-data-redis 依赖yaml 配置集群所有节点地址配置读写分离readFromspring: redis: cluster: nodes: - 192.168.150.101:7001 - 192.168.150.101:7002 - 192.168.150.101:7003 - 192.168.150.101:8001 - 192.168.150.101:8002 - 192.168.150.101:8003