Redis系列:Redis主从、哨兵、集群介绍

news2024/12/22 16:51:10

本篇内容包括:Redis 主从架构、Redis 哨兵架构、Redis 集群架构 的介绍等内容~


文章目录

    • 一、Redis 主从架构
        • 1、Redis 主从架构
        • 2、主从架构原理
    • 二、Redis 哨兵模式
        • 1、Redis 哨兵模式
        • 2、Redis 哨兵模式工作过程
    • 三、Redis 集群模式
        • 1、Redis 集群模式
        • 2、Redis 集群原理


一、Redis 主从架构

1、Redis 主从架构

主从复制模式就是,部署多台 Redis 节点,其中只有一台节点是主节点(Master),其他的节点都是从节点(Slave),也叫备份节点(Replica)。只有 Master 节点提供数据的事务性操作(增删改),Slave 节点只提供读操作。所有 Slave 节点的数据都是从 Master 节点同步过来的

Redis 主从架构样式图:

image-20221111224523209

该图只是最简单的一种主从结构方式,所有的 Slave 节点都挂在 Master 节点上

  • 优点: Slave 节点与 Master 节点的数据延迟较小;
  • 缺点:如果 Slave 节点数量很多,Master 同步一次数据的耗时就很长。

还有一种主从结构就是 Master 下面只挂一个 Slave 节点,其他的 Slave 节点挂在这个 Slave 节点下面,这样,Master 节点每次只需要把数据同步给它下面的那一个 Slave 节点即可,后续 Slave 节点的数据同步由这个 Slave 节点完成。

  • 优点:降低了 Master 节点做数据同步的压力
  • 缺点:导致 Slave 节点与 Master 节点数据不一致的延迟更高。

2、主从架构原理

主从模式的核心就是 Master 节点与 Slave 节点之间的数据同步。需要注意的是,Redis 和大部分中间件的主从模式中的数据同步都是由 Slave 节点主动发起的,原因是主从模式中只有一个 Master 节点,剩余的全是 Slave 节点,如果由 Master 节点主动推送数据到各个 Slave 节点

  • 首先,维护成本太大,Master 节点上要维护所有 Slave 的地址信息,而且在增加 Slave 节点的时候,也要同步维护到 Master 上,这样 Master 才能将数据同步到所有的 Slave 上面;
  • 其次,Master 性能受影响,节点之间同步数据肯定要通过网络传输数据,由 Master 节点建立所有 Slave 节点的连接会对 Master 的性能产生较大影响。

而由 Slave 发起数据同步则避免了上述问题,只需在每个 Slave 中维护一个 Master 的地址即可。

  1. Slave 发送 sync 命令到 Master
  2. Master 收到 sync 之后,执行bgsave,生成 RDB 全量文件
  3. Master 把 Slave 的写命令记录到缓存
  4. bgsave 执行完毕之后,发送 RDB 文件到 Slave,Slave 执行
  5. Master 发送缓存中的写命令到 Slave,Slave 执行
img

在 redis2.8 版本之后已经使用 psync 来替代 sync 了,原因是 sync 命令非常消耗系统资源,而 psync 的效率更高。


二、Redis 哨兵模式

1、Redis 哨兵模式

基于主从方案的缺点还是很明显的,假设 Master 宕机,那么就不能写入数据,那么 Slave 也就失去了作用,整个架构就不可用了,除非你手动切换,主要原因就是因为没有自动故障转移机制。

而哨兵(sentinel)的功能比单纯的主从架构全面的多了,哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它独立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。因此哨兵模式具备了自动故障转移、集群监控、消息通知等功能。

img

2、Redis 哨兵模式工作过程

