redis高可用之主从复制

news2024/12/24 22:07:42

一、前置知识

  1. 分布式系统理论基石CAP:consistent-一致性,availability-可用性,partition tolerance-分区容忍性。
  2. 网络分区:网络断开也叫网络分区,当网络分区发生时,一致性会被破坏,除非牺牲可用性,等数据变一致之后再提供服务。所以一致性和可用性只能二选一
  3. 高可用需要满足的三个条件:1)数据备份在不同节点上,防止数据丢失 2)故障自动转移,正在服务的节点发生故障时,可以自动切换到备用节点 3)在线扩容(缩容),可以根据需要动态增加或者减少服务实例

二、什么是高可用?

高可用需要满足以下两个条件:
1、数据尽量不丢失。2、服务尽可能提供。
数据不丢失,有AOF和RDB帮助持久化数据,保证数据尽量不丢失;主从复制就是增加数据副本,即使一个实例宕机,其他实例也能提供服务。AOF和RDB的介绍见数据持久化之AOF和RDB(后续补充完善),本文主要谈谈什么是主从复制。

三、主从复制

1、概念

主从复制简单来说就是将主节点的数据复制到其他所有从节点上的过程。redis的主从复制是单向的,只能从主节点复制到从节点,一个主节点可以有多个从节点,一个从节点只能有一个主节点,因此只有主节点能够提供写服务,其他节点都是提供读服务的。

2、如何保证数据的一致性?

