Redis的主从模式、哨兵模式、集群模式

最近学习了一下这三种架构模式,这里记录一下,仅供参考

目录

一、主从架构

1、搭建方式

2、同步原理

3、优化策略:

4、总结:

二、哨兵架构

1、搭建哨兵集群

2、RedisTemplate如何使用哨兵模式

三、分片集群架构

1,搭建分片集群

2、散列插槽

3、集群伸缩

4、故障转移

5、RedsiTemplate访问分片集群


一、主从架构

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。

1、搭建方式

如何开启主从关系呢:

我们可以使用salveof或者replicaof命令实现

假设现在在7001、7002、7003三个端口部署了三个redis

我们要想7002作为从7001作为主,需要先连接7002节点

#连接7002
redis-cli -p 7002
#执行slaveof
slaveof xxx.xxx.xxx 7001

另外一个节点也是如此,查询配置情况我们可以使用INFO replication命令

2、同步原理

全量同步:

主从的第一次同步是全量同步

1.1.首先从节点执行replicaof命令请求建立连接,向主节点发送请求数据同步

1.2.主节点判断是否是第一次同步

1.3.如果是第一次,返回主节点的数据版本信息

1.4.从节点保存版本信息

2.1.主节点执行bgsave操作时会生成RDB文件

2.1.1.生成RDB文件之后会将旗舰所有的命令记录到一个baklog文件当中

2.2.然后发送RDB文件向从节点

2.3.从节点接收到RDB会清空本地数据加载RDB文件

3.1.主节点发送repl_baklog中的命令

3.2.从节点执行repl_baklog中的命令

master如何判断slave是不是第一次来同步数据?

这里会用到两个很重要的概念:

  • Replication ld:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replidslave则会继承master节点的replid
  • offset:偏移量,随着记录在repl baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset.如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。

因此slave做数据同步,必须向master声明自己的replicationid和offset,master才可以判断到底需要同步哪些数据

从节点向主节点发送链接请求会携带replication Id,主节点判断这个id是否一致,如果不一致说明是第一次连接需要全量同步,如果一致那么说明只需要增量同步既可

增量同步:

1.1.从节点向主节点发送同步请求,并携带relication id和偏移量offset

1.2.主节点判断relid是否和当前节点一致

1.3.如果不是第一次,恢复continue

2.1.主节点去repl_baklog中获取偏移量offset后的命令数据

2.2.主节点向从节点发送offset后的命令

2.3.从节点执行命令

注意:这里可能会出现一个问题,就是从节点如果因为一些原因很长时间没用做增量同步,主节点这边的repl_baklog如果出现了覆盖,这时候从节点再去根据命令做同步就会出现数据不一致,所以这时候只能通过全量同步

3、优化策略:

可以从以下几个方面来优化Redis主从就集群:

  • 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘10。
  • Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘I0
  • 适当提高repl baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
  • 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力

4、总结:

简述全量同步和增量同步区别?

  • 全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl baklog,逐个发送给slave。
  • 增量同步:slave提交自己的offset到master,master获取repl baklog中从offset之后的命令给slave

什么时候执行全量同步?

  • slave节点第一次连接master节点时
  • slave节点断开时间太久,replbaklog中的offset已经被覆盖时

什么时候执行增量同步?

  • slave节点断开又恢复,并且在replbaklog中能找到offset时
二、哨兵架构

在主从模式当中,从节点宕机后可以找到主节点同步数据,但是主节点宕机就丸辣。

解决办法是什么呢?我们可以安排一个或多个哨兵去观察这个主节点,一但主节点出现问题,那我们哨兵就立刻取代掉主节点,重新选举出一个新的主节点。这就是哨兵(Sentinel)机制

Redis提供了哨兵(sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:

  • 监控:S嗯停了 会不断检查你的master和slave是否按预期工作
  • 自动故障恢复:如果master故障,sentinel会将一个slave提升为master。当故障示例恢复后也以新的master为主
  • 通知:java客户端找主从地址不是直接去找,而是去哨兵sentinel集群中去找,由哨兵通知我们客户端需要去访问哪个地址,当飞机群发生故障转移时,会将最新消息推送个redis的客户端

sentinel的服务检测基于心跳机制检测服务状态,每隔1秒向集群的每个实例发送ping命令:

  • 主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
  • 客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

一旦发现master故障,sentinel需要在salve中选择一个座位新的master,选择依据是这样:

  • 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-miliseconds*10)则会排除该slave节点
  • 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举
  • 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高
  • 最后是判断slave节点的运行id大小,越小优先级越高。

当选中一个slave为新的master之后(例如slave1:7002),会发生一个故障转移:

  • sentinel给备选的slave1节点发送slaveofnoone命令,让该节点成为master
  • sentinel给所有其它slave发送slaveof192.168.150.101:7002命令,让这些slave成为新master的从节点,开始从新的master上同步数据。
  • 最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点

1、搭建哨兵集群

