Redis 分片集群

发布于:2025-07-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

  Redis 分片集群是解决海量数据存储、高并发读写和高可用性的分布式方案,其核心原理和实现如下:


一、核心原理与架构

  1. 散列插槽(Hash Slot)机制

    • Redis 集群将数据划分为 16384 个虚拟槽,每个键通过 CRC16(key) % 16384 计算所属插槽。
    • 键的有效部分:若键包含 {}(如 {user}123),则仅计算 {} 内的内容;否则计算整个键。
    • 槽位分配到不同主节点,客户端请求时通过重定向(MOVED 响应)定位目标节点。
  2. 去中心化架构

    • 采用 多主多从 模式(推荐 3 主 3 从),节点间通过 Gossip 协议 同步状态。
    • 客户端直连任意节点,无需代理层。

二、集群搭建步骤(以 6 节点为例)

  1. 节点配置

    redis-server --port 7001 --cluster-enabled yes \
                 --cluster-config-file nodes-7001.conf --appendonly yes
    
    • 每个节点需开启集群模式(cluster-enabled yes)并指定元数据文件。
  2. 创建集群

    redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 ... \
              --cluster-replicas 1
    
    • --cluster-replicas 1 表示每个主节点配 1 个从节点。
  3. 验证集群

    • 执行 SET/GET 测试跨节点数据读写,通过 redis-cli --cluster check <节点IP:端口> 检查状态。

三、集群伸缩与数据迁移

  1. 扩容(添加节点)

    • 添加新节点
      redis-cli --cluster add-node <新节点IP:端口> <已有节点IP:端口>
      
    • 迁移槽位
      redis-cli --cluster reshard <已有节点IP:端口> \
                --cluster-from <源节点ID> --cluster-to <新节点ID> --cluster-slots <槽数>
      
      • 迁移时槽状态标记为 IMPORTING/MIGRATING,数据分批转移保证原子性。
  2. 缩容(删除节点)

    • 先迁移待删节点的槽位至其他节点,再执行:
      redis-cli --cluster del-node <已有节点IP:端口> <待删节点ID>
      

四、高可用与故障转移

  1. 自动故障转移

    • 主节点宕机时,从节点自动升主(需半数以上主节点确认)。
    • 节点间通过 PING-PONG 检测健康状态,超时时间由 cluster-node-timeout 控制(默认 15 秒)。
  2. 手动故障转移

    • 在从节点执行 CLUSTER FAILOVER,强制切换主从(适用于维护场景)。

五、数据迁移方案

  1. 官方工具迁移

    • 全量迁移redis-cli --cluster import 但会导致服务中断。
    • 增量迁移:推荐 Redis-Shake(阿里开源),支持断点续传和实时同步:
      ./redis-shake -type=sync -conf=redis-shake.conf  # 全量+增量同步
      
  2. 平滑迁移实践

    • 双写方案:应用层同时写入新旧集群,切换后校验数据一致性。
    • 避坑点
      • 大 Key 需拆分迁移(如超过 1MB 的 String)。
      • 迁移时监控同步延迟(阈值 <100ms)、内存增长(<70%)。

六、最佳实践与工具

  • 客户端配置
    • 使用 Jedis/Lettuce 等支持集群的库,设置重试次数(如 maxRedirects=5)。
  • 运维工具
    • 槽位平衡:redis-cli --cluster rebalance
    • 监控指标:槽位分布、节点状态、网络带宽使用率。

  通过分片机制,Redis 集群实现了数据的水平扩展和高并发负载均衡,配合主从复制与自动故障转移保障了服务的高可用性。建议在业务低峰期执行扩缩容,并提前测试迁移方案。


网站公告

今日签到

点亮在社区的每一天
去签到