news 2026/2/25 0:47:47

Redis高可用部署与集群管理实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis高可用部署与集群管理实战

本文详解Redis高可用架构设计,从主从复制到哨兵模式再到Cluster集群的完整实践。

前言

Redis作为最流行的缓存数据库:

  • 高性能:10万+ QPS
  • 丰富的数据结构
  • 简单易用

但单机Redis存在问题:

  • 单点故障
  • 容量有限
  • 无法水平扩展

今天来讲Redis的高可用部署方案。


一、高可用架构选型

1.1 架构对比

架构特点适用场景
主从复制读写分离,手动故障转移小规模,读多写少
哨兵模式自动故障转移中等规模
Cluster集群分片存储,高可用大规模,数据量大

1.2 如何选择

数据量 < 10GB,QPS < 5万:主从复制 数据量 < 50GB,需要自动故障转移:哨兵模式 数据量 > 50GB,需要分片:Cluster集群

二、主从复制

2.1 架构图

┌─────────────┐ │ Master │ │ 192.168.1.1 │ │ :6379 │ └──────┬──────┘ │ 同步 ┌───┴───┐ ↓ ↓ ┌──────┐ ┌──────┐ │Slave1│ │Slave2│ │ .2 │ │ .3 │ └──────┘ └──────┘

2.2 Docker部署

# docker-compose.ymlversion:'3.8'services:redis-master:image:redis:7container_name:redis-masterports:-"6379:6379"volumes:-./master/data:/data-./master/redis.conf:/etc/redis/redis.confcommand:redis-server /etc/redis/redis.confredis-slave1:image:redis:7container_name:redis-slave1ports:-"6380:6379"volumes:-./slave1/data:/data-./slave1/redis.conf:/etc/redis/redis.confcommand:redis-server /etc/redis/redis.confdepends_on:-redis-masterredis-slave2:image:redis:7container_name:redis-slave2ports:-"6381:6379"volumes:-./slave2/data:/data-./slave2/redis.conf:/etc/redis/redis.confcommand:redis-server /etc/redis/redis.confdepends_on:-redis-master

2.3 配置文件

Master配置:

# master/redis.confbind0.0.0.0 port6379requirepass yourpassword masterauth yourpassword appendonlyyes

Slave配置:

# slave1/redis.confbind0.0.0.0 port6379requirepass yourpassword masterauth yourpassword replicaof redis-master6379appendonlyyesreplica-read-onlyyes

2.4 验证同步

# 连接Masterredis-cli -h127.0.0.1 -p6379-a yourpassword# 查看复制状态127.0.0.1:6379>INFO replication# role:master# connected_slaves:2# 写入数据127.0.0.1:6379>SETtest"hello"# 连接Slave验证redis-cli -h127.0.0.1 -p6380-a yourpassword127.0.0.1:6380>GETtest"hello"

三、哨兵模式

3.1 架构图

┌────────────────────────────────┐ │ Sentinel集群 │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ S1 │ │ S2 │ │ S3 │ │ │ └──┬──┘ └──┬──┘ └──┬──┘ │ └─────┼───────┼───────┼────────┘ │ │ │ 监控 ┌──────┴───────┴───────┴──────┐ ↓ ↓ ┌─────────────┐ ┌─────────────┐ │ Master │──同步──────→│ Slave │ └─────────────┘ └─────────────┘ 故障转移:Master挂了 → Sentinel投票 → 提升Slave为Master

3.2 部署配置

# docker-compose.yml 添加哨兵sentinel1:image:redis:7container_name:sentinel1ports:-"26379:26379"volumes:-./sentinel1/sentinel.conf:/etc/redis/sentinel.confcommand:redis-sentinel /etc/redis/sentinel.confsentinel2:image:redis:7container_name:sentinel2ports:-"26380:26379"volumes:-./sentinel2/sentinel.conf:/etc/redis/sentinel.confcommand:redis-sentinel /etc/redis/sentinel.confsentinel3:image:redis:7container_name:sentinel3ports:-"26381:26379"volumes:-./sentinel3/sentinel.conf:/etc/redis/sentinel.confcommand:redis-sentinel /etc/redis/sentinel.conf

Sentinel配置:

# sentinel.confport26379sentinel monitor mymaster redis-master63792sentinel auth-pass mymaster yourpassword sentinel down-after-milliseconds mymaster5000sentinel failover-timeout mymaster60000sentinel parallel-syncs mymaster1

3.3 故障转移测试

# 停止Masterdocker stop redis-master# 查看Sentinel日志docker logs sentinel1# +sdown master mymaster 192.168.1.1 6379# +odown master mymaster 192.168.1.1 6379 #quorum 2/2# +switch-master mymaster 192.168.1.1 6379 192.168.1.2 6379# Slave已提升为新Master

3.4 客户端连接

