主从复制是怎么实现的?

单机模式的缺点

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.hqwc.cn/news/120830.html

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

相关文章

【教程】Ubuntu自动查看有哪些用户名与密码相同的账户,并统一修改密码

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 目录 背景说明 开始操作 修改密码 背景说明 有些用户为了图方便或者初始创建用户默认设置等原因,会将密码设置为与用户名相同,但这就使得非常不安全。甚至如果该用户具有sudo权限&#…

云原生Kubernetes:Pod控制器

目录 一、理论 1.Pod控制器 2.Deployment 控制器 3.SatefulSet 控制器 4.DaemonSet 控制器 5.Job 控制器 6.CronJob 控制器 二、实验 1.Deployment 控制器 2.SatefulSet 控制器 3.DaemonSet 控制器 4.Job 控制器 5.CronJob 控制器 三、问题 1. showmount -e 报错…

HTML5福利篇--使用Canvas画图

目录 一.Canvas元素 1.Canvas元素定义 2.使用JavaScript获取页面中的Canvas对象 二.绘制图形 1.绘制直线 2.绘制矩形 (1)rect() (2)strokeRect() (3)fillRect()和clearRect()函数 3.绘制圆弧 4.…

layui 树状控件tree优化

先上效果图: 我选的组件是这个: 动态渲染完后,分别在窗体加载完成,节点点击事件分别加入js: //侧边栏图标替换//layui-icon-subtraction$(function () {$(".layui-icon-file").addClass("backs&quo…

3 OpenCV两张图片实现稀疏点云的生成

前文: 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵RANSAC原理与实践 1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式…

2.物联网射频识别,RFID通信原理,RFID读写器与标签无线交互方式、数据反馈方式,RFID调制与解调、编码方式,不同RFID标签与读写器

一。RFID无线识别的原理 1.RFID系统无线通信基本原理 如下图所示,左边是读写器(刷卡器),右边是标签(卡),中间通过无线通信方式。 标签:(卡) 读写器&#xff…

Arthas学习(1)

1.Arthas作用 Arthas是Alibaba开源的Java诊断工具。 作用:当遇到以下类似问题时,可以帮助我们解决: 1.这个类从哪个jar包加载的?为什么会报各种类相关的Exception? 2.我改的代码为什么没有执行到?难道是我没提交&am…

微表情识别API + c++并发服务器系统

微表情识别API c并发服务器系统 该项目只开源c并发服务器程序,模型API部分不开源 地址:https://github.com/lin-lai/-API- 更新功能 4.1版本 改用epoll实现IO多路复用并发服务器 项目介绍 本项目用于检测并识别视频中人脸的微表情 目标任务: 用户上…

R | R及Rstudio安装、运行环境变量及RStudio配置

R | R及Rstudio安装、运行环境变量及RStudio配置 一、介绍1.1 R介绍1.2 RStudio介绍 二、R安装2.1 演示电脑系统2.2 R下载2.3 R安装2.4 R语言运行环境设置(环境变量)2.4.1 目的2.4.2 R-CMD测试2.4.3 设置环境变量 2.5 R安装测试 三、RStudio安装3.1 RStu…

brew 安装MySQL 5.7

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

窗口类介绍

目录 Qwidget QDialog QMessageBox QFileDialog QFontDialog QColorDialog QInputDialog QProgressDialog QMainWindow 菜单栏 工具栏 状态栏 停靠窗口 窗口布局 Qwidget 常用的一些函数包括: 设置窗口的大小,尺寸,得到对应的…

【中秋节快乐】Matplotlib:3d绘图合集

目录 一、环境介绍 二、Matplotlib绘图(3d) 0. 设置中文字体 1. 3D线框图(3D Wireframe Plot) 2. 3D散点图(3D Scatter Plot) 3. 3D条形图(3D Bar Plot) 4. 3D曲面图&#xff0…