假设现在有三个redis实例,端口分别是27001、27002、27003,我们需要再每一个的实例文件目录下创建一个sentinel.conf文件,添加如下内容

port 27001(根据节点更改)
sentinel announce-ip 192.168.150.101
sentinel monitor mymaster 192.168.150.101 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmb/s1"(需要修改)

运行时要启动sentinel实例:

redis-sentinel ***.conf  #运行启动sentinel实例
2、RedisTemplate如何使用哨兵模式

三、分片集群架构

哨兵模式只能解决高并发读的问题,当有高并发写的需求的时候,主从和哨兵模式就会有大量的IO操作,造成效率的底下。对于这个问题,解决办法就是搭建分片集群架构。

使用分片集群可以解决上述问题,分片集群特征:

  • 集群中有多个master,每个master保存不同数据
  • 每个master都可以有多个slave节点master之间通过ping监测彼此健康状态
  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点\\

1,搭建分片集群

现假设有六个redis节点7001、7002、7003、8001、8002、8003搭建redis集群,三个主节点,三个从节点

在每个文件目录下准备一个redis.conf文件:内容如下,端口要改

通过命令一键运行六个目录文件下的.conf文件

部署成集群的命令如下:

redis-cli --cluster create -cluster-replicas 1 
192.168.150.101:7001 192.168.150101:7002 
192.168.150.101:7003 492.168.150.101:8001 
192.168.150.101:8002 192.168.150.101:8003

2、散列插槽

Redis会把每一个master节点映射到0~16383共16383(hash slot)上,查看集群信息时就能看到:

Redis如何判断某个key应该在哪个实例?

  • 将16384个插槽分配到不同的实例
  • 根据key的有效部分计算哈希值,对16384取余,余数作为插槽,寻找插槽所在实例即可

如何将同一类数据固定的保存在同一个Redis实例?

  • 这一类数据使用相同的有效部分,例如key都以{typeld}为前缀
3、集群伸缩

也就是向集群中添加或删除新节点

先添加一个节点,然后将节点添加到集群当中,并且把插槽分配给新的节点

4、故障转移

这里可以通过watch命令监控集群状态

我们通过shutdown命令讲一个主节点强制下线,会发现有其他的节点成为了主节点,这时候重启该节点,会发现变成了从节点

利用cluster failover命令可以手动让集群中的某个master容机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:

手动的Failover支持三种不同模式:

  • 缺省:默认的流程,如图1~6步
  • force:省略了对offset的一致性校验
  • takeover:直接执行第5步,忽略数据一致性、忽略master状态和其它master的意见
5、RedsiTemplate访问分片集群


记录不易,点个赞吧

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

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

相关文章

集成学习详细介绍

以下内容整理于: 斯图尔特.罗素, 人工智能.现代方法 第四版(张博雅等译)机器学习_温州大学_中国大学MOOC(慕课)XGBoost原理介绍------个人理解版_xgboost原理介绍 个人理解-CSDN博客 集成学习(ensemble):选择一个由一系列假设h1, h2, …, hn构成的集合…

AI运动小程序开发常见问题集锦一

截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身、体育、体测、AR互动等场景;为了让正在集成或者计划进行功能扩展优化的用户,少走弯路、投入更少的开发资源,我们归集了一部分集中的…

Redis数据结构之set

一.set集合特性 集合类型也是保存多个字符串类型的元素的,但和list列表不一样,集合中的元素是无序的,而且元素不能够重复,不仅支持增删查改,还支持交集并集等操作 二.相关命令 1.sadd sadd key members…… 咱们把…

【机器学习】--- 决策树与随机森林

文章目录 决策树与随机森林的改进:全面解析与深度优化目录1. 决策树的基本原理2. 决策树的缺陷及改进方法2.1 剪枝技术2.2 树的深度控制2.3 特征选择的优化 3. 随机森林的基本原理4. 随机森林的缺陷及改进方法4.1 特征重要性改进4.2 树的集成方法优化4.3 随机森林的…

JavaScript ---案例(统计字符出现次数)

统计字符出现次数 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

深度学习之微积分预备知识点(2)

极限&#xff08;Limit&#xff09; 定义&#xff1a;表示某一点处函数趋近于某一特定值的过程&#xff0c;一般记为 极限是一种变化状态的描述&#xff0c;核心思想是无限靠近而永远不能到达 公式&#xff1a; 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…

LabVIEW软件维护的内容是什么呢?

LabVIEW软件维护涉及多个方面&#xff0c;确保程序的正常运行和长期稳定性。维护内容包括以下几个方面&#xff1a; 1. Bug修复 在开发和运行过程中&#xff0c;可能会出现各种软件问题或缺陷&#xff08;bugs&#xff09;。维护工作之一就是识别这些问题并通过修复程序中的代…

uniapp child.onFieldChange is not a function

uni-forms // 所有子组件参与校验,使用 for 可以使用 awiatfor (let i in childrens) {const child childrens[i];let name realName(child.name);if (typeof child.onFieldChange function) {const result await child.onFieldChange(tempFormData[name]);if (result) {…

