Redis 分区

Redis 分区(Partitioning)全攻略(2025 版)

核心目标水平扩展,突破单机 内存、CPU、网络 瓶颈,实现 高可用 + 高性能


1. 什么是 Redis 分区?

项目说明
定义将数据 拆分到多个 Redis 实例,每个实例负责一部分 key
目的解决 单机内存上限(64GB+)单核 CPU 瓶颈网络带宽饱和
类型客户端分片代理分片Redis Cluster(官方集群)

2. 三种分区方式对比(2025 推荐

方式架构优点缺点适用场景
客户端分片应用直连多实例性能最高、无中间件客户端复杂、运维难小型团队、自研
代理分片Twemproxy / Redis Proxy客户端透明、易迁移单点、性能损耗中型项目
Redis Cluster官方集群(内置分片)高可用、自动故障转移、动态扩缩容复杂、多 key 操作受限生产首选

2025 推荐Redis Cluster(7.2+ 版本成熟稳定)


3. Redis Cluster 深度解析

3.1 核心概念

概念说明
16384 个槽(Slot)key → CRC16(key) % 16384 映射到槽
主从复制每个槽有 1 主 + N 从
故障转移从节点自动晋升
Gossip 协议节点间心跳,状态同步
Cluster Bus端口 +10000(16379)用于集群通信
[Node A:7000]  slots: 0-5460     (Master)
[Node B:7001]  slots: 5461-10922 (Master)
[Node C:7002]  slots: 10923-16383(Master)
[Node D:7003]  replica of A
[Node E:7004]  replica of B
[Node F:7005]  replica of C

3.2 搭建 Redis Cluster(6 节点示例)

步骤 1:配置文件(redis-7000.conf

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
bind 0.0.0.0
protected-mode no

复制 7000~7005 共 6 份,修改 port

步骤 2:启动所有节点

for i in {7000..7005}; do
    redis-server redis-$i.conf
done

步骤 3:创建集群(Redis 5+ 一键)

redis-cli --cluster create \
  127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
  127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
  --cluster-replicas 1

输出:

>>> Performing hash slots allocation on 6 nodes...
M: node1 127.0.0.1:7000 slots:0-5460
M: node2 127.0.0.1:7001 slots:5461-10922
...
Can I set the above configuration? (type 'yes' to accept): yes

3.3 动态扩容(在线添加节点)

# 1. 启动新节点(7006 主,7007 从)
redis-server redis-7006.conf
redis-server redis-7007.conf

# 2. 加入集群
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000

# 3. 设置 7007 为 7006 的从节点
redis-cli -p 7007 cluster replicate <node-id-of-7006>

# 4. 重新分片(迁移槽)
redis-cli --cluster reshard 127.0.0.1:7000
# 输入:要迁移的槽数(如 4096),源节点(all),目标节点(7006 的 node-id)

3.4 客户端连接 Cluster

Java(Lettuce)

Set<RedisURI> nodes = Stream.of(7000,7001,7002,7003,7004,7005)
    .map(p -> RedisURI.create("redis://127.0.0.1:" + p))
    .collect(Collectors.toSet());

RedisClusterClient client = RedisClusterClient.create(nodes);
StatefulRedisClusterConnection<String, String> conn = client.connect();

conn.sync().set("key", "value");  // 自动路由

Python(redis-py-cluster)

from rediscluster import RedisCluster

nodes = [{"host": "127.0.0.1", "port": p} for p in range(7000, 7006)]
rc = RedisCluster(startup_nodes=nodes, decode_responses=True)
rc.set("key", "value")

4. 分区策略:key 分配最佳实践

策略示例说明
哈希标签(Hash Tag){user:1000}:profile强制同槽
前缀分片user:1000:info, user:1000:stats{user:1000} 包裹
批量操作MGET key1 key2必须同槽,否则报 CROSSSLOT
避免热点 key不要所有 key 都用 {hot}均匀分布
# 计算 key 所属槽
redis-cli CLUSTER KEYSLOT "{user:123}:profile"
# → 返回槽号

5. 多 key 操作限制与解决方案

操作是否支持解决方案
MGET key1 key2仅同槽使用 Hash Tag
SUNION set:a set:b仅同槽客户端合并
DEL key1 key2仅同槽Pipeline + Hash Tag
SCAN支持自动跨节点

6. 性能与容量规划

指标单节点6 节点 Cluster
内存64GB384GB
QPS10W60W+
故障影响全挂仅 1/3 数据不可用

Redis 7+ IO 线程:每个节点 io-threads 4 → QPS 再提升 50%


7. 监控与运维

7.1 关键命令

redis-cli --cluster check 127.0.0.1:7000    # 集群健康
redis-cli CLUSTER INFO                     # 状态概览
redis-cli CLUSTER NODES                    # 节点详情
redis-cli INFO replication                 # 主从状态

7.2 监控指标

# Prometheus + redis_exporter
redis_cluster_slots_assigned
redis_cluster_slots_ok
redis_cluster_state  # 1=ok, 0=fail
redis_connected_clients

8. 常见问题与坑

问题原因解决方案
CROSSSLOT Keys in request don't hash to the same slot多 key 不同槽使用 {} Hash Tag
扩容后数据不均衡槽迁移未完成redis-cli --cluster fix
从库延迟高网络/磁盘开启 repl-diskless-sync yes
集群状态 fail超过半数主节点失联确保节点 > 3,网络稳定
客户端连接失败未使用 Cluster 客户端改用 RedisClusterClient

9. 一键部署脚本(Docker Compose)

# docker-compose.yml
version: '3.8'
services:
  redis-7000:
    image: redis:7.2
    command: redis-server /usr/local/etc/redis/redis.conf
    volumes:
      - ./conf/7000.conf:/usr/local/etc/redis/redis.conf
    ports: ["7000:7000", "17000:17000"]

  # ... 7001~7005 类似
# 启动后创建集群
docker exec -it redis-7000 redis-cli --cluster create \
  $(docker ps -q --filter "name=redis" | xargs -I {} echo 172.17.0.1:{} | tr '\n' ' ') \
  --cluster-replicas 1

10. 最佳实践清单(Checklist)

项目检查
使用 Redis Cluster官方推荐
至少 3 主 + 3 从高可用
所有 key 使用 Hash Tag多 key 操作
客户端使用 Cluster 模式自动路由
定期 CLUSTER CHECK健康检测
备份每个节点 RDB/AOF灾难恢复
监控 cluster_state告警
扩容前测试 reshard验证流程

小结:分区选型决策树

graph TD
    A[数据量 > 50GB?] -->|是| B[需要高可用?]
    B -->|是| C[使用 Redis Cluster]
    B -->|否| D[客户端分片]
    A -->|否| E[单机 Redis 即可]

彩蛋:Redis 8+ 新特性(2025)

  • 动态槽迁移CLUSTER SETSLOT ... MIGRATING/IMPORTING 支持零停机
  • Cluster Proxy:官方代理,替代 Twemproxy
  • 自动故障转移优化:毫秒级探测

需要 K8s StatefulSet 部署 ClusterTerraform 自动化扩缩容跨可用区分片分片迁移零停机方案?随时告诉我!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部