当前位置: 首页 > news >正文

redis的主从复制细节

文章目录

      • 复制机制的运作
      • 复制的一些事实
      • master持久化关闭时,复制的安全性
      • Redis复制是如何工作的
      • 只读性质的slave
      • 设置一个slave对master进行验证
      • 允许只写入N个附加的副本
      • Redis如何处理过期键
      • 重新启动和故障转移后的部分同步

复制机制的运作

master和slave的复制运作依靠三个主要的机制:

  • 当一个master和slave正常连接时,master会发送一连串的命令来保持对slave的更新,以便与将自身数据集的改变同步给slave:包括客户端的写入、键的过期或被驱逐。
  • 当master断开重连后,因为网络问题或是主从意识到连接超时时,slave会重新连接上master并尝试进行部分重同步:它只会尝试获取在断开连接期间内丢失的命令流。
  • 当无法进行重同步时,slave会请求进行全量同步。mater需要创建数据流的快照,并将之发送给slave,之后在数据集更改时持续发送命令流到slave。

redis主从使用的异步复制,特点是高性能和低延迟。

复制的一些事实

  • redis使用异步复制,slave和master之间异步确认处理的数据量
  • 一个master可以拥有多个slave
  • slave可以连接slave,称作subslave节点,subslave节点会从master收到完全一样的复制流
  • Redis复制在master侧是非阻塞的。master可以在一个或多个slave执行初次同步或部分同步时,可以继续处理查询请求
  • Redis复制在slave侧是非阻塞的。当slave进行初次同步时,可以配置使用旧数据集处理查询请求,或者当master和slave连接断开时,返回一个error给客户端。但是在进行初次同步时,从节点会删除旧数据集,同时加载新数据集,在此期间会阻塞到来的请求。4.0开始可以开启新线程删除旧的数据集,但是加载新的数据集的操作依然需要在主线程中进行并阻塞slave。
  • 复制可以用在伸缩性,以便只读查询有多个slave进行,或者仅用于数据安全。
  • 可以使用复制来避免master将全部数据集写入磁盘造成的开销:一种典型的技术是配置你的redis.conf以避免对磁盘进行持久化,然后连接一个slave,其配置为不定期保存或是启用AOF。但是这个设置必须小心处理,因为重新启动的master程序从一个空数据集开始:如果一个slave试图与它同步,那么这个slave的数据也会被清空。

master持久化关闭时,复制的安全性

在使用Redis复制功能时,强烈建议在master和slave中启用持久化。当不可能时,例如非常慢的磁盘性能而导致的延迟问题,应该配置实例来避免重启后重置

为什么关闭持久化并配置了自动重启的master是危险的:

  • 设置节点A为master并关闭它的持久化设置,节点B和节点C从节点A复制数据
  • 节点A发生故障自动重启后,由于没有开启持久化,数据集为空
  • 节点B和节点C从节点A同步数据,数据集也会被清空。

Redis复制是如何工作的

每一个Redis master都有一个Replication ID:这是一个比较大的伪随机数,用于表示一个给定的数据集。每个master节点也都持有一个偏移量,master将自己产生的复制流发送给slave时,发送过少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新slave的状态。复制偏移量在没有一个slave的时候,也会自增。所以每个Replication ID,offset对都表示一个master 的确切版本。

  • 部分同步:它们使用OSYNC命令来发送他们记录的旧的replication ID和它们至今为止的偏移量。通过这种方式master能够仅发送slave所需的增量部分。但是如果master的缓冲区没有足够的命令积压缓存记录或如果slave引用了不知道的历史记录,则会转而进行一个全量重同步:在这种情况下,slave会得到一个完整的数据副本,从头开始。
  • 全量同步:master开启一个后台进程,生成一个rdb文件。同时开始缓冲所有从客户端接收到的命令。当后台保存完成时,master将数据集发送到slave,slave将数据集保存到磁盘,然后加载到内存。接着master会发送所有缓存命令给slave。这个过程以指令流的形式完成并且和Redis本身的格式相同。

无磁盘复制是直接将rdb文件通过网络发送给slave节点。

只读性质的slave

slave支持只读且默认开启,redis.conf文件中的slave-read-only变量控制这个行为,且可以在运行时通过config set开启或关闭。

设置一个slave对master进行验证

master通过requirepass设置密码,slave通过redis-cli config set masterauth 或在配置文件中添加masterauth 配置

允许只写入N个附加的副本

只有当至少n个slave连接到master时,才有可能配置master接收写查询。

因为redis使用异步复制的方式,因此无法确保slave是否实际接收到给定的写命令,因此总会有一个数据丢失窗口。工作机制:

  • redis slave每秒都会ping master,确认已处理的复制流的数据量
  • master会记录上次从每个slave收到ping的时间
  • 用户可以配置一个最小的slave数量,使得它<=最大秒数

