当前位置: 首页 > news >正文

详解Redis 高可用的方式 Redis Cluster

Redis 高可用方式

Redis 提供了多种高可用性方案,主要包括以下几种方式:

主从复制(Replication)

主从复制是最基本的高可用性方案,通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所有的写操作,而读操作可以在主节点和从节点上进行。

优点是架构简单、部署方便,并且具有高性价比。
缺点是不保证数据的可靠性,故障恢复复杂,且主节点的写能力受到单机的限制。

哨兵模式(Sentinel)

哨兵模式在主从复制的基础上增加了故障转移的功能,通过自动故障转移机制来应对主节点的故障,确保服务的持续可用。哨兵系统持续监控Redis实例的状态,提供更全面的监控信息。

缺点 哨兵模式需要部署和配置额外的哨兵节点,增加了系统的复杂性,并且主节点发生故障后,新的主节点可能会有一段时间的数据不一致,影响数据的准确性。

集群模式(Cluster)

Redis集群通过数据分片(sharding)实现数据的分布式存储,每个节点负责存储一部分数据,同时提供复制和高可用性。

优点 集群模式可以实现数据的水平扩展,提高了系统的性能和存储容量;
同时,集群模式也可以实现高可用性,即使某个节点发生故障,系统仍然可以继续提供服务。
缺点 集群模式的配置和维护相对复杂,需要管理多个节点 。

在选择Redis的高可用性方案时,需要综合考虑业务需求、系统复杂性、性能要求和故障转移需求。
例如,如果业务主要是读取数据,数据量不大,对数据的一致性要求不高,可以选择主从复制模式。
如果业务需要高可用性,即使在主节点发生故障的情况下也需要保证服务的正常运行,可以选择哨兵模式。如果业务数据量大,需要高性能和高可用性,集群模式可能是最佳选择

Redis Cluster 详解

为什么使用

扩展性:Redis Cluster通过数据分片,突破单机限制,提供更大的存储容量和处理能力。
高可用性:集群能够在部分节点故障时继续提供服务,实现自动故障转移。
读写分离:通过主从复制模型,提高读取性能,并在主节点故障时自动进行故障转移 。

原理

Redis Cluster采用无中心结构,数据自动在多个Redis节点间分片。集群中的每个节点都保存数据,并且节点之间相互连接,共享整个集群的状态信息。它使用数据分片(Sharding),通过16384个哈希槽来分配数据,每个键通过CRC16算法(哈希函数(CRC16[key]&16383))映射到0-16383槽内,然后这个槽再分配给集群中的节点 。每个节点维护部分槽及槽所映射的键值数据。哈希函数: Hash()=CRC16[key]&16383 按位与槽与节点的关系如下:
在这里插入图片描述
用 hash 函数将键映射到槽,再由槽指向数据
用 hash 函数将键映射到槽,再古槽措向数据
节点角色
主节点(Master):处理读写请求,维护数据副本,并同步给从节点。
从节点(Slave):复制主节点数据,提供读服务,在主节点故障时可晋升为主节点 。
节点间通信
使用Gossip协议交换集群状态信息,包括节点新增、删除、故障、槽信息变更等。客户端与任意节点建立连接,节点负责将请求转发至正确的主节点 。

redis集群架构图

在这里插入图片描述

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效。
  3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
  4. redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

redis集群投票:容错
在这里插入图片描述

投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.

什么时候整个集群不可用(cluster_state:fail)?

如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.
redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

故障检测与自动故障转移:节点间定期发送PING/PONG消息,检测对方是否存活。故障节点的从节点竞选成为新主节点,其他节点更新槽映射与配置,客户端自动重定向 。

数据同步与增量复制:新节点加入或从节点晋升为主节点时,通过RDB快照进行全量同步。主从节点间通过PSYNC命令进行增量数据同步,减少网络开销 。

集群的端口:每个Redis集群节点需要打开两个TCP连接,一个用于客户端连接,另一个用于集群节点间通信,后者使用的是二进制协议 。

Redis Cluster缺陷以及相应解决方法

数据迁移和重新分片的复杂性:
当集群需要扩容或缩容时,数据迁移和重新分片可能是一个复杂的过程。这可能涉及到大量的数据在节点之间移动,对于大型集群来说可能是一个挑战。

解决方法:
使用redis-cli提供的–cluster reshard选项来进行数据迁移,同时监控整个过程以确保数据一致性。

不支持多键操作:
Redis Cluster不支持跨多个节点的多键操作,如MGET或MSET,因为这些操作可能涉及到多个节点的数据。

解决方法:
将相关联的数据分布在同一个槽中,或者在应用层实现数据聚合逻辑。

写操作热点问题:
如果某些键访问非常频繁,可能导致成为写操作的热点,影响性能。