// Java连接哨兵Set<String>sentinels=newHashSet<>();sentinels.add("192.168.1.1:26379");sentinels.add("192.168.1.2:26379");sentinels.add("192.168.1.3:26379");JedisSentinelPoolpool=newJedisSentinelPool("mymaster",sentinels,config,"yourpassword");

四、Cluster集群

4.1 架构图

┌────────────┐ ┌────────────┐ ┌────────────┐ │ Master1 │ │ Master2 │ │ Master3 │ │ Slot 0-5460│ │Slot 5461- │ │Slot 10923- │ │ │ │ 10922 │ │ 16383 │ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ │ │ │ ↓ ↓ ↓ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ Slave1 │ │ Slave2 │ │ Slave3 │ └────────────┘ └────────────┘ └────────────┘ 数据按Key的CRC16值分配到16384个槽位 每个Master负责一部分槽位

4.2 部署

# 创建6个节点(3主3从)forportin700170027003700470057006;domkdir-p cluster/${port}cat>cluster/${port}/redis.conf<<EOF port${port}cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes requirepass yourpassword masterauth yourpassword EOFdone# 启动节点forportin700170027003700470057006;dodocker run -d --name redis-${port}\-p${port}:${port}-p1${port}:1${port}\-v$(pwd)/cluster/${port}:/data\redis:7 redis-server /data/redis.confdone# 创建集群redis-cli --cluster create\192.168.1.1:7001192.168.1.1:7002192.168.1.1:7003\192.168.1.1:7004192.168.1.1:7005192.168.1.1:7006\--cluster-replicas1-a yourpassword

4.3 集群操作

# 连接集群(-c表示集群模式)redis-cli -c -p7001-a yourpassword# 查看集群状态127.0.0.1:7001>CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_known_nodes:6# 查看节点信息127.0.0.1:7001>CLUSTER NODES# 设置Key(自动路由)127.0.0.1:7001>SET user:1"test"->Redirected to slot[8106]located at192.168.1.1:7002 OK

4.4 扩容

# 添加新节点redis-cli --cluster add-node192.168.1.1:7007192.168.1.1:7001 -a yourpassword# 重新分配槽位redis-cli --cluster reshard192.168.1.1:7001 -a yourpassword# 添加从节点redis-cli --cluster add-node192.168.1.1:7008192.168.1.1:7007\--cluster-slave --cluster-master-id<master-id>-a yourpassword

五、跨机房/多站点部署

5.1 场景挑战

需求: - 总部机房:3台服务器 - 分部机房:3台服务器 - 需要搭建6节点Cluster 挑战: - 两个机房网络不通 - Redis Cluster需要节点互通

5.2 解决方案

使用组网软件(如星空组网)打通网络:

组网后的部署: ┌─────────────────────────────────────────────────────────┐ │ 组网虚拟局域网 │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 总部机房 │ │ 分部机房 │ │ │ │ │ │ │ │ │ │ Master1(10.10.0.1) │ Master2(10.10.0.4)│ │ │ │ Master3(10.10.0.2) │ Slave1 (10.10.0.5)│ │ │ │ Slave2 (10.10.0.3) │ Slave3 (10.10.0.6)│ │ │ │ │ │ │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘

配置:

# 各节点配置中使用组网IP# 节点1(总部)cluster-announce-ip10.10.0.1 cluster-announce-port7001cluster-announce-bus-port17001# 节点4(分部)cluster-announce-ip10.10.0.4 cluster-announce-port7001cluster-announce-bus-port17001# 创建集群时使用组网IPredis-cli --cluster create\10.10.0.1:700110.10.0.2:700110.10.0.3:7001\10.10.0.4:700110.10.0.5:700110.10.0.6:7001\--cluster-replicas1-a yourpassword

效果:

  • 跨机房节点通过组网IP互通
  • Cluster正常工作
  • 加密传输,安全可靠

5.3 跨机房容灾策略

主从分布策略: - 每个Master的Slave部署在不同机房 - 机房故障时,另一机房的Slave可提升为Master ┌──────────────┐ ┌──────────────┐ │ 总部 │ │ 分部 │ │ Master1 ←───────同步──→ Slave1 │ │ Master2 ←───────同步──→ Slave2 │ │ Slave3 ←───────同步──→ Master3 │ └──────────────┘ └──────────────┘

六、运维管理

6.1 监控指标

# 关键指标redis-cli INFO|grep-E"connected_clients|used_memory|hit_rate|ops_per_sec"# 监控脚本#!/bin/bashHOSTS=("10.10.0.1:6379""10.10.0.2:6379""10.10.0.3:6379")forhostin${HOSTS[@]};doecho"===$host==="redis-cli -h${host%:*}-p${host#*:}-a yourpassword INFO|\grep-E"connected_clients|used_memory_human|keyspace_hits"done

