当前位置:网站首页>Redis与分布式:主从复制
Redis与分布式:主从复制
2022-07-31 14:05:00 【Leon_Jinhai_Sun】
Redis与分布式
在SpringBoot阶段,我们学习了Redis,它是一个基于内存的高性能数据库,我们当时已经学习了包括基本操作、常用数据类型、持久化、事务和锁机制以及使用Java与Redis进行交互等,利用它的高性能,我们还使用它来做Mybatis的二级缓存、以及Token的持久化存储。而这一部分,我们将继续深入,探讨Redis在分布式开发场景下的应用。
主从复制
在分布式场景下,我们可以考虑让Redis实现主从模式:
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave),数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。
这样的好处肯定是显而易见的:
- 实现了读写分离,提高了性能。
- 在写少读多的场景下,我们甚至可以安排很多个从节点,这样就能够大幅度的分担压力,并且就算挂掉一个,其他的也能使用。
那么我们现在就来尝试实现一下,这里我们还是在Windows下进行测试,打开Redis文件夹,我们要开启两个Redis服务器,修改配置文件redis.windows.conf
:
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6001
一个服务器的端口设定为6001,复制一份,另一个的端口为6002,接着我们指定配置文件进行启动,打开cmd:
现在我们的两个服务器就启动成功了,接着我们可以使用命令查看当前服务器的主从状态,我们打开客户端:
输入info replication
命令来查看当前的主从状态,可以看到默认的角色为:master,也就是说所有的服务器在启动之后都是主节点的状态。那么现在我们希望让6002作为从节点,通过一个命令即可:
可以看到,在输入replicaof 127.0.0.1 6001
命令后,就会将6001服务器作为主节点,而当前节点作为6001的从节点,并且角色也会变成:slave,接着我们来看看6001的情况:
可以看到从节点信息中已经出现了6002服务器,也就是说现在我们的6001和6002就形成了主从关系(还包含一个偏移量,这个偏移量反应的是从节点的同步情况)
主服务器和从服务器都会维护一个复制偏移量,主服务器每次向从服务器中传递 N 个字节的时候,会将自己的复制偏移量加上 N。从服务器中收到主服务器的 N 个字节的数据,就会将自己额复制偏移量加上 N,通过主从服务器的偏移量对比可以很清楚的知道主从服务器的数据是否处于一致,如果不一致就需要进行增量同步了。
那么我们现在可以来测试一下,在主节点新增数据,看看是否会同步到从节点:
可以看到,我们在6001服务器插入的a
,可以在从节点6002读取到,那么,从节点新增的数据在主节点能得到吗?我们来测试一下:
可以看到,从节点压根就没办法进行数据插入,节点的模式为只读模式。那么如果我们现在不想让6002作为6001的从节点了呢?
可以看到,通过输入replicaof no one
,即可变回Master角色。接着我们再来启动一台6003服务器,流程是一样的:
可以看到,在连接之后,也会直接同步主节点的数据,因此无论是已经处于从节点状态还是刚刚启动完成的服务器,都会从主节点同步数据,实际上整个同步流程为:
- 从节点执行replicaof ip port命令后,从节点会保存主节点相关的地址信息。
- 从节点通过每秒运行的定时任务发现配置了新的主节点后,会尝试与该节点建立网络连接,专门用于接收主节点发送的复制命令。
- 连接成功后,第一次会将主节点的数据进行全量复制,之后采用增量复制,持续将新来的写命令同步给从节点。
当我们的主节点关闭后,从节点依然可以读取数据:
但是从节点会疯狂报错:
当然每次都去敲个命令配置主从太麻烦了,我们可以直接在配置文件中配置,添加这样行即可:
replicaof 127.0.0.1 6001
这里我们给6002和6003服务器都配置一下,现在我们重启三个服务器。
当然,除了作为Master节点的从节点外,我们还可以将其作为从节点的从节点,比如现在我们让6003作为6002的从节点:
也就是说,现在差不多是这样的的一个情况:
采用这种方式,优点肯定是显而易见的,但是缺点也很明显,整个传播链路一旦中途出现问题,那么就会导致后面的从节点无法及时同步。
边栏推荐
- 浏览器被hao360劫持解决办法
- Shell脚本经典案例:探测批量主机是否存活
- 最新完整代码:使用word2vec预训练模型进行增量训练(两种保存方式对应的两种加载方式)适用gensim各种版本
- For enterprises in the digital age, data governance is difficult, but it should be done
- 深度剖析 Apache EventMesh 云原生分布式事件驱动架构
- 纸质说明书秒变3D动画,斯坦福大学吴佳俊最新研究,入选ECCV 2022
- The recently popular domestic interface artifact Apipost experience
- Shell脚本经典案例:文件的备份
- 对数字化时代的企业来说,数据治理难做,但应该去做
- MySQL [aggregate function]
猜你喜欢
MySQL【聚合函数】
IDEA连接MySQL数据库并使用数据
Open Inventor 10.12 Major Improvements - Harmony Edition
VU 非父子组件通信
Miller_Rabin Miller Rabin probability sieve [template]
Solution for browser hijacking by hao360
以后面试官问你 为啥不建议使用Select *,请你大声回答他!
Reasons and solutions for Invalid bound statement (not found)
The use of C# control CheckBox
纸质说明书秒变3D动画,斯坦福大学吴佳俊最新研究,入选ECCV 2022
随机推荐
浏览器被hao360劫持解决办法
技能大赛训练题:交换机虚拟化练习
jvm 一之 类加载器
Save and load numpy matrices and vectors, and use the saved vectors for similarity calculation
「面经分享」西北大学 | 字节 生活服务 | 一面二面三面 HR 面
Shell脚本经典案例:探测批量主机是否存活
232层3D闪存芯片来了:单片容量2TB,传输速度提高50%
最近很火的国产接口神器Apipost体验
最新完整代码:使用word2vec预训练模型进行增量训练(两种保存方式对应的两种加载方式)适用gensim各种版本
Detailed guide to compare two tables using natural full join in SQL
uniapp微信小程序引用标准版交易组件
五个维度着手MySQL的优化
Uniapp WeChat small application reference standard components
VU 非父子组件通信
C#高级--委托
技能大赛训练题:域用户和组织单元的创建
LeetCode·每日一题·1161.最大层内元素和·层次遍历
The recently popular domestic interface artifact Apipost experience
DELL SC compellent 康贝存储系统怎么抓取配置信息
Shell脚本经典案例:文件的备份