主从节点之间的读写操作是分离的,主节点可以提供读写服务,而从节点只提供读服务,这样可以保证所有副本数据是一致的,但是redis只保证最终一致性。redis的数据复制是异步的,主从节点之间异步确认需要处理的数据量,所以无法保证实时的一致性,这样做的好处是时延低、性能高、保证redis的可用性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tl5OyZ5T-1676103720125)(http://ttc-tal.oss-cn-beijing.aliyuncs.com/1630897184/redis%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB.png)]

四、同步方式

主从同步的方式根据不同阶段、不同情况也会不同。大致分为三种:
a. 第一次主从同步,全量复制;
b. 主从正常运行期间的同步,增量复制;
c. 主从库间网络断开重连同步,视情况两种方式结合

1、什么是全量同步?

在主库中执行一次bgsave命令,将当前内存中的数据全部快照到磁盘文件中,生成一个rdb文件,然后再把rdb文件的内容传送到从节点。从节点接收后,先清空内存,然后载入rdb文件,从节点更新到跟主节点执行bgsave命令前一致的状态,完成后再进行增量同步。每新增加一个从节点,就必须要先进行一次快照同步,然后再进行增量同步。

2、第一次全量复制是怎样实现的?

第一次全量复制分为三个步骤:
a. 主从建立连接
b. 主库同步数据到从库
c. 发送新增的写命令到从库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ivfFjil-1676103720127)(http://ttc-tal.oss-cn-beijing.aliyuncs.com/1630897149/redis%E5%85%A8%E9%87%8F%E5%90%8C%E6%AD%A5.png)]

a.主从建立连接

主从连接是由从库发起建立的,从库发送replicaof <master_ip> <master_port>命令通知与其连接的主库,并发送psync命令告知同步开始,主库回复确认后,就可以正式开始同步数据了。

b.主库同步数据到从库

主库会将当前redis状态生成为一个RDB文件,发送给从库,并且为每一个从库在内存中申请一块replication buffer,用来记录发送RDB之后新收到的写命令。从库在收到RDB文件之后,会清空内存,并将RDB文件的内容加载的内存中。

c.发送新增的写命令到从库

当从库将RDB文件加载完成后,主库会将replication buffer中的数据发送给从库,从库执行后会将数据跟主库同步到一致

3、什么是replication buffer?

replication buffer是在主节点上创建的一个缓冲区,主节点会为每一个从节点创建一个,用来存放从master生成rdb文件以后一直到slave将rdb文件加载到内存中,这期间所有的写数据。实际上无论是客户端还是slave,只要跟master通信,master都会为其单独申请一个内存buffer,用来进行数据交互,只不过跟slave进行数据同步的这个buffer专门用来存储写命令,所以通常称之为replication buffer。

4、什么是增量同步?

redis2.8以后,网络断开重连后,master和slave之间的数据同步,是通过增量同步实现的,即master通过发送网络断开期间执行的写指令到slave。主节点将修改自身状态的指令缓存到repl_backlog_buffer中,repl_backlog_buffer中会记录所有的写操作,但是由于内存限制,repl_backlog_buffer被设计成环形队列,如果存满了,最后面来的写指令会将最前面的写指令覆盖掉。那从节点就无法通过指令流来同步,只能通过全量同步来实现同步了。主节点用master_repl_offset来标记写操作执行到环形队列的位置,从节点用slave_repl_offset来标记同步到环形队列的位置。网络正常时master_repl_offset和slave_repl_offset一致,当网络断开后,master_repl_offset会持续增加,当网络连接重新恢复,从节点会将runID和slave_repl_offset发送给主节点,主节点只需将这两个offset之间的数据同步到从节点即可。
repl_backlog_buffer 2.png

5、主从正常运行期间的同步,增量复制

主从实现全量同步以后,会一直维持着这个连接,主库会持续不断地将接收到的写命令发送给从库,这个过程也叫做基于长连接的命令传播,可以减少连接建立和断开的开销。

6、主从库间网络断开重连同步,视情况两种方式结合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XARkkQFx-1676103720127)(http://ttc-tal.oss-cn-beijing.aliyuncs.com/1630920231/%E5%A2%9E%E9%87%8F%E5%85%A8%E9%87%8F%E5%90%8C%E6%AD%A5%E5%88%A4%E6%96%AD.png)]
网络断开重连时,从库会通过psync命令,将replicationID(runID)和slave_repl_offset发送给主库,主节点根据接受到的psync命令和当前服务器状态,决定执行全量复制还是部分复制,replicationID 与从节点发送的 replicationID 相同时,且从节点发送的 slave_repl_offset之后的数据在 repl_backlog_buffer缓冲区中都存在,将进行增量复制,从节点等待主节点发送其缺少的数据即可,当replicationID 与从节点发送的 replicationID 不同,或者从节点发送的 slave_repl_offset 之后的数据已不在主节点的 repl_backlog_buffer缓冲区中,则回复从节点 FULLRESYNC ,表示要进行全量复制,其中 replicationID 表示主节点当前的 replicationID,offset 表示主节点当前的 offset,从节点保存这两个值,以备使用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-acgJ4oAY-1676103720128)(http://ttc-tal.oss-cn-beijing.aliyuncs.com/1630915519/redis%E5%A2%9E%E9%87%8F%E5%A4%8D%E5%88%B6.png)]

五、主从如何知道网络是否断开呢?

主从之间通过心跳来检测。主每隔一段时间向从发送PING命令,从默认每秒一次发送replconf ack ,这样起到的作用是检测主从服务器的网络连接状态,辅助实现 min-slaves选项,检测命令丢失,从节点发送了自身的 slave_replication_offset,主节点会用自己的master_replication_offset对比,如果从节点数据缺失,主节点会从repl_backlog_buffer缓冲区中找到并推送缺失的数据。offset和repl_backlog_buffer缓冲区,不仅可以用于部分复制,也可以用于处理命令丢失等情形;区别在于前者是在断线重连后进行的,而后者是在主从节点没有断线的情况下进行的

六、replication buffer和repl_backlog_buffer的区别和联系

replication buffer是master和每个客户端(slave)进行数据交换的唯一通道,采用TCP长连接的方式,传递写命令。master每写一个命令,都会把命令同时写入这两个缓冲区,replication buffer在收到写命令后会立即将命令发送给客户端,而repl_backlog_buffer则会保存一段时间,直到后面的写命令将其覆盖。在主从同步期间,如果主从连接断开,replication buffer中的命令就会写入失败,当从节点重新发送psync命令进行重连时,会把自己的offset传递给主节点,主节点根据自己的offset和接收到的offset,在环形缓冲区中查找到增量命令,就会把这些增量命令传到replication buffer,然后传递给客户端(slave),这样就实现了一次增量同步。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OO0UL8Nf-1676103720128)(http://ttc-tal.oss-cn-beijing.aliyuncs.com/1631759847/%E4%B8%A4%E4%B8%AA%E7%BC%93%E5%AD%98%E5%8C%BA%E5%B7%AE%E5%88%AB.png)]

七、扩展知识

1、无盘复制

主服务器直接通过套接字将快照内容发送到从节点,生成快照是一个遍历的过程,主节点一边遍历内存,一边将序列化的内容发给从节点。从节点将接收到的内容先存在磁盘文件中,再一次性加载。正常情况下,全量重同步需要在磁盘上创建一个RDB文件,然后从磁盘中加载进内存,slave以此进行数据同步。如果磁盘性能很差,则子进程直接发送RDB文件给slave,无需使用磁盘。

2、wait

redis的复制是异步的,但是如果使用wait命令,可以让异步复制变成同步复制,确保系统的强一致性,但这样也就会失去可用性。

wait 1 0 // 第一个参数是从库数量,第二个是等待时间ms
//表示等待wait指令之前所有写操作都同步到从库,然后再执行

欢迎关注 公众号 晴天码字 将输出更多精彩内容
在这里插入图片描述

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

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

相关文章

磁盘管理(8)

磁盘管理 0 引言 速度是影响文件系统性能的主要因素&#xff0c;因此提高磁盘I/O速度的主要途径&#xff1a;选择性能好的磁盘、采用好的磁盘调度算法和设置磁盘高速缓冲区。 1 磁盘的性能 影响磁盘性能的因素&#xff1a; 数据的结构磁盘的类型磁盘访问时间 2 磁盘的结构…

Vscode使用ChatGPT插件

文章目录1.下载vscode插件2.登录ChatGPT&#xff0c;生成APIKeys3.测试4.使用5.其他功能1.下载vscode插件 2.登录ChatGPT&#xff0c;生成APIKeys 地址&#xff1a;https://beta.openai.com/account/api-keys 3.测试 4.使用 &#xff08;1&#xff09;请求简单的模版代码 …

Pycharm 2020 社区版常用快捷键

版本确实有点旧不过快捷键应该不会怎么 变记录一下。 Ctrl Space 基本的代码完成&#xff08;类、方法、属性&#xff09; Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息&#xff08;在方法中调用参数&#xff09; Ctrl Q 快速查看文档…

Golang 结构体笔记

结构体是一个自定义的数据类型&#xff0c;是值类型声明结构体type 结构体名称 struct {field_1 typefield_2 type}注意事项字段声明语法同变量&#xff0c;示例&#xff1a;字段名 字段类型字段的类型可以为&#xff1a;基本类型、数组或引用类型创建一个结构体变量后&#xf…

谷粒商城--品牌管理详情

目录 1.简单上传测试 2.Aliyun Spring Boot OSS 3.模块mall-third-service 4.前端 5.数据校验 6.JSR303数据校验 7.分组校验功能 8.自定义校验功能 9.完善代码 1.简单上传测试 OSS是对象存储服务&#xff0c;有什么用呢&#xff1f;把图片存储到云服务器上能让所有人…

杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法

主要介绍了JavaScript定时器设置、使用与倒计时案例,详细分析了javascript定时器的设置、取消、循环调用并附带一个倒计时功能应用案例,需要的朋友可以参考下&#xff1a; 运行效果图&#xff1a; 配套视频课程 基于JavaScript的红绿灯设计演示代码如下: <!DOCTYPE html>…

《Keras深度学习:入门、实战与进阶》之印第安人糖尿病诊断

本文摘自《Keras深度学习&#xff1a;入门、实战与进阶》。 1、数据理解 本节使用Pima Indians糖尿病发病情况数据集。该数据集最初来自国家糖尿病/消化/肾脏疾病研究所。数据集的目标是基于数据集中包含的某些诊断测量来诊断性的预测患者是否患有糖尿病。数据集由多个医学预…

python+django大学生成绩综合考评系统pycharm项目

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm 通常 一个Django model 对应一张数据表&#xff0c;model是以类的形式表现的 实现了ORM 对象…

Unity SRP自定义渲染管线学习2.2: 合批(Batching) SRP Batcher

接下来我们要来学习下自定义渲染管线中的合批&#xff0c;这一节主要学习SRP Batcher 每一次的Draw Call都需要CPU和GPU之间的通信&#xff0c;如果有大量的数据需要从CPU发送到GPU中&#xff0c;那GPU就可能因为等待数据而浪费时间&#xff0c;而CPU会因为忙于发送数据导致无…

第五章:Windows server加域

加入AD域&#xff1a;教学视频&#xff1a;https://www.bilibili.com/video/BV1xM4y1D7oL/?spm_id_from333.999.0.0首先我们选择一个干净的&#xff0c;也就是新建的没动过的Windows server虚拟机。我们将DNS改成域的ip地址&#xff0c;还要保证它们之间能ping的通&#xff0c…

详细解读ChatGPT:如何调用ChatGPT的API接口到官方例子的说明以及GitHub上的源码应用

文章目录1. 解读ChatGPT1.1 词语解释1.2 功能解读2. GitHub上ChatGPT的应用源码3. 调用ChatGPT的API4. 官方例子说明5. 集成ChatGPT自ChatGPT出来到如今&#xff0c;始终走在火热的道路上&#xff0c;如今日活用户破亿&#xff0c;他为何有如此大的魅力&#xff0c;深受广大用户…

opencv保存图片

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

SIGIR22:User-controllable Recommendation Against Filter Bubbles

User-controllable Recommendation Against Filter Bubbles 摘要 推荐系统经常面临过滤气泡的问题&#xff1a;过度推荐基于用户特征以及历史交互的同质化项目。过滤气泡将会随着反馈循环增长&#xff0c;缩小了用户兴趣。现有的工作通常通过纳入诸如多样性和公平性等准确性之…

AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)

