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.mzph.cn/news/880114.shtml

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

相关文章

SkyWalking 环境搭建部署

架构简介 skywalking agent : 和业务系统绑定在一起,负责收集各种监控数据skywalking oapservice : 是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapserv…

19_Python中的上下文管理器

Python中的上下文管理器 在Python中,上下文管理器(Context Manager)是一种用于资源管理的技术,它可以确保资源在使用后被正确释放,例如文件、网络连接或锁。 上下文管理器(Context Manager)是…

计算机毕业设计 | SSM 凌云招聘平台 求职问答审批系统(附源码)

1,绪论 人力资源是企业产生效益、创造利润的必不可少的、最重要的资源。人作为人力资源的个体可看作是一个承载着有效知识、能力的信息单元。这样的信息单元可看作是一个为企业产生价值和利润的个体。从而使得这样的信息单元所具有的信息就是一个有价值的信息。 校…

python是什么语言写的

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火,可有人提问,这么火的语言它的底层又是什么语言编写的呢? python是C语言编写的,它有很多包也是用C语言写的。 所以说,C语言还是很…

中间件:maxwell、canal

文章目录 1、底层原理:基于mysql的bin log日志实现的:把自己伪装成slave2、bin log 日志有三种模式:2.1、statement模式:2.2、row模式:2.3、mixed模式: 3、maxwell只支持 row 模式:4、maxwell介…

全栈开发(四):使用springBoot3+mybatis-plus+mysql开发restful的增删改查接口

1.创建user文件夹 作为增删改查的根包 路径 src/main/java/com.example.demo/user 2.文件夹里文件作用介绍 1.User(实体类) package com.example.demo.user; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.IdType; impo…

Web端云剪辑解决方案,BS架构私有化部署,安全可控

传统视频制作流程繁琐、耗时,且对专业设备和软件的高度依赖,常常让企业望而却步,美摄科技凭借其强大的技术实力和创新能力,推出了面向企业用户的Web端云剪辑解决方案,为企业提供一站式、高效、便捷的视频生产平台。 B…

【docker】在IDEA工具内,远程操作服务器上的docker

一,配置 在服务器上,对docker配置如下内容: vi /usr/lib/systemd/system/docker.service添加如下: -H tcp://0.0.0.0:2375重新加载,并重启docker: #重新加载配置 systemctl daemon-reload# 重启docker …

使用 IntelliJ IDEA 连接到达梦数据库(DM)

前言 达梦数据库是一款国产的关系型数据库管理系统,因其高性能和稳定性而被广泛应用于政府、金融等多个领域。本文将详细介绍如何在 IntelliJ IDEA 中配置并连接到达梦数据库。 准备工作 获取达梦JDBC驱动: 访问达梦在线服务平台网站或通过其他官方渠道…

SkyWalking 持久化链路数据

默认持久化 H2 数据库config/application.yml storage:selector: ${SW_STORAGE:h2} MySQL持久化 修改配置 MySQL 数据库config/application.yml storage:selector: ${SW_STORAGE:h2}mysql:properties:jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest&q…

基于yolov8的红外小目标无人机飞鸟检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的红外小目标无人机与飞鸟检测系统是一项集成了前沿技术的创新解决方案。该系统利用YOLOv8深度学习模型的强大目标检测能力,结合红外成像技术,实现了对小型无人机和飞鸟等低空飞行目标的快速、准确检测。 YOLOv8作为YOLO系列的…

Springboot与minio

一、介绍 Minio是一个简单易用的云存储服务,它让你可以轻松地把文件上传到互联网上,这样无论你在哪里,只要有网络,就能访问或分享这些文件。如果你想要从这个仓库里取出一张图片或一段视频,让网站的访客能看到或者下载…

How do you send files to the OpenAI API?

题意:你如何向 OpenAI API 发送文件 问题背景: For fun I wanted to try to make a tool to ask chatgpt to document rust files. I found an issue, in that the maximum message length the API allows seems to be 2048 characters. 为了好玩&…

【深度学习】(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…

K8S容器实例Pod安装curl-vim-telnet工具

在没有域名的情况下,有时候需要调试接口等需要此工具 安装curl、telnet、vim等 直接使用 apk add curlapk add vimapk add tennet

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台

mysql 内存被打满记录

一:早上收到报警:提示:您的云数据库RDS的1个实例因存储空间满将被锁定,请关注实例的存储空间使用情况,可通过存储扩容或空间清理解除锁定。后续查看错误日志如下:磁盘没有空间了 没有多余的空间写binlog和…

STM32 单片机最小系统全解析

STM32 单片机最小系统全解析 本文详细介绍了 STM32 单片机最小系统,包括其各个组成部分及设计要点与注意事项。STM32 最小系统在嵌入式开发中至关重要,由电源、时钟、复位、调试接口和启动电路等组成。 在电源电路方面,采用 3.3V 直流电源供…

Golang | Leetcode Golang题解之第417题太平洋大西洋水流问题

题目: 题解: type pair struct{ x, y int } var dirs []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func pacificAtlantic(heights [][]int) (ans [][]int) {m, n : len(heights), len(heights[0])pacific : make([][]bool, m)atlantic : make([][]bool, …

AttributeError: ‘Sequential‘ object has no attribute ‘predict_classes‘如何解决

今天跟着书敲代码,报错: Sequential object has no attribute predict_classes,如图所示: 上网百度,发现predict_classes函数在新版本中已经删除了,需要使用 model.predict() 替代 model.predict_classes()…