6.2 数据备份

# RDB备份redis-cli -a yourpassword BGSAVE# 备份文件位置/data/dump.rdb# 定时备份脚本#!/bin/bashDATE=$(date+%Y%m%d_%H%M%S)redis-cli -a yourpassword BGSAVEsleep5cp/data/dump.rdb /backup/redis_${DATE}.rdb

6.3 性能优化

# redis.conf优化# 内存策略maxmemory 4gb maxmemory-policy allkeys-lru# 持久化优化(写入性能)appendfsync everysec# 连接优化tcp-backlog511timeout300tcp-keepalive300# 慢查询日志slowlog-log-slower-than10000slowlog-max-len128

6.4 常用命令

# 查看大Keyredis-cli -a yourpassword --bigkeys# 查看内存分析redis-cli -a yourpassword --memkeys# 慢查询redis-cli -a yourpassword SLOWLOG GET10# 客户端列表redis-cli -a yourpassword CLIENT LIST

七、常见问题

7.1 主从同步延迟

# 查看延迟redis-cli -a yourpassword INFO replication|greplag# 解决方案# 1. 增加repl-backlog-sizerepl-backlog-size 256mb# 2. 网络优化(使用组网降低延迟)

7.2 Cluster MOVED错误

# 客户端需要使用集群模式# Java: JedisCluster# Python: redis-py-clusterJedisCluster cluster=new JedisCluster(nodes, config);

7.3 内存不足

# 查看内存使用redis-cli -a yourpassword INFO memory# 清理过期Keyredis-cli -a yourpassword --scan --pattern"*"|head-1000|xargsredis-cli DEL# 设置过期时间EXPIRE key3600

八、总结

Redis高可用部署要点:

架构节点数自动故障转移分片
主从复制2+
哨兵模式5+(含哨兵)
Cluster6+

我的建议:

  • 小项目:主从复制够用
  • 一般项目:哨兵模式
  • 大数据量:Cluster集群
  • 跨机房:组网 + Cluster

关键配置:

1. 密码认证 2. 持久化策略 3. 内存限制 4. 监控告警

参考资料

  1. Redis官方文档:https://redis.io/docs/
  2. Redis Cluster扩展指南:https://redis.io/learn/operate/redis-at-scale/scalability/
  3. Redis集群API文档:https://redis.io/docs/latest/operate/rs/clusters/

💡建议:生产环境至少使用哨兵模式,避免单点故障。定期备份数据,监控内存使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 7:25:24

Kali Linux 渗透测试实践:从扫描到攻击的全流程

信息收集&#xff1a;被动扫描与主动扫描 信息收集分为被动扫描&#xff08;不主动发送数据包&#xff0c;规避检测&#xff09; 和主动扫描&#xff08;主动探测目标&#xff0c;获取深度信息&#xff09; &#xff0c;二者结合可全面掌握靶机状态。​ 1. 被动扫描&#xff…

作者头像 李华
网站建设 2026/2/11 18:16:32

A860-0360-T101编码器

A860-0360-T101 编码器A860-0360-T101 是一款高精度旋转编码器&#xff0c;广泛应用于数控机床、伺服系统、自动化生产线及精密机械设备中&#xff0c;用于检测轴的旋转位置和速度&#xff0c;为控制系统提供精确的反馈信号。主要功能与特点&#xff1a;高分辨率&#xff1a;能…

作者头像 李华
网站建设 2026/2/23 10:25:39

D313-079B伺服电机

D313-079B 伺服电机D313-079B 是一款高性能伺服电机&#xff0c;广泛应用于工业自动化、数控机床、机器人及精密设备中&#xff0c;用于提供高精度的位置、速度和力矩控制。主要特点&#xff1a;高精度控制&#xff1a;支持闭环反馈&#xff0c;确保位置和速度的精准控制。高响…

作者头像 李华
网站建设 2026/2/21 11:28:43

GEO战略解码:AI搜索时代,如何重构品牌认知的底层逻辑

摘要当用户向DeepSeek询问“B2B供应链金融解决方案”时&#xff0c;AI直接整合并推荐了三个品牌及其核心优势&#xff0c;而你的品牌未被提及——这意味着在AI定义的新世界里&#xff0c;你的品牌已经“主动隐身”。本文旨在为数字营销负责人、CMO及战略规划者提供一份深度指南…

作者头像 李华
网站建设 2026/2/24 0:55:08

【小白笔记】删除排序链表中的重复元素(I 和II)

这道题充分利用了链表便于删除节点的特性&#xff0c;以及题目给出的**“已排序”**这个关键前提。1. 解题思路&#xff1a;一次遍历 由于链表是已排序的&#xff0c;所有重复的元素在物理位置上一定是相邻的。 初始化&#xff1a;让一个指针 cur 指向 head。比较与去重&#x…

作者头像 李华