Redis的高可用性与集群架构

Redis的高可用性与集群架构

  1. 引言:解释高可用性的重要性及Redis如何实现
  2. 主从复制(Replication)
    • 原理:异步复制,主从数据同步
    • 配置方法
    • 优缺点分析
  3. 哨兵模式(Sentinel)
    • 功能:监控、通知、自动故障转移、配置中心
    • 部署架构(多哨兵节点)
    • 故障转移流程
  4. Redis集群(Cluster)
    • 数据分片(16384个槽)
    • 节点间通信(Gossip协议)
    • 请求重定向(MOVED/ASK)
    • 集群伸缩(添加/删除节点)
  5. 多级高可用架构设计
    • 跨机房部署
    • 读写分离
    • 集群监控
  6. 常见问题及解决方案
    • 脑裂问题
    • 数据一致性
    • 性能瓶颈
  7. 总结与选型建议

一、为什么需要高可用?

单点故障风险
Redis单节点架构存在致命问题:

  • 服务器宕机导致服务不可用
  • 硬件故障造成数据永久丢失
  • 容量瓶颈无法水平扩展

高可用核心目标

  • 🚀 服务连续性:99.99%+ SLA保障
  • 💾 数据可靠性:多副本冗余存储
  • ⚖️ 负载均衡:分散请求压力
  • 🔄 故障自愈:自动故障检测与转移

二、高可用演进三大阶段

1. 主从复制(Replication)

基础高可用方案:一主多从架构

异步复制
异步复制
异步复制
Master
Slave 1
Slave 2
Slave 3

核心特性:

  • 读写分离:写主库,读从库

  • 数据冗余:全量+增量复制

配置简单:

# 在Slave节点配置
replicaof 192.168.1.100 6379
复制流程:
Slave发送PSYNC命令Master执行BGSAVE生成RDBMaster发送RDB文件给SlaveMaster持续发送缓冲区命令Slave加载RDB并执行命令

局限:

  • 主节点单点故障

  • 故障转移需人工干预

  • 写能力无法扩展

2. 哨兵模式(Sentinel)

故障自动转移解决方案

监控
监控
监控
复制
复制
Sentinel
Master
Sentinel
Sentinel
Slave
Slave
S1 -->|投票| S2
S2 -->|投票| S3
S3 -->|选举| S1

核心功能:

  • 监控:持续检查节点健康状态

  • 通知:通过API通知系统管理员

  • 自动故障转移:主节点宕机时选举新主

  • 配置中心:提供主节点发现服务

部署配置(sentinel.conf):
bash

sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

故障转移流程:

  • 多个Sentinel检测主节点失效(主观下线)

  • Sentinel集群投票确认(客观下线)

  • 选举Leader Sentinel

  • Leader选择最优Slave晋升新主

  • 通知其他Slave复制新主

优点:

  • 自动故障转移

  • 配置自动更新

  • 客户端透明切换

局限

  • 写压力仍集中在单主节点

  • 扩容复杂(需重新分片)

  • 集群规模受限(建议<200节点)

3. Redis Cluster(分布式集群)

终极解决方案:去中心化分片集群

哈希槽
哈希槽
哈希槽
哈希槽
主从
主从
主从
主从
请求
请求
节点1
节点2
节点3
节点4
副本1
副本2
副本3
副本4
Client

核心设计:
1.数据分片:

  • 16384个哈希槽(hash slot)

  • 槽分配公式:slot = CRC16(key) mod 16384

  • 每个节点负责部分槽范围

2.节点通信:

  • Gossip协议(PING/PONG)

  • 每秒随机通信5个节点

  • 元数据最终一致性

3.请求路由:

  • MOVED重定向:-MOVED 3999 192.168.1.101:6380

  • ASK临时重定向

  • Smart Client缓存槽映射

集群搭建(6节点示例):

# 创建集群(3主3从)
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

集群运维命令:

命令功能
CLUSTER NODES查看节点拓扑
CLUSTER INFO集群状态信息
CLUSTER MEET添加新节点
CLUSTER ADDSLOTS分配槽位
CLUSTER FAILOVER手动故障转移

三、企业级高可用架构设计

1. 多机房容灾方案

主集群
从集群
跨机房同步
读请求
读请求
写请求
机房A
Cluster
机房B
Cluster
全局负载均衡

关键技术:

  • Redis-Shake数据同步

  • Proxy层读写分离

  • DNS故障切换

2. 性能优化方案

1.热点Key处理:

bash

# 使用Hash Tag强制同槽
SET user:{12345}.profile "data"
SET user:{12345}.orders "data"

2.集群分片优化:

  • 避免节点负载不均

  • 监控槽分布:redis-cli --cluster check

3.客户端优化:

  • 连接池配置

  • Pipeline批处理

  • 本地缓存减少访问

3. 监控指标体系