哨兵可以同时监视多个主从服务器,并且在被监视的 Master 下线时,自动将某个 Slave 提升为 Master,然后由新的 Master 继续接收命令。整个过程如下:

  1. 初始化 sentinel,将普通的 redis 代码替换成 sentinel 专用代码
  2. 初始化 Masters 字典和服务器信息,服务器信息主要保存 ip:port,并记录实例的地址和 ID
  3. 创建和 Master 的两个连接,命令连接和订阅连接,并且订阅 sentinel:hello 频道
  4. 每隔 10 秒向 Master 发送 info 命令,获取 Master 和它下面所有 Slave 的当前信息
  5. 当发现 Master 有新的 Slave 之后,sentinel 和新的 Slave同样建立两个连接,同时每个10秒发送 info 命令,更新 Master 信息
  6. sentinel 每隔1秒向所有服务器发送 ping 命令,如果某台服务器在配置的响应时间内连续返回无效回复,将会被标记为下线状态
  7. 选举出领头 sentinel,领头 sentinel 需要半数以上的 sentinel 同意
  8. 领 头sentinel 从已下线的的 Master 所有 Slave 中挑选一个,将其转换为 Master
  9. 让所有的 Slave 改为从新的 Master 复制数据
  10. 将原来的 Master 设置为新的 Master 的从服务器,当原来 Master 重新回复连接时,就变成了新 Master 的从服务器

其中,sentinel 会每隔 1 秒向所有实例(包括主从服务器和其他sentinel)发送 ping 命令,并且根据回复判断是否已经下线,这种方式叫做主观下线。当判断为主观下线时,就会向其他监视的 sentinel 询问,如果超过半数的投票认为已经是下线状态,则会标记为客观下线状态,同时触发故障转移。


三、Redis 集群模式

1、Redis 集群模式

如果说依靠哨兵可以实现redis的高可用,如果还想在支持高并发同时容纳海量的数据,那就需要 redis 集群。redis 集群是 redis 提供的分布式数据存储方案,集群通过数据分片sharding来进行数据的共享,同时提供复制和故障转移的功能。

2、Redis 集群原理

# 节点:一个 redis 集群由多个节点 node 组成,而多个 node 之间通过 cluster meet 命令来进行连接,节点的握手过程:

img
  1. 节点 A 收到客户端的 cluster meet 命令
  2. 节点 A 根据收到的 IP 地址和端口号,向 B 发送一条 meet 消息
  3. 节点 B 收到 meet 消息返回 pong
  4. 节点 A 知道 B 收到了 meet 消息,返回一条 ping 消息,握手成功
  5. 最后,节点 A 将会通过 gossip 协议把节点 B 的信息传播给集群中的其他节点,其他节点也将和 B 进行握手

# 槽 slot:redis 通过集群分片的形式来保存数据,整个集群数据库被分为 16384 个 slot,集群中的每个节点可以处理 0-16383 个slot,当数据库 16384 个 slot 都有节点在处理时,集群处于上线状态,反之只要有一个 slot 没有得到处理都会处理下线状态。通过 cluster addslots 命令可以将 slot 指派给对应节点处理。

slot 是一个位数组,数组的长度是 16384/8=2048,而数组的每一位用 1 表示被节点处理,0 表示不处理,如图所示的话表示 A 节点处理 0-7 的slot。

img

当客户端向节点发送命令,如果刚好找到 slot 属于当前节点,那么节点就执行命令,反之,则会返回一个MOVED命令到客户端指引客户端转向正确的节点。(MOVED过程是自动的)

img

如果增加或者移出节点,对于 slot 的重新分配也是非常方便的,Redis 提供了工具帮助实现 slot 的迁移,整个过程是完全在线的,不需要停止服务。

# 故障转移:

如果节点 A 向节点 B 发送 ping 消息,节点 B 没有在规定的时间内响应 pong,那么节点 A 会标记节点 B 为 pfail 疑似下线状态,同时把 B 的状态通过消息的形式发送给其他节点,如果超过半数以上的节点都标记 B 为 pfail 状态,B 就会被标记为 fail 下线状态,此时将会发生故障转移,优先从复制数据较多的从节点选择一个成为主节点,并且接管下线节点的 slot,整个过程和哨兵非常类似,都是基于 Raft 协议做选举。

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

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

