主从复制是怎么实现的?

news2024/11/18 13:44:50

单机模式的缺点

Redis虽然有持久化技术保证Redis奔溃后重启可以恢复数据,但是,单机模式下还是存在两方面问题。一方面Redis一旦宕机,数据恢复需要一定的时间,这段时间内,都不能接收和处理请求;另一方面,如果硬盘发生损坏,无论AOF文件还是RDB文件都会丢失,也就无法恢复了。

主从复制模式

Redis提供了主从复制模式,将数据备份到多台服务器上,较好地保证数据的丢失,同时,一台服务器故障后,其它服务器还能够提供服务。

另外,Redis主从复制模式下,是读写分离的。主服务器负责读写操作并将写操作同步给从服务器,而从服务器只负责读操作。

第一次同步

当我们发起slaveof或者replicaof命令时,从服务器就会向主服务器发送一条psync指令(包含主服务器id和复制进度,这里一开始时为随机id和-1),表明自己要与之进行数据同步,主服务器收到命令后,响应一个全量复制的命令(包含主服务器的id和复制进度),从服务器收到后报错主服务器信息。接着,主服务器执行bgsave命令,生成RDB文件,然后将生成的RDB文件传输给从服务器,从服务器收到后,清空自己的数据,然后载入这个RDB文件到内存。为了保证主从一致,在主服务器生成RDB文件、传输RDB文件和从服务器加载RDB文件的过程中,都会记录写操作命令到一个replication buffer的缓冲区。在从服务器载入RDB文件到内存后,会给主服务器发送一个确认消息。主服务器收到后,将replication buffer缓冲区中的写操作命令发送给从服务器,从服务执行这些写操作命令,这样,主从服务器达到一致

命令传播

主从服务器在进行第一次同步后,为了避免频繁地建立和端口TCP连接,主服务器和从服务器之间会维持一个TCP长连接,用于后续主服务器将写操作指令传播给从服务器。

分摊主服务器的压力

主服务器要与许多的从服务器进行全量复制时,主服务器会不停的忙于fork子进程生成RDB文件,如果主服务器的内存很大,fork子进程时复制主进程的页表也会很大,这样就会导致阻塞主进程;
另外,传输RDB文件也会耗费主服务器的网络带宽,不利于响应命令请求。

因此,我们需要对从服务器执行slaveof或者replicaof命令,使其也有自己的从服务器,这样,从服务器在同步主服务器(老板)的同时,也可以将数据同步给自己(经理)的从服务器(普通员工),便分摊了主服务器的压力

增量复制

当从服务器与主服务器断开TCP连接时,主服务器就无法向从服务器继续进行写操作的命令传播,这时,为了保证主从数据的一致性,Redis2.8之前,采用的方法是,在从服务器与主服务器重连之后,直接进行全量复制,但是,由于从服务器其实本身之前可能已经同步了一部分数据,这时再清空进行全量复制,开销就太大了。

因此Redis2.8之后,主服务器在与从服务器命令传播或者断开期间,都会将写操作命令写入一个repl back buffer中,repl back buffer是一个环形的缓冲区(会覆盖之前的数据)。从服务器与主服务器重新连接上后,从服务器发送一个psync指令(包含了主服务器的id和从服务器自己的复制偏移量offset),主服务器收到之后,向从服务器发送一个continue响应命令,告知从服务器接下来将以增量复制的方式进行数据同步。

主服务器会根据自己写到的位置master_repl_offset和从服务器同步到的位置slave_repl_offset之间的差距,判断从服务器要读取的数据是否还包含在repl_backlog_buffer
如果存在,则采用增量复制,将增量数据写入到replication buffer缓冲区中,replication buffer缓冲区中,就是在全量复制过程中,保存的即将要传播给从服务器的命令。
如果不存在,则采用全量复制

为了保证网络恢复后,尽量采用增量复制的方式进行数据恢复,我们会控制repl_backlog_buffer的
空间大小(默认1MB)大于second * write_size _per_second,second表示从服务器断线后重新连上主服务器平均耗时, write_size _per_second表示主服务器平均每秒钟产生的写操作的数量

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

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

相关文章

《IIS系列》IIS日志文件管理

我们在使用IIS部署网站的时候,随着时间推移,IIS 生成的日志文件可能会消耗大量磁盘空间。 日志可能会填满整个硬盘驱动器,为了缓解此问题,许多用户完全关闭日志记录,但关了记录又会导致出现问题无从排查,故…

C++手写NMS

文章目录 前言一、NMS是什么?二、代码展示三、代码实现思路总结 前言 目标检测模型推理后,一般都需要进行NMS操作进行多余框去重,板端部署一般不用opencv自带的NMS,所以记录下手写NMS的代码。 一、NMS是什么? 非极大…

ChatGPT Prompting开发实战(十二)

一、如何开发prompts实现个性化的对话方式 通过设置“system”和“user”等roles,可以实现个性化的对话方式,并且可以结合参数“temperature”的设定来差异化LLM的输出内容。在此基础上,通过构建一个餐馆订餐对话机器人来具体演示对话过程。…

Event Loop——事件循环

JS 是单线程的,也就是同一个时刻只能做一件事情。 那么思考:为什么浏览器可以同时执行异步任务呢?因为浏览器是多线程的。 当 JS 需要执行异步任务时,浏览器会另外启动一个线程去执行该任务。 也就是说,“JS 是单线程…

MATLAB算法实战应用案例精讲-【优化算法】Tiki-taka算法(TTA)(附MATLAB代码实现)