类别关键指标报警阈值
节点connected_clients> 5000
内存used_memory> 90%
网络instantaneous_ops_per_sec> 8万
集群cluster_size槽未分配
复制master_repl_offset差值>1万

四、常见问题解决方案

Q1:脑裂问题(Split-Brain)

场景: 网络分区导致多主节点
解决方案:

# 配置最少从节点数
min-replicas-to-write 2  # 主节点至少需2个从节点
min-replicas-max-lag 10  # 从节点延迟不超过10秒

Q2:数据一致性

最终一致性保障:

  • 异步复制(默认)

  • WAIT命令强一致:

SET key value
WAIT 2 5000  # 等待2个副本,超时5秒

Q3:集群扩容瓶颈

平滑扩容方案:

添加新节点:

redis-cli --cluster add-node new_host:port existing_host:port

迁移槽位:

redis-cli --cluster reshard existing_host:port

自动平衡:

redis-cli --cluster rebalance --use-empty-masters

五、架构选型决策树

单机房
中小规模
大规模数据
高并发
多机房容灾
读写分离
分片扩展
需求场景
哨兵模式
Redis Cluster
Cluster+跨机房同步
1主+3从+3哨兵
至少6节点

六、最佳实践总结

1.生产必用集群:单节点仅限开发环境

2.规模建议:

  • 哨兵模式:数据量 < 100GB,QPS < 10万

  • Redis Cluster:数据量 > 100GB,QPS > 10万

3.容灾设计:

  • 副本数 ≥ 2

  • 跨机架/机房部署

4.升级路径:

主从复制
哨兵模式
Redis Cluster

官方推荐:Redis 7.0+ 的Redis Cluster已成为企业级首选方案,支持:

  • 多线程IO

  • ACL安全控制

  • 更稳定的故障转移

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88724.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP的连接

TCP 三次握手过程是怎样的&#xff1f;TCP 是面向连接的协议&#xff0c;所以使用 TCP 前必须先建立连接&#xff0c;而建立连接是通过三次握手来进行的。三次握手的过程如下图&#xff1a;一开始&#xff0c;客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口&…

Excel的学习

一、熟悉界面 1.功能区 点击“视图”,点击冻结窗格,选择目标行 2.表格区 3.自定义功能区 在上面的空白编辑栏处,右键选择自定义功能区 4.数据输入规范 (1)格式不统一(日期格式不规范,姓名乱加空格,乱合并单元格) 姓名对齐:右键选择编辑单元格格式,选择对齐,…

论文阅读:HybridTrack: A Hybrid Approach for Robust Multi-Object Tracking

