详解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 函数将键映射到槽,再由槽指向数据
节点角色
主节点(Master):处理读写请求,维护数据副本,并同步给从节点。
从节点(Slave):复制主节点数据,提供读服务,在主节点故障时可晋升为主节点 。
节点间通信
使用Gossip协议交换集群状态信息,包括节点新增、删除、故障、槽信息变更等。客户端与任意节点建立连接,节点负责将请求转发至正确的主节点 。
redis集群架构图
- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
- 节点的fail是通过集群中超过半数的节点检测失效时才生效。
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
- 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 提供了多种高可用性方案,主要包括以下几种方式: 主从复制(Replication) 主从复制是最基本的高可用性方案,通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…...
$clog2(1)=0
项目场景: 写ip 时, 使用参数化的方式实现2w1r 时,出现计算读返回index 时,减下溢! 问题描述 verilog中会使用parameter 参数化,例如使用dpth 和$clog2(dpth)addr 。 常见的写法没有什么问题。 module …...

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

孙宇晨领航波场TRON:引领数字资产迈向崭新纪元
在风起云涌的数字资产领域,孙宇晨这个名字始终与创新、突破和引领紧密相连。作为波场TRON的创始人,他不仅是一位远见卓识的领导者,更是推动数字资产迈向新纪元的坚实力量。 自波场TRON诞生以来,孙宇晨便以其敏锐的洞察力…...
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游戏中,射击会生成子弹,在命中敌人后子弹会被销毁,那么会导致子弹对象频繁地创建和销毁,会造成运行效率降低且会产生内存碎片问题,而对象池模式可以很好地解决这个问题。 文章目录 问题提出概述问题解决总结 问题…...
Mocha测试框架:JavaScript自动化测试的瑞士军刀
在JavaScript开发中,自动化测试是确保代码质量和可靠性的关键环节。Mocha是一个广泛使用的JavaScript测试框架,它支持多种断言库,允许开发者编写简洁、灵活的测试用例。Mocha特别适用于Node.js环境,但也可以在浏览器中运行。本文将…...
flask实现Streaming内容传输
当传输大量内存,以至于超出内存大小,一般http服务器会报500错误,这时可以使用Streaming流的方式来传输内容,类似ChatGPT和视频流那样的输出方式,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、代码实现: 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…...

docker容器和宿主机网络不通
防火墙未开启,检查网络配置无异常 解决: [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 如果网…...
编程学习之旅:高效记录与整理笔记的艺术
引言:知识的海洋与导航的灯塔 在编程的浩瀚星空中,每一位学习者都像是勇敢的航海家,驾驶着知识的帆船,在无尽的信息海洋中探索未知的领域。然而,这片海洋既充满了机遇,也潜藏着挑战。信息的过载、知识的碎…...

dev c++中,在C++11模式下编译带M_PI宏的文件报错的解决办法
一、问题描述 当使用C11的模式,编译引用了math库中的M_PI的源文件时,报M_PI未声明的错误。 二、问题原因 因为M_PI是GNU扩展的宏,它不属于C11的标准,而-stdc11,表示以C11的标准进行编译,因此会产生以上问…...
【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 (`“`)”
问题背景 在开发过程中,经常会遇到需要解析JSON数据的情况。然而,在某些情况下,可能会遇到类似“Unexpected character (")”这样的错误。本文将详细介绍该错误的原因、如何诊断以及解决方法。 错误示例 以下是一个典型的错误信息示例…...
RDKit|分子输入输出格式解析(如 SMILES、Mol、SDF)
2.3 分子输入输出格式解析(如 SMILES、Mol、SDF) 在化学信息学中,分子的表示方式有很多种,常见的包括 SMILES、Mol 文件、SDF 文件等。RDKit 支持对这些格式的分子数据进行解析和处理,这使得它在化学和药物设计领域得到了广泛应用。本节将介绍如何在 RDKit 中解析和操作这…...

【模电笔记】——反馈放大电路
tips:本章节的笔记已经打包到word文档里啦,建议大家下载文章顶部资源(有时看不到是在审核中,等等就能下载了。手机端下载后里面的插图可能会乱,建议电脑下载,兼容性更好且易于观看),…...
【面试题】Redis缓存问题全解:击穿、雪崩与穿透
文章目录 Redis缓存问题全解:击穿、雪崩与穿透引言1. 缓存击穿(Cache Penetration)2. 缓存雪崩(Cache Avalanche)3. 缓存穿透(Cache Penetration) 总结1. 缓存击穿(Cache Penetratio…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...