尽力而为的机制,条件不满足master将会恢复一个error并且写入将不被接受。

配置参数:

min-slaves-to-write <slave 数量>
min-slaves-max-lag <秒数>

Redis如何处理过期键

  • 从节点不会出发键过期,相反,从节点会等待主节点触发键过期。当主节点触发键过期时,主节点会同步一个del命令给所有的从节点。
  • 由于主节点控制键过期,所以从节点会存在实际已经过期的键,这是因为主节点无法及时提供del命令导致的。为了应对这种情况,在读操作下,从节点使用一个独立的时钟来标注一个键不存在,这并不会破坏数据一致性。
  • 执行lua脚本期间,不执行任何键过期操作。防止key在脚本执行中间过期,保证将相同的脚本发送给slave,从而在二者的数据集产生相同的效果。

重新启动和故障转移后的部分同步

  • 当一个实例在故障转移后被提升为master后,它仍能与旧master的slave进行同步。为此,slave会记住旧的master的旧的replication ID和复制偏移量。因此即使访问旧的replication ID,其也可以部分复制缓冲提供给连接的slave。
  • 升级的slave的新的replication ID将不同,因为它构成了数据的不同记录,因此在被提升的slave中使用相同的replication ID将违反一对复制标识和偏移对只能标识单一数据集的规则。
  • slave在关机重新启动后,能够在RDB文件中存储所需要的信息,以便与master进行同步。最好使用shutdown命令来执行slave的保存和退出。

相关文章:

redis的主从复制细节

文章目录复制机制的运作复制的一些事实master持久化关闭时&#xff0c;复制的安全性Redis复制是如何工作的只读性质的slave设置一个slave对master进行验证允许只写入N个附加的副本Redis如何处理过期键重新启动和故障转移后的部分同步复制机制的运作 master和slave的复制运作依…...

SparkSQL

第1章 SparkSQL 概述1.1 SparkSQL 是什么Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。1.2 Hive and SparkSQLSparkSQL 的前身是 Shark&#xff0c;给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具。Hive 是早期唯一运行在 Hadoop …...

Python|每日一练|栈|数组|字典树|数组|树|广度优先搜索|单选记录:逆波兰表达式求值|回文对|二叉树的层序遍历

1、逆波兰表达式求值&#xff08;栈&#xff0c;数组&#xff09; 根据 逆波兰表示法(https://baike.baidu.com/item/%E9%80%86%E6%B3%A2%E5%85%B0%E5%BC%8F/128437)&#xff0c;求表达式的值。 有效的算符包括 、-、*、/ 。每个运算对象可以是整数&#xff0c;也可以是另一个…...

慧教室系统--远程控制系统

随着科技的不断进步&#xff0c;越来越多的教育机构开始使用智慧教室系统来提升教学效果和学生体验。智慧教室系统不仅可以自动化管理设备&#xff0c;还可以实现远程控制&#xff0c;帮助教师和学生更加便捷地使用教室设备。智慧教室系统作为一款领先的智慧教育解决方案&#…...

OSCP-课外1(http万能密码、hydra密码暴力破解http、代码审计、Win缓存区溢出)

目录 难度 主机发现&端口扫描 信息收集 万能密码 hydra密码暴力破解...

ELK日志分析--Logstash

Logstash简介 Logstash安装 测试运行 配置输入和输出 使用Geoip过滤器插件增强数据编辑 配置接收 Beats 的输入 1.Logstash简介 Logstash管道具有两个必需元素input和output&#xff0c;以及一个可选元素filter。输入插件使用来自源的数据&#xff0c;过滤器插件根据你的…...

Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据

场景 Navicat通过存储过程批量插入mysql数据&#xff1a; Navicat通过存储过程批量插入mysql数据_霸道流氓气质的博客-CSDN博客 上面使用过Navicat借助存储过程批量插入数据。但是插入数据是固定的 insert语句&#xff0c;如果在本地开发时需要模拟插入一些随机数据(从指定…...

【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】

文章目录前言1.高精度加法2.高精度减法3.高精度乘法4.高精度除法写在最后前言 当我们在利用计算机进行一些计算时&#xff0c;可能会遇到这类问题 &#xff1a; 有些计算要求精度高&#xff0c;希望计算的数的位数可达几十位甚至几百位&#xff0c;虽然计算机的计算精度也算较…...

事理知识图谱