【网络】TCP/IP 五层网络模型:网络层

最核心的就是 IP 协议&#xff0c;是一个相当复杂的协议 TCP 详细展开讲解&#xff0c;是因为 TCP 确实在开发中非常关键&#xff0c;经常用到&#xff0c;IP 则不同&#xff0c;和普通程序猿联系比较浅。和专门开发网络的程序猿联系比较紧密&#xff08;开发路由器&#xff0…

Qt5详细安装教程(包含导入pycharm)

1.自行下载Qt 2.双击进行安装 3.设置完成后勾选接受&#xff0c;跳转下一步 4.可选择安装位置&#xff0c;比较习惯安装在D盘 5.根据需求勾选对应组件安装 6.安装完成后&#xff0c;打开pycharm&#xff0c;进入settings—>选择ExternalTools&#xff0c;根据以下步骤进行配…

【WEB】EZ_Host

1、 2、解答 http://8762a9b0-5aa3-49f8-b8d2-54e4cb0746cc.www.polarctf.com:8090/?hostlocalhost;lshttp://8762a9b0-5aa3-49f8-b8d2-54e4cb0746cc.www.polarctf.com:8090/?hostlocalhost;cat flag即可看到答案

数据中台系统产品原型RP原型Axure高保真交互原型 源文件分享

在数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。为了更好地管理和利用这些数据&#xff0c;这边为大家整理了一套数据中台Axure高保真原型。这套原型致力于为企业提供全方位的数据服务&#xff0c;助力企业实现数据驱动的创新发展。 下载及预览地址&#xff1a;h…

828华为云征文|Flexus云服务器X实例部署宝塔运维面板

本次华为云Flexus云服务器X实例部署宝塔运维面板教学&#xff0c;这次是推陈出新啊 之前的云耀云服务器L实例已经很不错了&#xff0c;大力赞叹华为云的 同时感谢华为云提供优惠卷&#xff0c;只能说白嫖真是太棒了 华为云近期正在筹办华为云828企业节活动&#xff0c;90款免…

java重点学习-设计模式

十三 设计模式 工厂模式&#xff1a;spring中使用&#xff08;目的是&#xff1a;解耦&#xff09; 1.简单工厂 所有的产品都共有一个工厂&#xff0c;如果新增产品&#xff0c;则需要修改代码&#xff0c;违反开闭原则是一种编程习惯&#xff0c;可以借鉴这种编程思路 2.工厂方…

嵌入式入门小工程

此代码基于s3c2440 1.点灯 //led.c void init_led(void) {unsigned int t;t GPBCON;t & ~((3 << 10) | (3 << 12) | (3 << 14) | (3 << 16));t | (1 << 10) | (1 << 12) | (1 << 14) | (1 << 16);GPBCON t; }void le…

一个基于Gin + Vue 开发前后端分离的微型进存销系统,专为小微企业量身定制

前言 在这个信息化高速发展的时代&#xff0c;企业管理软件的需求日益增长&#xff0c;然而市面上许多现有的管理系统要么过于复杂&#xff0c;不适合小型企业的快速的需求&#xff1b;要么价格高昂&#xff0c;让许多初创企业望而却步。 针对这些痛点&#xff0c;我们迫切需…

01-Mac OS系统如何下载安装Python解释器

目录 Mac安装Python的教程 mac下载并安装python解释器 如何下载和安装最新的python解释器 访问python.org&#xff08;受国内网速的影响&#xff0c;访问速度会比较慢&#xff0c;不过也可以去我博客的资源下载&#xff09; 打开历史发布版本页面 进入下载页 鼠标拖到页面…

ETCD学习使用

一、介绍 etcd&#xff08;分布式键值存储&#xff09;是一个开源的分布式系统工具&#xff0c;用于可靠地存储和提供键值对数据。etcd 通常通过 HTTP 或 gRPC 提供 API&#xff0c;允许应用程序通过简单的接口与其交互。由于其可靠性和稳定性&#xff0c;etcd 在构建可扩展、分…

【AI视频】AI虚拟主播制作网站推荐

一、什么是AI虚拟主播&#xff1f; AI虚拟主播是一种利用人工智能技术打造的虚拟主持人&#xff0c;也被称为数字虚拟主持人。它们通常是由人工智能技术和三维建模技术结合而成&#xff0c;可以在各种平台上进行主持工作&#xff0c;如新闻报道、电商直播、综艺娱乐等。 AI虚…

使用GPU 加速 Polars:高效解决大规模数据问题

Polars 最近新开发了一个可以支持 GPU 加速计算的执行引擎。这个引擎可以对超过 100GB 的数据进行交互式操作能。本文将详细讨论 Polars 中DF的概念、GPU 加速如何与 Polars DF协同工作&#xff0c;以及使用新的 CUDA 驱动执行引擎可能带来的性能提升。 Polars 核心概念 Polar…