news 2026/4/16 15:44:58

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/4/16 10:41:59

投资技术如何帮助您的业务增长?

处于成长期的企业&#xff0c;需要精准投资才能维持或加速增长势头。老话说 “要赚钱&#xff0c;先花钱”&#xff0c;而更贴切的说法应该是 “要赚钱&#xff0c;得聪明地花钱”。找到最能拉动企业增长的关键领域&#xff0c;投入充足预算进行优化与拓展&#xff0c;是企业迈…

作者头像 李华
网站建设 2026/4/15 18:19:29

JX6-CON1控制器模块

JX6-CON1 控制器模块JX6-CON1 是一款工业控制器模块&#xff0c;主要用于自动化系统中进行逻辑控制、数据处理和设备通信。它通常与其他 I/O 模块、传感器、执行器配合使用&#xff0c;实现对生产过程的精确控制。主要特点&#xff1a;高性能处理&#xff1a;具备快速运算能力&…

作者头像 李华
网站建设 2026/4/15 16:03:09

告别充电桩管理痛点,安科瑞DJSF1352-D直流电能表是关键答案

01 引言 随着电动汽车的普及&#xff0c;充电桩数量快速增长&#xff0c;运营管理问题也日益凸显。充电数据不准、设备监控困难、能耗统计繁琐……这些痛点是否也让您倍感压力&#xff1f; 安科瑞DTSF1352-D直流电能表的出现&#xff0c;为充电桩运营管理带来了全新的解决方案&…

作者头像 李华
网站建设 2026/4/14 14:03:21

npm发布制品包,最新策略2FA

今天要往npm上面推包&#xff0c;结果一直报token过去&#xff0c;项目404然后查了半天&#xff0c;发现是npm加个安全策略2FA&#xff0c;之前的token方式全部作废怎么去打开2FA呢:1.登录npm官网&#xff0c;找到account 2.然后找到2FA&#xff0c;去enable3.这个时候会跳出一…

作者头像 李华
网站建设 2026/4/15 5:50:26

AI Agent学习:MetaGPT之我的工作

ref: ‍⁠​‌&#xfeff;​‌​‬‍​​​​&#xfeff;‍​​​⁠⁠​⁠​​‬&#xfeff;‍‍​&#xfeff;&#xfeff;​‌​​&#xfeff;&#xfeff;‬&#xfeff;​​《MetaGPT智能体开发入门》教程 - 飞书云文档 【多Agent】MetaGPT学习教程 - 飞书云文档 一…

作者头像 李华
网站建设 2026/4/16 11:06:02

蓝牙打印(二)不指定某个打印机

蓝牙页面-手动点击搜索蓝牙 然后选中某个打印机 进行手动点击打印--权限配置什么的 在上面某个都已配置了import React, { useEffect, useState, useRef } from react; import {Button,View,Alert,PermissionsAndroid,Platform,Text,ScrollView,TouchableOpacity, } from reac…

作者头像 李华