相关文章

【树莓派不吃灰】基础篇⑲ 搭建usb摄像头MJPG-streamer图片流监控,支持远程视频监控访问

目录1. 前言2. 识别摄像头3. MJPG-streamer方案3.1 什么是 MJPG?3.2 MJPG 的优点?3.2 MJPG 的缺点?4. 搭建usb摄像头监控4.1 开启树莓派摄像头开关4.2 查看设备文件4.3 安装必要的库4.4 下载 mjpg-streamer 安装文件4.5 切换到 /mjpg-streame…

基于51单片机的温度甲烷监测报警串口上报proteus仿真原理图PCB

功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和甲烷浓度 2.超过甲烷浓度阈值,蜂鸣器报警 3.按键可更改甲烷浓度阈值上限和启动/暂停检测 4.020%浓度,绿色LED点亮 20%~阈值上限,黄色LED点亮&#xff0…

C#操作modbus

modbus使用范围广泛,广泛应用于各类仪表,PLC等。 modbus的好处是免费,属于应用层协议,底层硬件基于485/以太网。 modbus协议本质还是自定义协议。 modbus调试软件: mthings: modbuspoll: 主站/从站,客…

前端静态页面基本开发思路(一)

有不少刚入门前端的同学经常问我前端布局的问题,总是跟我说在面对学校布置的作业或者想自己搭建博客的时候不知道怎么下手,不知道怎么去写静态的页面,每当我解决了一个又一个同学的问题的时候,又有新的同学来问,故思来…

nginx 配置防盗链(了解)

一 防盗链 1.1 防盗链概念 网站上页面的一些静态资源,不想让本站点的静态资源被他人盗取访问。使用nginx判断请求连接的头部refer中是否含有内容以及合法性来进行处理。 referer表示第二次资源的来源地址 1.2 配置规则 valiad_referers none|blocked|server_na…

Spring--IOC基于XML管理bean

IOC容器 IOC思想 IOC:Inversion of Control 即反转控制 获取资源的传统方式 自己做饭:买菜、洗菜、择菜、改刀、炒菜,全过程参与,费时费力,必须清楚了解资源创建整个过程中的全部细节且熟练掌握。 在应用程序中的组件…

Antd表格性能优化

今天来分享一个实际项目的性能优化的内容。 文章目录一、背景介绍二、性能问题原因及解决方案一、背景介绍 国内React项目大多数人选择配套的UI库的时候都会选择Antd。如果是非常简单的页面用Antd的话其实是完全没问题的,性能感觉不到什么瓶颈,样式也还…

计算机网络

目录 介绍 组成部分 工作方式 功能组成 网络范围分类 传输技术: 总结 标准化工作 RFC文档的作用: 速率,带宽 有容量和速率的区别 带宽 吞吐量 时延,时延带宽积 1.发送时延: 2.传播时延: ​编辑 3.…

Vant组件库 引入 阿里矢量图 添加自己喜欢的 ICON

📃目录跳转一.矢量图下载💨使用CDN方式🎉下载本地(推荐)二.Vant引入Icon🗺️🎃 使用方式🚀 运行效果:一.矢量图下载 💨使用CDN方式 当然你也可以使用官方的C…

【编程题】【Scratch三级】2021.12 分身术

分身术 1. 准备工作 (1)删除小猫角色、添加角色“Monkey”,Money位于舞台的中心; (2)添加背景Light; (3)新建变量“编号”。 2. 功能实现 (1)程序开始时,Monkey说:“我会分身术!变!!!”2秒; (2)每隔2秒克隆出一个位置随机、大小随机、颜色随机的Monke…

python easygui修改窗口位置