解决方法:
通过合适的数据分布和缓存策略,例如二级缓存或热点数据的预热机制,来避免热点问题。

故障转移和自动故障恢复:
虽然Redis Cluster支持故障转移,但如果主节点和其所有从节点同时宕机,那么该节点的数据将会丢失,集群将不可用。

解决方法:
采用三主三从的架构,实现交叉复制,即使一台主机宕机,其他主机仍然可以继续提供服务。

运维监控挑战:
Redis Cluster的分布式特性使得监控和故障排查更为复杂。

解决方法:
使用专业的监控工具来监控集群状态,如Redis自带的监控命令CLUSTER INFO,以及第三方监控系统。

数据一致性问题:
在网络分区或其他异常情况下,可能会导致数据一致性问题。

解决方法:
通过适当的集群配置和网络优化来减少这些问题的发生,同时在发现问题时使用CLUSTER REPLICATE命令来同步数据。

集群状态同步:
在主节点故障后,新的主节点可能需要一段时间来同步数据,这期间集群可能无法提供服务。

解决方法:
合理配置从节点的数量和分布,确保故障转移时数据同步能够快速完成。

不支持在线扩容:
Redis Cluster不支持在线平滑扩容,扩容时可能需要停机。

解决方法:
通过预先规划容量和使用redis-cli工具进行节点添加和数据迁移来最小化停机时间。

资源利用率问题:
在Redis Cluster中,只有主节点对外提供服务,从节点仅作为备份,这可能导致资源浪费。

解决方法:
合理规划主从节点数量,并通过负载均衡策略来提高资源利用率。

相关文章:

详解Redis 高可用的方式 Redis Cluster

Redis 高可用方式 Redis 提供了多种高可用性方案&#xff0c;主要包括以下几种方式&#xff1a; 主从复制&#xff08;Replication&#xff09; 主从复制是最基本的高可用性方案&#xff0c;通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…...

$clog2(1)=0

项目场景&#xff1a; 写ip 时&#xff0c; 使用参数化的方式实现2w1r 时&#xff0c;出现计算读返回index 时&#xff0c;减下溢&#xff01; 问题描述 verilog中会使用parameter 参数化&#xff0c;例如使用dpth 和$clog2(dpth)addr 。 常见的写法没有什么问题。 module …...

开发学习日记1

用这个系列博客记录下学习开发的一些小收获 git的使用&#xff1a; 说来惭愧&#xff0c;学到了大二&#xff0c;git的使用还是一团糟&#xff0c;记录一下如何使用git进行团队合作开发 当要加入其他人的项目时首先你要创建自己的分支&#xff08;克隆一下其他分支&#xff…...

孙宇晨领航波场TRON:引领数字资产迈向崭新纪元

​ 在风起云涌的数字资产领域&#xff0c;孙宇晨这个名字始终与创新、突破和引领紧密相连。作为波场TRON的创始人&#xff0c;他不仅是一位远见卓识的领导者&#xff0c;更是推动数字资产迈向新纪元的坚实力量。 自波场TRON诞生以来&#xff0c;孙宇晨便以其敏锐的洞察力…...

python运维(twenty-four day)

一、python基础 1、环境python2、python3 [rootpython ~]# yum list installed | grep python #检查是否有python包 [rootpython ~]# yum list installed | grep epel #检查是否有epel包 [rootpython ~]# yum -y install epel-release [rootpython ~]# yum -y instal…...

Eureka原理实践

1. 简介 1.1. 概述 Eureka是Netflix开源的一个服务注册与发现框架,它在微服务架构中扮演着至关重要的角色。 Eureka由两个核心组件组成: Eureka Server(服务注册中心):负责存储、管理和提供服务实例信息,如服务名、IP地址、端口号等。Eureka Server通常采用集群部署以保…...

Ant-Design-Vue快速上手指南+排坑

1. 简介 1.1. 概述 Ant-Design-Vue是由阿里巴巴开源的一个基于Vue.js框架的企业级UI设计语言。它旨在帮助开发者构建设计优雅、体验流畅的企业级应用。Ant-Design-Vue提供了一系列高质量的Vue组件,包括表单、表格、布局、导航、图标等,可以帮助开发者快速搭建应用程序界面。…...

mysql5.7安装

1.创建一个software文件 2.先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 3安装源包 rpm -ivh mysql-community-release-el7-5.noarch.rpm 可能会报错 改成命令 rpm -ivh mysql-community-release-el7-5.noarch.rpm --nodeps…...

UE开发中的设计模式(三) —— 对象池模式

在FPS游戏中&#xff0c;射击会生成子弹&#xff0c;在命中敌人后子弹会被销毁&#xff0c;那么会导致子弹对象频繁地创建和销毁&#xff0c;会造成运行效率降低且会产生内存碎片问题&#xff0c;而对象池模式可以很好地解决这个问题。 文章目录 问题提出概述问题解决总结 问题…...