目录 4806. 首字母大写 题目描述&#xff1a; 实现代码&#xff1a; 4807. 找数字 题目描述&#xff1a; 实现代码&#xff1a; 回溯&#xff08;超时&#xff09;&#xff1a; 原理思路&#xff1a; 贪心&#xff1a; 原理思路&#xff1a; 4808. 构造字符串 问题…

53. 最大子数组和

文章目录题目描述暴力法动态规划法分治法参考文献题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&…

JavaScript中数组常用的方法

文章目录前言常用数组方法1、 join( )2、push&#xff08;&#xff09;与 pop&#xff08;&#xff09;3、shift&#xff08;&#xff09;与 unshift&#xff08;&#xff09;4、sort&#xff08;&#xff09;5、reverse&#xff08;&#xff09;6、slice&#xff08;&#xff…

代码随想录算法训练营第二十七天 | 93.复原IP地址,78.子集,90.子集II

一、参考资料复原IP地址题目链接/文章讲解&#xff1a;https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1XP4y1U73i/子集题目链接/文章讲解&#xff1a;https://programmercarl.com/0078.…

乐观锁、雪花算法、MyBatis-Plus多数据源

乐观锁、雪花算法、MyBatis-Plus多数据源e>雪花算法2、乐观锁a>场景b>乐观锁与悲观锁c>模拟修改冲突d>乐观锁实现流程e>Mybatis-Plus实现乐观锁七、通用枚举a>数据库表添加字段sexb>创建通用枚举类型c>配置扫描通用枚举d>测试九、多数据源1、创建…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;二级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 一个骰子&#xff0c;从3个不同角度看过去的点数如图所示&#xff0c;请问5的对面是什么点数&#xff1f;&#xff08; &#xff09; …

数据库(单表查询)

素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar(10) NOT NUL…