当前位置:网站首页>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的从节点:
也就是说,现在差不多是这样的的一个情况:
采用这种方式,优点肯定是显而易见的,但是缺点也很明显,整个传播链路一旦中途出现问题,那么就会导致后面的从节点无法及时同步。
边栏推荐
猜你喜欢
LeetCode·每日一题·1161.最大层内元素和·层次遍历
CLion用于STM32开发
Node version switching management using NVM
使用CompletableFuture进行异步处理业务
动作捕捉系统用于柔性机械臂的末端定位控制
Small test knife: Go reflection helped me convert Excel to Struct
ECCV 2022 | Robotic Interaction Perception and Object Manipulation
csdn发文助手问题
C# using ComboBox control
The Selenium IDE of the Selenium test automation
随机推荐
Tortoise speed by "template"
搭建私有的的Nuget包服务器教程
尚硅谷-JVM-内存和垃圾回收篇(P1~P203)
线程池的使用二
The pre-sale of the new Hyundai Paristi is open, and safety and comfort are not lost
1-hour live broadcast recruitment order: industry leaders share dry goods, and enterprise registration is open丨qubit · point of view
The recently popular domestic interface artifact Apipost experience
mysql8, starttime的下一个值作为endtime的上一个值?
Comparison of Optical Motion Capture and UWB Positioning Technology in Multi-agent Cooperative Control Research
leetcode:2032. Values that appear in at least two arrays
Shell脚本经典案例:探测批量主机是否存活
49.【拷贝构造函数与重载】
MySQL 23 classic interviews hang the interviewer
ML、DL、CV常见的问题整理
组合系列--有排列就有组合
Why do we need to sub-library and sub-table?
In the future, the interviewer asks you why it is not recommended to use Select *, please answer him out loud!
Buffer 与 拥塞控制
DELL SC compellent 康贝存储系统怎么抓取配置信息
已解决(pymysqL连接数据库报错)pymysqL.err.ProgrammingError: (1146,“Table ‘test.students‘ doesn‘t exist“)