EasyGui是一个十分简单的Python图形界面库,支持窗口文本显示、图片显示、按钮、文本框、选项栏、文件选择等等必要的组件且操作十分简单。但也因如此,导致EasyGui甚至不能手动调整窗口位置、按钮位置、名字等,因为EasyGui是基于Tkinter编写的…

VMware三种网络模式详解

VMware三种网络模式 linux重启网络服务命令: service network restart 一、桥接模式 原理:VMware和宿主机,处于同一网段、两者地位平等。(无需虚拟网卡) 1.1、使用方法 虚拟网络编辑器 虚拟机设置-适配器 上面两…

<Linux> 编译器与调试器—gcc/g++/gdb 的使用

< Linux > 编译器与调试器—gcc/g/gdb 的使用 文章目录< Linux > 编译器与调试器—gcc/g/gdb 的使用一、Linux编译器 - gcc/g 使用1. 编译程序的四个过程背景知识预处理编译汇编链接2. 链接方式与函数库2.1 动态链接与静态链接2.2.函数库2.3.动态库与静态库3. gcc/…

干货分享:谷歌主动搜索开发客户的万能公式

大家在用谷歌(Google)开发是不是也有以下常见问题&#xff1a; 关键词不准&#xff0c;搜索到的都是零售商&#xff0c;B2C平台搜索到的客户太大&#xff0c;已经被开发多次&#xff0c;开发信不回复搜索到的客户找不到邮箱搜索到的客户与工厂不匹配&#xff0c;无法合作 其实…

车路协同 智能路侧设备网络安全接入技术要求

1 范围 本文件包含智能路侧设备网络安全接入技术要求&#xff0c;包括智能路侧设备连接要求、接入要求、证书管理要求。 本文件适用于智能路侧设备网络安全接入的设计与开发。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中&…

Simulink永磁同步电机控制仿真:过调制及电流重构

在一些高功率密度的应用场景中&#xff0c;追求极致的电压利用率&#xff0c;这个时候要用到过调制技术&#xff1b;当svpwm工作在过调制区域时&#xff0c;逆变电桥会在一个基波周期内多次达到100%占空比&#xff0c;且较多时间处于较高的占空比&#xff0c;这个时候下桥臂电流…

数据结构系列学习(七) - 链栈(Chain_Stack)

目录 引言&#xff1a; 学习&#xff1a; 代码实现&#xff1a; 头文件&#xff08;Chain_Stack.h&#xff09;&#xff1a; 设置链栈中的元素范型&#xff1a; 链栈的结构体设计&#xff1a; 所有功能函数的声明&#xff1a; 源文件&#xff08;Chain_Stack.cpp&#…

性能测试场景设计之 阶梯性能场景(负载测试场景)

「负载测试&#xff1a;」 逐步增加并发用户数。看服务器的最大拐点区间在哪里。再缩小拐点区间&#xff0c;找出最大并发用户数。 使用方式&#xff1a; 安装 jpgc插件 添加线程组 每次递增10个并发 This group will start&#xff1a;给定当前负载的并发用户数First, wait …

机器学习-集成算法

文章目录集成算法1. 定义2. 具体模型2.1. Bagging2.2. Boosting2.3. Stacking3. 随机森林3.1. 树模型结构3.2. 随机森林的优点3.3. 分类与回归问题3.4. 树模型个数问题3.5. 参数问题(特征重要性)3.6. 可视化展示问题4. 集成基本思想4.1. 硬投票策略步骤4.2. 软投票策略步骤5. B…

【SpringMVC】基础、环境搭建、注解搭建、 and so on……

文章目录SpringMVC【原理】&#xff1a;一、why?&#xff1a;二、环境搭建&#xff08;配置方式&#xff09;&#xff1a;▶1.导入jar包▶2.创建简单测试----创建Controller类继承AbstractController▶3.如何读取Controller文件&#xff0c;创建SpringMVC.xml配置文件&#xf…