事理知识图谱能够有力第建模各类事件之间的演化关联关系为事理逻辑推理提供更好的数据基础。 事理图谱定义 事理知识图谱可以将文本中对事件以及事件之间的关系抽取并抽象出来&#xff0c;构建成一个有向图形式的事理知识库。在结构上&#xff0c;事理知识图谱是一个有向有环…...

多綫程之python爬蟲構建

目录多綫程定義簡介原理优点缺点优势代碼框架實現導包打印類爬蟲類構造方法獲取代理設置headers獲取新session獲取源代碼解析網頁解析子頁面保存數據綫程任務得到url啓動多綫程爬蟲總結多綫程 以下定義來自百度百科&#xff0c;看看就好沒仔細寫 定義 多线程&#xff08;mul…...

【干货】Redis在Java开发中的基本使用和巧妙用法

Redis是一款高性能的内存数据结构存储系统&#xff0c;能够支持多种数据结构类型&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;也能够支持高级功能&#xff0c;如事务、发布/订阅、Lua脚本等&#xff0c;具有高可用性、高并发性和可扩展性的优点。在Java开发…...

历时半年,我终于阿里上岸了,附面经和Java非科班学习心得

个人经历 本科双非化学&#xff0c;跨考了电子硕士&#xff0c;研究生依然双非。无互联网实习&#xff0c;无比赛无论文。&#xff08;研究生研究方向是车辆电子和楼宇自动化&#xff0c;有自动化和高校实训讲师相关的实习经历&#xff09; 21年11开始学Java准备秋招。 阿里上…...

ArkUI实战,自定义饼状图组件PieChart

本节笔者带领读者实现一个饼状图 PieChart 组件&#xff0c;该组件是根据笔者之前封装的 MiniCanvas 实现的&#xff0c; PieChart 的最终演示效果如下图所示&#xff1a; 饼状图实现的拆分 根据上图的样式效果&#xff0c;实现一个饼状图&#xff0c;实质就是绘制一个个的实…...

工作实战之系统交互api调用认证设计

目录 前言 一、黄金段位接口交互 二、钻石段位接口交互设计 1.接口文档定义 2.工具类以及demo提供 a.调用方部分代码 b.被调用方 三.星耀段位接口访问设计 1.在钻石段位的基础上&#xff0c;进行sdk的封装 a.maven引入 b.sdk包含工具类 四.王者段位接口访问设计 1.开发详情 2.…...

学习系统编程No.5【虚拟地址空间】

引言: 北京时间&#xff1a;2023/2/22&#xff0c;离补考期末考试还有5天&#xff0c;不慌&#xff0c;刚午觉睡醒&#xff0c;闹钟2点20&#xff0c;拖到2点50&#xff0c;是近以来&#xff0c;唯一一次有一种睡不醒的感觉&#xff0c;但是现在却没有精神&#xff0c;因为听了…...

Linux常用指令(未完待续。。。)

* basename&#xff1a;只留下路径的“最后一部分” X、文件夹&目录操作 复制 &#xff1a;cp /xxx /xxx - a 该选项通常在拷贝目录时使用。它保留链接、文件属性&#xff0c;并递归地拷贝目录&#xff0c;其作用等于dpR选项的组合&#xff1b; - d 拷贝时保留链接&#…...

用D写裸机

原文 用D编写裸机RISC-V应用 这篇文章展示,如何用D编写,目标为RISC-VQEMU模拟器的程序裸机"你好".项目 为什么是D? 我最近一直在用C编写裸机代码,我有点对C缺乏特征感到沮丧.D引入了叫betterC的模式(基本上禁止了D运行时的所有语言功能).使得D裸机编程大致与C一…...

(二十五)、实现评论功能(5)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;实现二级回复的入库操作 1.1 两个子组件&#xff08;comment-item和comment-frame&#xff09;与父组件reply之间的属性传值 comment-item&#xff1a; props: {item: {type: Object,default () {return {}}}},comment-frame&#xff1a; props: {commentObj: {…...

【概念辨析】二维数组传参的几种可能性

一、二维数组传参竟然不是用二级指针进行接收&#xff1f; 今天进行再一次的二级指针学习时&#xff0c;发现了一条以前没怎么注意过的知识点&#xff1a;二维数组进行传参只能用二维数组&#xff08;不能省略列&#xff09;进行接收或者是数组指针。 问题复现代码如下&#xf…...

python和C++代码实现图片九宫格切图程序(附VS2015配置Opencv教程)

1、python代码实现图片分割成九宫格 需要包含的库&#xff0c;没有下载安装的&#xff0c;需要自己安装哦。 实现原理很简单&#xff0c;就是用PIL库不断画小区域&#xff0c;切下来存储成新的小图片。 假设每一个格子的宽和高分别是w、h&#xff0c;那么第row行&#xff08…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...