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进度

主从复制总结

相关推荐
陌上丨2 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
曹牧2 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
AI_56782 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw2 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30733 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道3 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
爬山算法3 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7253 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎3 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄3 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea