Redis集群模式详解与实战配置

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 部署建议

  1. 节点数量:建议至少3个主节点,每个主节点配置1-2个从节点
  2. 网络配置:使用内网IP,避免跨机房部署
  3. 硬件配置:使用SSD硬盘,足够的内存

9.2 配置建议

参数 推荐值 说明
cluster-node-timeout 15000ms 节点超时时间
cluster-slave-validity-factor 10 从节点有效性因子
maxmemory-policy allkeys-lru 内存淘汰策略
tcp-keepalive 300 TCP保活时间

9.3 运维建议

  1. 定期备份:使用BGSAVE定期备份数据
  2. 监控告警:设置关键指标告警
  3. 升级策略:先升级从节点,再故障转移后升级原主节点

通过合理配置Redis集群,可以构建高可用、高性能的缓存服务。

相关推荐
用户298698530142 小时前
Java 获取 Word 文档中修订记录的实现方法
java·后端
你的保护色2 小时前
ensp之STP、RSTP、MSTP协议实验
java·服务器·数据库
JAVA学习通3 小时前
《大营销平台系统设计实现》 - 营销服务 第5节:抽奖前置规则过滤
java·数据库·github
斯特凡今天也很帅3 小时前
新建数据源报错No bean named ‘SqlSessionFactorykf‘ available
java·数据库·spring boot·mybatis
带刺的坐椅3 小时前
用 Solon AI 从零构建 MCP 工具服务:让 AI Agent 拥有真实世界的能力
java·ai·solon·mcp·solon-ai
TheRouter3 小时前
PromptCaching 工程实践:把LLM 调用成本砍掉80%
java·后端·spring·ai
寻道码路3 小时前
LangChain4j Java AI 应用开发实战(二):大模型参数调优实战:Temperature、TopP、MaxTokens 深度解析
java·开发语言·人工智能·aigc
Kiling_07043 小时前
面向对象和集合编程题 ( 一 )
jvm·windows
SimonKing3 小时前
IP定位库的完美替代品:ip2region,开源、免费!
java·后端·程序员