问题根源
单机 Redis 存在内存容量和吞吐量瓶颈,分片通过将数据分散到多个节点解决此问题。
核心价值
方案 | 工作原理 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
客户端分片 | 客户端计算键的哈希值,直接路由到目标节点(如取模或一致性哈希) | 无代理层,架构简单 | 节点变更需客户端调整,扩容复杂 | 小规模固定集群 |
代理分片 | 通过中间件(如 Twemproxy)接收请求,由代理计算分片并转发 | 客户端无感知,屏蔽分片细节 | 代理层可能成为性能瓶颈 | 需兼容旧客户端的场景 |
服务端分片(Redis Cluster) | 节点间通过 Gossip 协议同步槽位信息,客户端请求由服务端重定向(MOVED 指令) | 自动故障转移、支持动态扩缩容 | 不支持跨槽事务和多键操作 | 生产环境首选方案 |
集群要求
数据迁移命令
1 2 |
# 将槽位 1000 从节点 A 迁移到节点 B redis-cli --cluster reshard <节点A_IP>:<端口> --cluster-from <节点A_ID> --cluster-to <节点B_ID> --cluster-slots 1000 |
客户端交互
为何使用 16384 槽?
分片下的限制
1 |
MSET {user:1000}.name "Alice" {user:1000}.age 30 # 使用相同 HashTag |
总结:Redis 分片是分布式系统的核心技术,虚拟槽方案(Redis Cluster)凭借自动分片、故障转移和动态扩缩容能力,成为生产环境首选。设计时需关注数据均衡性、扩容成本及跨分片操作限制
基础配置(redis.conf)
1 2 3 4 5 |
cluster-enabled yes # 启用集群模式 cluster-config-file nodes-6379.conf # 节点自动生成的集群配置文件 cluster-node-timeout 15000 # 节点失联判定时间(毫秒) cluster-replica-validity-factor 10 # 从节点有效性因子(超时倍数) cluster-migration-barrier 1 # 主节点最少保留的从节点数 |
网络与安全
1 2 3 4 |
bind 0.0.0.0 # 允许所有IP访问 protected-mode no # 关闭保护模式(需配合密码) requirepass yourpassword # 集群密码(所有节点需一致) masterauth yourpassword # 主从认证密码 |
集群总线端口需开放(默认:Redis端口 + 10000)。
数据持久化
1 2 |
appendonly yes # 开启AOF持久化 appendfsync everysec # 折衷性能与数据安全 |
1. 节点初始化
1 |
# 启动6个节点(3主3从) redis-server /path/to/redis-7000.conf # 端口7000-7005 |
2. 集群创建命令
1 2 3 4 5 |
redis-cli --cluster create \ 192.168.1.1:7000 192.168.1.1:7001 192.168.1.1:7002 \ 192.168.1.1:7003 192.168.1.1:7004 192.168.1.1:7005 \ --cluster-replicas 1 \ --cluster-yes |
3. 集群验证
1 2 |
redis-cli -c -p 7000 cluster nodes # 查看节点角色及槽分布 redis-cli -p 7000 cluster info # 检查集群健康状态 |
1. 节点扩容
1 2 3 4 |
# 添加新主节点 redis-cli --cluster add-node 192.168.1.2:7006 192.168.1.1:7000 # 迁移槽位(交互式) redis-cli --cluster reshard 192.168.1.1:7000 |
扩容后需手动平衡槽位,避免热点问题58。
2. 故障转移模拟
1 |
# 手动触发主从切换(在从节点执行) redis-cli -p 7003 CLUSTER FAILOVER |
3. 集群修复
1 |
# 修复孤儿槽(无主节点的槽) redis-cli --cluster fix 192.168.1.1:7000 |
槽位分配优化
客户端连接策略
监控指标
指标 | 监控命令 | 告警阈值 |
---|---|---|
节点状态 | CLUSTER NODES | 任何节点不可达 |
槽位覆盖率 | CLUSTER INFO 的 cluster_slots_ok | 必须为 16384 |
内存使用率 | INFO MEMORY | >80% 触发告警 |
节点无法加入集群
槽位迁移卡顿
数据不一致
通过以上配置与运维策略,可构建高可用的 Redis Cluster 环境。实际部署时需结合监控工具(如 Prometheus)持续观察集群状态。
优点
缺点
优点
缺点
优点
缺点
模式 | 数据分片 | 自动故障转移 | 读写扩展性 | 适用场景 |
---|---|---|---|---|
主从复制 | ? | ? | 读扩展 | 读多写少,容灾备份 |
哨兵模式 | ? | ?? | 读扩展 | 高可用但数据量中等 |
Cluster模式 | ?? | ?? | 读写扩展 | 海量数据与高并发场景 |