Redis 主从复制

当我们服务器只有一台时,可能会出现单点问题,当这台服务器挂了,或者需求量超出主机所支持,那么我们的服务就会受到大的影响

为了解决问题 我们引入了分布式系统

在分布式系统中,在多服务器上部署Redis,存在以下几种方式

1.主从模式

2.主从+哨兵模式

3.集群模式

主从模式

我们将服务器区分为 主节点和从节点。

当主节点中存在的数据时,我们引入从节点,就会使主节点将数据拷贝到从节点中,后续主节点的数据修改,会及时同步拷贝到从节点中

当我们修改从节点的数据时 会不会主节点会改变?

不会,从节点顾名思义是主节点的小弟,Redis规定了从节点数据不允许直接修改,从节点只具有读取数据的能力

当引入这样的 模式后,主节点和从节点中的数据本身是一样的,所以访问主节点和从节点读取数据都是可以的,这样 引入了更多的 计算资源那么 所能支撑的并发量就大大提升了。

但其实我们不难发现 这样主从模式存在弊端,由于一山不容二虎,主节点不能创建多个,因此呢当主节点挂了,我们是无法进行写操作的,所以主从模式 更多的是针对于读操作的可用性提升,而对于写操作仍会受到限制

主从复制拓扑结构

1.一主一从结构

这种结构下只有主节点可以进行写操作,如果写请求 过多,就会给主节点带来压力

可以通过关闭主节点的AOF,只在从节点上开启AOF

但是这种设定有一个严重的缺陷 ,当 主节点挂掉之后,不能让它自动重启,(如果让它自动重启,此时没有 AOF文件,就会丢失数据,进一步的主从复制,就会把从节点上的数据也给删了)

改进方法,就是当主节点挂了之后,需要让主节点从从节点中获取到AOF的文件,在启动~

实际开发 中 读操作多于写操作

如上图所示 主节点连接四个从节点,但当主节点数据进行修改时**,随着从节点数的增加,数据从主节点同步到从节点就会 给主节点的 带宽造成压力**

2.树形结构

这样的结构呢 就会使主节点数据更新时,数据同步给从节点的网卡带宽就会减轻

但是 它的缺点就是数据同步的延迟要比上面的高

所以我们在 选取时要根据实际情况做出取舍

主从复制的基本流程

补充一下上图

offset (偏移量 )

主节点和从节点都会维护offset

主节点 会收到数据修改命令 命令转化为 字节数,offset就会累加这些 字节

从节点 offset表示 对主节点数据的同步量

当offset相同时表名 从节点已同步完 主节点数据修改

replication id 和 offset 共同描述了一个"数据集合 "

如果发现两个机器 两者一样,就可以认为两个Redis 机器上存储的数据 是完全一样的

全量复制/增量复制

全量复制的流程

全量复制的无硬盘模式

主节点生成的rdb的二进制数据 ,不是直接 保存到文件中,而是直接进行网络传输(省下一系列读硬盘和 写硬盘的操作

从节点 也可以忽略这个过程,直接把收到的数据 进行加载了

即使引入无硬盘模式 仍然整个操作是 比较耗时的 网络传输是 没法省 的相比于网络传输 来说,读写硬盘是小事

所以无硬盘模式能提升效率但效果不大

runid 与replid id

部分复制的流程

replid id 作为"数据来源"依据来看是否从节点是隶属于主节点的 如果 是 那么就可 进行部分复制,否则就进行全量复制

offset 代表数据复制进度

实时复制

当主节点与从节点数据同步好之后,主节点仍会源源不断 收到请求,此时 主节点就会与从节点建立长长的TCP连接

主节点将收到的 请求 同步给从节点 从而进行实时数据的修改

在保持主次 节点的连接中引入了一个机制 心跳包 机制

主节点 每隔一段时间(10s)就会向从节点发送一段ping命令,从节点接受到就会回复一个pong

从节点 每时每刻(1s)向主节点发送一个请求,汇报offset进度

主从复制总结

相关推荐
weixin_499771559 分钟前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
weixin_4521595512 分钟前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
策知道13 分钟前
依托政府工作报告准备省考【经验贴】
大数据·数据库·人工智能·搜索引擎·政务
Z...........21 分钟前
MYSQL进阶查询
数据库·mysql
今天_也很困43 分钟前
LeetCode热题100-560. 和为 K 的子数组
java·算法·leetcode
在繁华处1 小时前
线程进阶: 无人机自动防空平台开发教程V2
java·无人机
A懿轩A1 小时前
【Java 基础编程】Java 变量与八大基本数据类型详解:从声明到类型转换,零基础也能看懂
java·开发语言·python
m0_740043731 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务
Tansmjs1 小时前
使用Python自动收发邮件
jvm·数据库·python
m0_561359671 小时前
用Python监控系统日志并发送警报
jvm·数据库·python