Mocha测试框架:JavaScript自动化测试的瑞士军刀

在JavaScript开发中&#xff0c;自动化测试是确保代码质量和可靠性的关键环节。Mocha是一个广泛使用的JavaScript测试框架&#xff0c;它支持多种断言库&#xff0c;允许开发者编写简洁、灵活的测试用例。Mocha特别适用于Node.js环境&#xff0c;但也可以在浏览器中运行。本文将…...

flask实现Streaming内容传输

当传输大量内存&#xff0c;以至于超出内存大小&#xff0c;一般http服务器会报500错误&#xff0c;这时可以使用Streaming流的方式来传输内容&#xff0c;类似ChatGPT和视频流那样的输出方式&#xff0c;flask里要用到生成器和直接响应。 from flask import stream_with_cont…...

seata的使用(SpringBoot项目整合seata)

文章目录 1、解压 seata-server-1.7.1.zip2、启动 双击 seata-server.bat3、启动 seata 控制台用户界面4、所有分布式事务相关数据库要有undo-log5、项目引入seata依赖6、项目添加seata配置7、代码实现&#xff1a; 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…...

docker容器和宿主机网络不通

防火墙未开启&#xff0c;检查网络配置无异常 解决&#xff1a; [rootlocalhost ~]# vim /etc/sysctl.confnet.bridge.beidge-nf-call-iptables 1 net.bridge.beidge-nf-call-ip6tables 1[rootlocalhost ~]# sysctl -p [rootlocalhost ~]# systemctl restart docker 如果网…...

编程学习之旅:高效记录与整理笔记的艺术

引言&#xff1a;知识的海洋与导航的灯塔 在编程的浩瀚星空中&#xff0c;每一位学习者都像是勇敢的航海家&#xff0c;驾驶着知识的帆船&#xff0c;在无尽的信息海洋中探索未知的领域。然而&#xff0c;这片海洋既充满了机遇&#xff0c;也潜藏着挑战。信息的过载、知识的碎…...

dev c++中,在C++11模式下编译带M_PI宏的文件报错的解决办法

一、问题描述 当使用C11的模式&#xff0c;编译引用了math库中的M_PI的源文件时&#xff0c;报M_PI未声明的错误。 二、问题原因 因为M_PI是GNU扩展的宏&#xff0c;它不属于C11的标准&#xff0c;而-stdc11&#xff0c;表示以C11的标准进行编译&#xff0c;因此会产生以上问…...

【ubutnu24.04】k8s部署2:摸索修复问题

1.30.0 一直init失败有人说版本兼容问题重新安装了最新的1.31.0 版本kubeadm init 仍旧失败。安装依赖项 sudo apt-get install -y apt-transport-https ca-certificates curl gpgroot@PerfSvr:/home/zhangbin/perfwork/k8sadmin# sudo apt-get install -y apt-transport-https…...

处理JSON数据时遇到的解析错误:“Unexpected character (`“`)”

问题背景 在开发过程中&#xff0c;经常会遇到需要解析JSON数据的情况。然而&#xff0c;在某些情况下&#xff0c;可能会遇到类似“Unexpected character (")”这样的错误。本文将详细介绍该错误的原因、如何诊断以及解决方法。 错误示例 以下是一个典型的错误信息示例…...

RDKit|分子输入输出格式解析(如 SMILES、Mol、SDF)

2.3 分子输入输出格式解析(如 SMILES、Mol、SDF) 在化学信息学中,分子的表示方式有很多种,常见的包括 SMILES、Mol 文件、SDF 文件等。RDKit 支持对这些格式的分子数据进行解析和处理,这使得它在化学和药物设计领域得到了广泛应用。本节将介绍如何在 RDKit 中解析和操作这…...

【模电笔记】——反馈放大电路

tips&#xff1a;本章节的笔记已经打包到word文档里啦&#xff0c;建议大家下载文章顶部资源&#xff08;有时看不到是在审核中&#xff0c;等等就能下载了。手机端下载后里面的插图可能会乱&#xff0c;建议电脑下载&#xff0c;兼容性更好且易于观看&#xff09;&#xff0c;…...

【面试题】Redis缓存问题全解:击穿、雪崩与穿透

文章目录 Redis缓存问题全解&#xff1a;击穿、雪崩与穿透引言1. 缓存击穿&#xff08;Cache Penetration&#xff09;2. 缓存雪崩&#xff08;Cache Avalanche&#xff09;3. 缓存穿透&#xff08;Cache Penetration&#xff09; 总结1. 缓存击穿&#xff08;Cache Penetratio…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...