详解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…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...