论文地址:2501.01275v2 代码地址:GitHub - leandro-svg/HybridTrack: [RA-L25/ICRA26] HybridTrack: A Hybrid Approach for Robust Multi-Object Tracking 前言 多目标跟踪旨在在帧间检测和关联所有所需的目标。大多数方法通过明确或隐式地利用强大的线索(即空间和外观信…

EtherCAT开源主站 SOEM 2.0 最新源码在嵌入式 Linux 下的移植与编译

EtherCAT 作为工业自动化领域的主流现场总线协议&#xff0c;因其高实时性和高带宽被广泛应用。而 SOEM&#xff08;Simple Open EtherCAT Master&#xff09;则是开源社区中最受欢迎的 EtherCAT 主站协议栈之一。本文将以 SOEM 2.0 最新源码为例&#xff0c;详细介绍其在嵌入式…

面试150 填充每个节点的下一个右侧节点指针Ⅱ

思路 采用层序遍历的方式来连接二叉树中同一层的节点。首先将根节点加入队列&#xff0c;然后按层处理节点&#xff1a;每一层依次从队列中取出节点&#xff0c;并将其 next 指针指向该层中的下一个节点&#xff08;即队列中的下一个节点&#xff09;&#xff1b;若是该层最后一…

Windows 本地 使用mkcert 配置HTTPS 自签名证书

&#x1f9e9; 场景假设 项目本地运行或通过本地 web 服务器&#xff08;如 Nginx、http-server、vite&#xff09;访问 假设域名为 myadmin.local&#xff08;可以任意命名&#xff09; 步骤 1&#xff1a;安装 mkcert 下载 mkcert&#xff1a; 访问 https://github.com/Fil…

vue3 ref vs reactive值的修改

ref vs reactive reactive 定义的响应式对象不能直接整体修改(即obj1obj2),如果想要修改,可以使用 Object.assign(obj1,obj2) 上述赋值是浅拷贝,对象地址不变,属性值被修改了浅拷贝:创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。如果属性值是基本类型…

【Datawhale AI 夏令营】 用AI做带货视频评论分析(一)

引言 以讯飞「基于带货视频评论的用户洞察挑战赛」的赛事项目为背景&#xff0c;将电商直播带货视频的碎片化用户评论转化为可量化的商业洞察信息。其实本质上在于利用自然语言处理、机器学习或者大模型技术&#xff0c;从海量的文本数据中提取有价值的商业洞察。 主要涉及以下…

Vue中的render()函数

在 Vue 中&#xff0c;render() 是一个用于手动编写组件渲染逻辑的方法&#xff0c;它直接返回虚拟节点&#xff08;VNode&#xff09;&#xff0c;替代模板语法&#xff08;<template>&#xff09;来描述组件的 UI 结构。以下是关于 render() 方法的详细解析&#xff1a…

板凳-------Mysql cookbook学习 (十一--------9)

13.2 分组描述统计 mysql> select age, count(score) as n,-> sum(score) as sum,-> min(score) as minimum,-> max(score) as maximum,-> avg(score) as mean,-> stddev_samp(score) as std. dev.,-> var_samp(score) as variance-> from testscore-&…

编写产品需求文档:黄历日历小程序

整理产品需求文档&#xff1a;黄历日历小程序版本&#xff1a;1.0 更新时间&#xff1a;2025-7-9一、文档概述1.1 产品背景开发一款融合传统黄历文化的日历工具&#xff0c;提供每日吉凶查询、神煞展示和个人运势分析功能。1.2 目标用户关注传统历法的中老年群体婚嫁/搬家等需要…

Spring Boot + MyBatis 实现用户登录功能详解(基础)

一、项目概述做了几个项目发现有人问到怎么使用springbootHTMLjsCSS开发一个项目呢所以本文将介绍如何使用Spring Boot和MyBatis实现一个完整的用户登录功能。系统包含前端登录页面、后端控制器、服务层、数据访问层以及数据库交互。二、技术栈Spring Boot 2.xMyBatis 持久层框…

adb 简介与常用命令

1. adb 简介adb 的全称为 Android Debug Bridge&#xff0c;就是起到调试桥的作用。借助 adb 工具&#xff0c;我们可以管理设备或手机模拟器的状态。还可以进行很多手机操作&#xff0c;如安装软件、系统升级、运行 shell 命令等等。其实简而言说&#xff0c;adb 就是连接 And…

阿里云-跨账号同步OSS Bucket

说明 阿里云A账号的OSS BUCKET同步到B账号的指定OSS BUCKET。 账号Bucket NamesRAM角色A{源buctket}OSS-SYNCERB{目标buctket} 步骤 在阿里云A,B账号分别建上表buckets, 最好是相同地域的在A号-RAM控制台建立角色OSS-SYNCER&#xff0c;并赋权AliyunOSSFullAccess&#xff…

uniapp小程序无感刷新token

request.js // request.js import {getApptoken,getStoredApptoken } from ./tokenRequest // 从合并模块导入// 全局配置 const MAX_RETRIES 1 // 最大重试次数 const baseURL https://your-api.com// 请求队列和刷新状态 let requestsQueue [] let isRefreshing false// …

MySQL优化高手笔记

语雀完整版&#xff1a;https://www.yuque.com/g/mingrun/embiys/dv3btw/collaborator/join?tokenzMBwPzSMfSGINLuv&sourcedoc_collaborator# 《MySQL优化高手笔记》MySQL优化高手一、MySQL架构01 天天写CRUD,你知道你的系统是如何跟MySQL打交道的吗通过驱动连接数据库&am…

Git 详解:从概念,常用命令,版本回退到工作流

本文将从 Git 的核心概念讲起&#xff0c;详细介绍常用命令、各阶段版本回退、分支控制以及企业内常见的 Git 工作流。 Git 与 GitHub 简介 Git 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年开发。它与集中式版本控制系统&#xff08;…

CMSIS(Cortex Microcontroller Software Interface Standard)ARM公司为 Cortex-M 系列处理器

CMSIS&#xff08;Cortex Microcontroller Software Interface Standard&#xff09;是ARM公司为 Cortex-M 系列处理器&#xff08;如 M0/M3/M4/M7/M23/M33 等&#xff09;定义的一套硬件抽象层标准&#xff0c;旨在简化嵌入式开发&#xff0c;提高代码的可移植性和复用性。 核…

[特殊字符] 扫描式处理:Python 自动提取 PDF 中关键词相关表格并导出为 Excel

本文演示如何利用 pdfplumber 批量处理指定文件夹下 PDF 文档&#xff1a;定位关键词&#xff08;如“主要会计数据”&#xff09;出现的页码及下一页&#xff0c;提取其中的表格并保存为独立 Excel 文件。适用于财务报告、审计表格、统计报表等场景。 1️⃣ 第一步&#xff1a…

python3的返回值能返回多个吗?

在Python中&#xff0c;函数可以通过返回一个元组&#xff08;tuple&#xff09; 来间接实现返回多个值的效果。以下是具体说明&#xff1a; 实现方式&#xff1a;直接返回逗号分隔的值 Python会自动将这些值打包成一个元组&#xff1a; def multiple_return():a 1b "he…