Redis集群模式详解与实战配置
一、Redis集群概述
Redis提供多种集群模式,以满足不同规模和可用性需求。
1.1 集群模式对比
| 模式 | 特点 | 适用场景 |
|---|---|---|
| 单机 | 简单,单点故障 | 开发测试 |
| 主从复制 | 读写分离,故障需手动切换 | 中小规模 |
| Sentinel | 自动故障转移 | 高可用场景 |
| Cluster | 分布式分片,自动故障转移 | 大规模集群 |
1.2 Cluster架构
┌─────────────────────────────────────────────────────────────┐
│ Redis Cluster │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────┬─────────┬─────────┬─────────┬─────────┐ │
│ │ Node1 │ Node2 │ Node3 │ Node4 │ Node5 │ ... │
│ │ (主) │ (从) │ (主) │ (从) │ (主) │ │
│ └────┬────┴────┬────┴────┬────┴────┬────┴────┬────┘ │
│ │ │ │ │ │ │
│ └─────────┼─────────┼─────────┼─────────┘ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────┐ │
│ │ 槽位分配 (0-16383) │ │
│ │ Node1: 0-5460 │ │
│ │ Node3: 5461-10922 │ │
│ │ Node5: 10923-16383 │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
二、主从复制模式
2.1 配置主从复制
bash
# 从节点配置文件
slaveof master_ip master_port
slave-read-only yes
replica-priority 100
2.2 哨兵配置
bash
# sentinel.conf
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
2.3 哨兵工作流程
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Sentinel │ │ Sentinel │ │ Sentinel │
│ 1 │ │ 2 │ │ 3 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└────────┬────────┼─────────────────┘
▼
┌──────────────┐
│ Master │
│ Redis │
└──────────────┘
三、Cluster模式配置
3.1 节点配置
bash
# redis.conf
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
3.2 创建集群
bash
# 使用redis-cli创建集群
redis-cli --cluster create \
192.168.1.100:6379 \
192.168.1.101:6379 \
192.168.1.102:6379 \
192.168.1.103:6379 \
192.168.1.104:6379 \
192.168.1.105:6379 \
--cluster-replicas 1
3.3 查看集群状态
bash
# 查看集群信息
redis-cli cluster info
# 查看节点信息
redis-cli cluster nodes
# 查看槽位分配
redis-cli cluster slots
四、集群操作
4.1 添加节点
bash
# 添加主节点
redis-cli --cluster add-node \
new_node:6379 \
existing_node:6379
# 添加从节点
redis-cli --cluster add-node \
new_node:6379 \
existing_node:6379 \
--cluster-slave \
--cluster-master-id master_node_id
4.2 槽位迁移
bash
# 手动迁移槽位
redis-cli --cluster reshard existing_node:6379
# 自动重新平衡
redis-cli --cluster rebalance existing_node:6379
4.3 故障处理
bash
# 手动故障转移
redis-cli cluster failover
# 强制故障转移
redis-cli cluster failover force
# 查看故障转移状态
redis-cli cluster failover info
五、客户端连接
5.1 Java客户端配置
java
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(100);
poolConfig.setMaxIdle(20);
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("node1", 6379));
nodes.add(new HostAndPort("node2", 6379));
nodes.add(new HostAndPort("node3", 6379));
JedisCluster jedisCluster = new JedisCluster(nodes, poolConfig);
5.2 Python客户端配置
python
from rediscluster import RedisCluster
startup_nodes = [
{"host": "node1", "port": "6379"},
{"host": "node2", "port": "6379"},
{"host": "node3", "port": "6379"}
]
rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
5.3 客户端路由
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Client │ │ Redis Cluster │ │ Target Node │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
│ 1. 发送请求 │ │
│───────────────────────>│ │
│ │ │
│ 2. 计算槽位 │ │
│ │ CRC16(key) % 16384 │
│ │ │
│ 3. 返回重定向 │ │
│<───────────────────────│ │
│ │ │
│ 4. 转发到目标节点 │ │
│────────────────────────┼───────────────────────>│
│ │ │
六、高可用配置
6.1 哨兵监控
bash
# 启动哨兵
redis-sentinel sentinel.conf
# 查看哨兵状态
redis-cli -p 26379 sentinel masters
redis-cli -p 26379 sentinel slaves mymaster
6.2 故障转移配置
bash
# sentinel.conf
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 2
sentinel auth-pass mymaster password
6.3 主从切换测试
bash
# 模拟主节点故障
redis-cli shutdown
# 等待故障转移
sleep 30
# 检查新主节点
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
七、性能优化
7.1 连接池配置
java
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(200);
poolConfig.setMaxIdle(50);
poolConfig.setMinIdle(10);
poolConfig.setMaxWaitMillis(1000);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
7.2 命令优化
bash
# 使用批量命令
MSET key1 value1 key2 value2 key3 value3
# 使用管道
redis-cli --pipe < commands.txt
# 使用脚本
EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 mykey myvalue
7.3 内存优化
bash
# 设置内存限制
maxmemory 4gb
maxmemory-policy allkeys-lru
# 禁用持久化(纯缓存场景)
save ""
appendonly no
八、监控与告警
8.1 监控指标
bash
# 查看关键指标
redis-cli INFO stats
redis-cli INFO memory
redis-cli INFO replication
redis-cli INFO cluster
8.2 Prometheus监控
yaml
scrape_configs:
- job_name: 'redis'
static_configs:
- targets: ['redis-node1:9121', 'redis-node2:9121']
8.3 告警规则
yaml
groups:
- name: redis_alerts
rules:
- alert: RedisDown
expr: redis_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Redis实例宕机"
description: "Redis实例 {{ $labels.instance }} 已宕机"
- alert: RedisMemoryHigh
expr: redis_memory_used_bytes / redis_total_system_memory_bytes > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "Redis内存使用率过高"
description: "内存使用率: {{ $value }}%"
九、最佳实践
9.1 部署建议
- 节点数量:建议至少3个主节点,每个主节点配置1-2个从节点
- 网络配置:使用内网IP,避免跨机房部署
- 硬件配置:使用SSD硬盘,足够的内存
9.2 配置建议
| 参数 | 推荐值 | 说明 |
|---|---|---|
| cluster-node-timeout | 15000ms | 节点超时时间 |
| cluster-slave-validity-factor | 10 | 从节点有效性因子 |
| maxmemory-policy | allkeys-lru | 内存淘汰策略 |
| tcp-keepalive | 300 | TCP保活时间 |
9.3 运维建议
- 定期备份:使用BGSAVE定期备份数据
- 监控告警:设置关键指标告警
- 升级策略:先升级从节点,再故障转移后升级原主节点
通过合理配置Redis集群,可以构建高可用、高性能的缓存服务。