前言 Tiki-Taka战术体系曾经帮助西班牙国家队及巴塞罗那俱乐部取得了巨大的成功。然而,在2018年世界杯西班牙全场传球1100余次(职业比赛场均传球500次左右,西班牙场均800次左右)却被控球率只有20%的俄罗斯淘汰后,人们开始意识到大量机械的传球不但会让球迷觉得枯燥乏味,…

GEO生信数据挖掘(五)提取临床信息构建分组,分组数据可视化(绘制层次聚类图,绘制PCA图)

检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例 上节做了很多的基因数据清洗(离群值处理、低表达基因、归一化、log2处理)操作,本节介绍构建临床分组信息。 我们已经学习了提取表达矩阵的临床…

一键智能视频编辑与视频修复算法——ProPainter源码解析与部署

前言 视频编辑和修复确实是随着电子产品的普及变得越来越重要的技能。有许多视频编辑工具可以帮助人们轻松完成这些任务如:Adobe Premiere Pro,Final Cut Pro X,Davinci Resolve,HitFilm Express,它们都提供一些视频修…

基于SpringBoot的酒店客房管理系统

基于SpringBoot的酒店管理系统、酒店客房管理系统 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 管理员界面 用户界面 代码展示 <temp…

LCR 170. 交易逆序对的总数(C语言+分治递归)

1. 题目 在股票交易中&#xff0c;如果前一天的股价高于后一天的股价&#xff0c;则可以认为存在一个「交易逆序对」。请设计一个程序&#xff0c;输入一段时间内的股票交易记录 record&#xff0c;返回其中存在的「交易逆序对」总数。 2. 输入输出样例 示例1 输入&#xff1…

[架构之路-225]:计算机体系结构 - 分类方法大汇总

目录 一、分类方法汇总 二、指令流和数据流的关系分类 三、Flynn 分类&#xff1a;指令并行处理 四、根据指令集架构&#xff08;ISA&#xff09;分类 4.1 分类 4.2 开源的RISC-V与封闭的RISC指令集架构比较 4.3 RISC-V的演进路径 4.4 RISC-V与中国芯片自研 一、分类方…

macOS Sonoma 正式版系统已发布,要不要更新macos14系统

北京时间9月27日macOS Sonoma 正式版系统发布&#xff0c;为 Mac 带来一系列丰富新功能&#xff1a;优化小组件、升级视频会议、沉浸式游戏体验等&#xff0c;最新macos14值得更新吗&#xff1f;这里根据我一个月的试用beta版本体验来分享一下。 我使用的是M1芯片的MacBook air…

0基础学习VR全景平台篇 第101篇:企业版功能-子账号分配管理

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;企业版教程-子账号分配管理功能&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 子账号分配管理功能&#xff0c;主要用于企业版用户为自己服务的终…

python在字典中插入或增加一个字典

现在有字典dict_1 {}&#xff0c;字典dict_2 {name: Lihua, age: 19} &#xff0c;dict_3 {name: 小红, age: 18} 我们想将字典dict_2和字典dict_3加入到dict_1中&#xff0c;我们可以这么写 dict_2 {name: Lihua, age: 19} dict_3 {name: 小红, age: 18} dict_1 {}dict_…

Android导航抽屉

本文所有代码均位于https://github.com/MADMAX110/CatChat 之前使用过标签页布局可以让用户在应用中轻松地导航。 当只有为数不多地几个类别屏幕&#xff0c;而且它们都在应用层次结构地同一级上&#xff0c;标签页布局就很适用。 而抽屉导航可以实现更多选择&#xff0c;这是一…

【vue.js】路由使用与Node.js下载安装之环境配置

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1、路由 1.1什么是路由 1.2 案列实操 1.2.1 引入vue-router的js依赖 1.2.2 定义组…

常见的BOM对象

BOM是浏览器对象模型&#xff0c;提供了独立于内容与浏览器窗口进行交互的对象&#xff0c;其作用就是根浏览器做一些交互效果。 比如&#xff0c;如何进行页面的后退&#xff0c;前进&#xff0c;刷新&#xff0c;滚动条的滚动等等。 常见的BOM对象有 一. window BOM的核心…

如何离线安装和使用pymysql操作mysql数据库

一、应用背景 在企业内部网络要使用python操作mysql数据库。然而&#xff0c;python未自带访问MySQL数据库的函数库pymysql&#xff0c;需要另外安装。网上有很多安装pymysql都需要互联网支持。本文主要阐述如何离线安装pymysql,并简要介绍pymysql如何进行mysql操作。 pymysq…

nodejs+vue中国非物质文化遗产网站设计与实现elementui

前端页面&#xff1a; 导航栏借鉴下面的 1首页&#xff1a;带有一个全屏轮播图和其他的内容 2咨询页&#xff1a;有关中国非物质文化遗产的一些新闻咨询网站对于记录非遗这种无形的、动态的文化资源有着其他技术无可替代的优势。用户可以在该网站浏览、了解和学习非遗文化&…

Unity3d中Scene场景2D模式下放大后UI元素后不显示的问题

如题&#xff1a;UI在game视图显示没有问题&#xff0c; 在Play状态下&#xff0c;在Sence视图查看UI对象的时候进行放大操作&#xff0c;然后UI就不显示了或者显示不全&#xff0c;缩小就恢复正常。这让我在Play模式下预览UI状态很麻烦。相关问题描述较少。 初步判定为摄像机…

河北吉力宝以步力宝健康鞋引发的全新生活生态商

在当今瞬息万变的商业世界中&#xff0c;成功企业通常都是那些不拘泥于传统、勇于创新的先锋之选。河北吉力宝正是这样一家企业&#xff0c;通过打造一双步力宝健康鞋&#xff0c;他们以功能性智能科技穿戴品为核心&#xff0c;成功创造了一种结合智能康养与时尚潮流的独特产品…